Как уже упоминал Марк Сэтчелл, вы можете использовать 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()