OpenCV, Как соединить / заполнить пробел в строках или прямоугольнике или кружках (Python) - PullRequest
1 голос
/ 16 апреля 2019

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

enter image description here

Я хочу заполнить этот пробел (показано на рисунке),У кого-нибудь есть идеи по использованию OpenCV ...?

Мой код здесь ........

    self.res = cv2.imread("1.jpg")

    self.store_path = "../storage-data/" 

    #define kernal value
    kernel = np.ones((2,2),np.uint8)

    #grayscale
    gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)

    dilate = cv2.dilate(gray,kernel,iterations = 1)
    dilate1 = cv2.dilate(dilate,kernel,iterations = 1)

    dilate1 = cv2.morphologyEx(dilate1, cv2.MORPH_OPEN, kernel)

    #Canny
    canny = cv2.Canny(dilate1,160,160,3)

    dilate = cv2.dilate(canny,kernel,iterations = 1)

    #Gaussian Blurring
    blur = cv2.GaussianBlur(dilate,(5,5),0)
    erode = cv2.dilate(blur,kernel,iterations = 1)
    blur = cv2.GaussianBlur(erode,(5,5),1)

    blur = cv2.morphologyEx(blur, cv2.MORPH_CLOSE, kernel)
    ret, thresh = cv2.threshold(blur,127,255,cv2.THRESH_BINARY)

    blur = cv2.GaussianBlur(thresh,(5,5),1)
    ret1, thresh1 = cv2.threshold(blur,127,255,cv2.THRESH_BINARY)

    opening = cv2.morphologyEx(thresh1, cv2.MORPH_OPEN, kernel)

    cv2.imwrite(self.store_path + 'opening.jpg', opening)

    contours, hierarchy = cv2.findContours(opening,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

Одного расширения должно быть достаточно, ключ должен использовать вертикальное ядро, Попробуй изменить размеры ядра например kernel = np.ones ((5,2), np.uint8) Проверьте результат после 1 расширения, он должен закрыть разрыв.

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

Можете ли вы попробовать использовать контуры. Контуры можно объяснить просто как кривую, соединяющую все непрерывные точки (вдоль границы), имеющие одинаковый цвет или интенсивность. Сначала найдите все контуры и затем нарисуйте контуры на исходном изображении.возможно решит вопрос

contours, _ = cv2.findContours(canny, 2,2)
length = len(contours)
for i in range(len(contours)):
    cv2.drawContours(img, contours, i, (0,255,0), 2, cv2.LINE_8)
...