Обнаружение пунктирных (ломаных) линий только на изображении с помощью OpenCV - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь освоить методы обнаружения особенностей изображения.

Мне удалось обнаружить горизонтальную линию (непрерывную / непрерывную), однако у меня возникают проблемы с обнаружением всех пунктирных / прерывистых линий на изображении.

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

My test Image

До сих пор я использовал следующий код, который обнаружил только одну пунктирную линию .

import cv2
import numpy as np

img=cv2.imread('test.jpg')
img=functions.image_resize(img,1000,1000) #function from a script to resize image to fit my screen
imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgEdges=cv2.Canny(imgGray,100,250)
imgLines= cv2.HoughLinesP(imgEdges,2,np.pi/100,60, minLineLength = 10, maxLineGap = 100)
for x1,y1,x2,y2 in imgLines[0]:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow('Final Image with dotted Lines detected',img) 

Мое выходное изображение ниже. Как видите, мне удалось обнаружить только последнюю пунктирную линию. Я поиграл с параметрами rho, theta, min / max line, но не повезло.

Любой совет очень ценится:)

My Output Image

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Это решение:

import cv2
import numpy as np

img=cv2.imread('test.jpg')

kernel1 = np.ones((3,5),np.uint8)
kernel2 = np.ones((9,9),np.uint8)

imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBW=cv2.threshold(imgGray, 230, 255, cv2.THRESH_BINARY_INV)[1]

img1=cv2.erode(imgBW, kernel1, iterations=1)
img2=cv2.dilate(img1, kernel2, iterations=3)
img3 = cv2.bitwise_and(imgBW,img2)
img3= cv2.bitwise_not(img3)
img4 = cv2.bitwise_and(imgBW,imgBW,mask=img3)
imgLines= cv2.HoughLinesP(img4,15,np.pi/180,10, minLineLength = 440, maxLineGap = 15)

for i in range(len(imgLines)):
    for x1,y1,x2,y2 in imgLines[i]:
        cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow('Final Image with dotted Lines detected', img)
2 голосов
/ 16 апреля 2020

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

Итак, попробуйте

Конвертировать bgr-to-grey

Применить черную шляпу, используя morphologyEx: это оставит только черные точки в полученное изображение.

Инвертируйте результат и попробуйте выполнить грубое преобразование линии.

Здесь вам придется поэкспериментировать с размером ядра, чтобы отфильтровать только точки. Если это окажется не очень надежным, другой подход будет использовать детектор BLOB-объектов. Инвертируйте изображение и применяйте детектор BLOB-объектов opencv или находите контуры. Фильтруйте пятна / контуры по площади. Буквы и другие структуры будут иметь большую площадь, чем точки, поэтому вы можете удалить любые структуры, которые больше точек. Затем примените преобразование неровной линии.

...