Заполните пустые вложенные части изображения - PullRequest
0 голосов
/ 29 декабря 2018

Before

After

Я ищу алгоритм, который дал бы результат, который я показываю выше,Я до сих пор пробовал некоторую дилатацию и эрозию от PIL, но результаты не те, которые я ищу, потому что я теряю некоторые существенные детали букв.Кроме того, они имеют тенденцию быть очень смелыми после, и эрозия не помогает.Моей второй попыткой был какой-то алгоритм затопления, но я не могу придумать ничего полезного, поскольку в некоторых письмах есть пробелы, и я не знаю, как с этим справиться.Я был бы очень признателен, если бы вы могли привести меня к некоторой идее алгоритма для решения этой проблемы.

1 Ответ

0 голосов
/ 29 декабря 2018

Как уже упоминал Марк Сэтчелл, вы можете использовать cv2.findContours, а затем использовать иерархию, чтобы найти дыры букв.

Сначала я нахожу все контуры на изображении.

Чтобы найти дырыбуквы, я использовал иерархию, чтобы получить контуры без дочерних элементов (самый внутренний контур), а затем залить их белым цветом в черном (так называемое изображение маски).Я также применяю порог области, чтобы избавиться от маленьких черных точек внутри букв и оставить только дыры.Порог area>int(w*h/200) с w, h - длина и ширина изображения.

Я заливаю контуры в сером изображении черным.Затем я просто добавляю серое изображение и изображение маски), чтобы получить окончательный результат.

Вот код.

import cv2
import numpy as np

img = cv2.imread("1.png")

print(img.shape)
w = img.shape[0]
h = img.shape[1]

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,128,255,cv2.THRESH_BINARY_INV)

im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours,-1,(0,0,255),1)

mask = np.zeros(gray.shape, dtype="uint8")

for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    print(hierarchy[0][i][2])
    if(hierarchy[0][i][2]==-1 and area>int(w*h/200)): #contour has no child
        cv2.fillPoly(mask, pts =[contours[i]], color=255)
    cv2.fillPoly(gray, pts =[contours[i]], color=0)

res = mask + gray

cv2.imshow("img", img)    
cv2.imshow("gray", gray)      
cv2.imshow("mask", mask)
cv2.imshow("res", res)

cv2.waitKey()
cv2.destroyAllWindows() 

enter image description here

...