По коду, который вы указали в вопросе, мы получили строки, за исключением тех, которые мы хотим получить.Таким образом, мы можем взять это и 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](https://i.stack.imgur.com/EsSQj.png)
Затем нам нужно удалить точки над линиями под углом 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](https://i.stack.imgur.com/p8PD6.png)
Затем с использованием cv2.bitwise_and
исходного изображения и cv2.bitwise_not
полученного порогамы получаем наши линии.
res = cv2.bitwise_and(img, cv2.bitwise_not(thresh))
![intermediate result](https://i.stack.imgur.com/EeQza.png)
Мы получаем линии, но нам нужно удалить круг в середине.Для этого мы используем 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](https://i.stack.imgur.com/cXoFr.png)