Отображать только 45 градусов на изображении - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу обнаружить линии на изображении, которое находится под углом 45 градусов только относительно начала координат .Я должен сделать это только с 3x3 свертки.Я решил это так, что все линии на 45 градусов удаляются, а все остальное остается (в обратном порядке, что я хочу).Спасибо за любую помощь в достижении моей конечной цели.

import cv2
import numpy as np
import matplotlib.pyplot as plt


img = cv2.imread('Lines.png')

plt.imshow(img, cmap='gray')
plt.show()

kernel = np.array([[0, -1, 0],
                   [1, 0, 1],
                   [0, -1, 0]])

dst = cv2.filter2D(img, -1, kernel)
cv2.imwrite("filtered.png", dst)

Это изображение до свертки:

enter image description here

Это изображение после свертки:

This is what is happening right now

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

По коду, который вы указали в вопросе, мы получили строки, за исключением тех, которые мы хотим получить.Таким образом, мы можем взять это и dilate, чтобы заполнить строки.

img = cv2.imread('lines.png')
kernel = np.array([[0, -1, 0],
                   [1, 0, 1],
                   [0, -1, 0]])

dst = cv2.filter2D(img, -1, kernel)
kernel = np.ones((5, 5), np.uint8)
dilated = cv2.dilate(dst, kernel, iterations = 1)

dilated lines

Затем нам нужно удалить точки над линиями под углом 45 градусов, поэтому мы используем morphological opening для этого и пороговое значение для изображенияпреобразовать все строки в значения пикселей = 255.

kernel = np.ones((7, 7), np.uint8)
opening = cv2.morphologyEx(dilated, cv2.MORPH_OPEN, kernel)
_,thresh = cv2.threshold(opening,10,255,cv2.THRESH_BINARY)

filled and thresholded

Затем с использованием cv2.bitwise_and исходного изображения и cv2.bitwise_not полученного порогамы получаем наши линии.

res = cv2.bitwise_and(img, cv2.bitwise_not(thresh))

intermediate result

Мы получаем линии, но нам нужно удалить круг в середине.Для этого мы используем cv2.erode на исходном изображении, чтобы получить только средний круг, пороговое значение, а затем снова используем cv2.bitwise_and и cv2.bitwise_not, чтобы удалить его из рез.

kernel = np.ones((7, 7), np.uint8)
other = cv2.erode(img, kernel, iterations = 1)
_,thresh = cv2.threshold(other,10,255,cv2.THRESH_BINARY)
result = cv2.bitwise_and(res, cv2.bitwise_not(thresh))
cv2.imshow("Image", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

Final result

0 голосов
/ 16 февраля 2019

Фильтр, который я использовал:

kernel = np.array([[0, -25, 1],
                   [-25, 5, -25],
                   [1, -25, 0]])

, и результат был:

enter image description here

Это не было идеально,но надеюсь, что это поможет.

...