На следующем микроскопическом изображении я извлек сетку из горизонтальных белых линий, используя морфологические операторы в OpenCV. Я не смог полностью избавиться от шума, поэтому между ними есть белые линии. Линии сетки должны быть параллельны оси x. Во время процесса считывания под микроскопом нельзя гарантировать идеального параллелизма. В этом случае линии немного сдвигаются вверх слева направо. Как я могу перестроить линии по оси x, чтобы они были параллельны нижнему и верхнему краям изображения с помощью OpenCV или любого другого пакета Python?

Я относительно новичок в OpenCV, поэтому, если бы кто-нибудь мог дать мне подсказку, какие операции или функции были бы полезны для решения этой проблемы, я был бы благодарен.

Благодарность!

White lines on a black grid

1
Sebastian 25 Май 2021 в 11:07
1
Вы хотите сделать выравнивание до или после мофологической операции? Можете ли вы загрузить предварительно обработанное изображение?
 – 
TzviLederer
25 Май 2021 в 12:20
1
почему выравнивание? это достаточно близко, чтобы установить порядок сетки. извлеките отдельные области интереса относительно каждой полосы маркеров.
 – 
Christoph Rackwitz
25 Май 2021 в 12:48
Ты прав. Для этого образца этот подход также будет работать и фактически был моим первоначальным подходом. Но это изображение - только одна область образца. В других областях гораздо больше зашумленных линий, чем в этой, поэтому сетка теряется. Итак, я подумал, что найду область, где линии сетки четко идентифицируются, как эта, извлеку матрицу вращения, а затем поверну все изображение. Если линии сетки параллельны оси x, их легко отследить, даже если они не видны в шуме.
 – 
Sebastian
25 Май 2021 в 17:21

1 ответ

Лучший ответ

Вы можете подгонять линии, получить средний угол и повернуть изображение.

Предлагаемое решение состоит из следующих этапов:

  • Порог (преобразование в двоичную форму) изображения.
  • Примените закрывающую морфологическую операцию для соединения линий.
  • Найти контуры.
  • Итерируйте контуры и подгоняйте линию для каждого контура.
    Вычислите угол каждой линии и составьте список углов.
  • Вычислите средний угол углов, «близких к среднему углу».
  • Поверните изображение на средний угол.

Вот код:

import cv2
import numpy as np
import math

img = cv2.imread("input.png", cv2.IMREAD_GRAYSCALE)  # Read input image as grayscale.

threshed = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)[1]  # threshold (binarize) the image

# Apply closing for connecting the lines
threshed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, np.ones((1, 10)))

# Find contours
contours = cv2.findContours(threshed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2]  # [-2] indexing takes return value before last (due to OpenCV compatibility issues).

img2 = cv2.cvtColor(threshed, cv2.COLOR_GRAY2BGR)  # BGR image - used for drawing

angles = []  # List of line angles.

# Iterate the contours and fit a line for each contour
# Remark: consider ignoring small contours
for c in contours:
    vx, vy, cx, cy = cv2.fitLine(c, cv2.DIST_L2, 0, 0.01, 0.01) # Fit line
    w = img.shape[1]
    cv2.line(img2, (int(cx-vx*w), int(cy-vy*w)), (int(cx+vx*w), int(cy+vy*w)), (0, 255, 0))  # Draw the line for testing
    ang = (180/np.pi)*math.atan2(vy, vx) # Compute the angle of the line.
    angles.append(ang)

angles = np.array(angles)  # Convert angles to NumPy array.

# Remove outliers and 
lo_val, up_val = np.percentile(angles, (40, 60))  # Get the value of lower and upper 40% of all angles (mean of only 10 angles)
mean_ang = np.mean(angles[np.where((angles >= lo_val) & (angles <= up_val))])

print(f'mean_ang = {mean_ang}')  # -0.2424

M = cv2.getRotationMatrix2D((img.shape[1]//2, img.shape[0]//2), mean_ang, 1)  # Get transformation matrix - for rotating by mean_ang

img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]), cv2.INTER_CUBIC) # Rotate the image

# Display results
cv2.imshow('img2', img2)
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

Результат:
img2 (для тестирования):
введите описание изображения здесь

img (после поворота):
введите описание изображения здесь


Заметка:

  • Код - это просто пример - я не ожидаю, что он решит все ваши микроскопические изображения.
2
Rotem 25 Май 2021 в 12:50