Расставляем контуры - PullRequest
0 голосов
/ 21 июня 2020

Я хочу найти очертания всех букв. Я нахожу их, но они в беспорядке.

Помогите мне найти многоугольники, отсортированные слева направо и сверху вниз. Вот и ищу контуры.

mg = "output.jpg"
dir = os.curdir

path = os.path.join(dir,img)
raw_image = cv2.imread(path,0)

cv2.imshow("original",raw_image)
plt.subplot(2,3,1)
plt.title("Original")
plt.imshow(raw_image,'gray')``
plt.xticks([]),plt.yticks([]);

sm_image = cv2.blur(raw_image,(8,8))

cv2.imshow("smoothed",sm_image)

plt.subplot(2,3,2)
plt.title("Smoothed")
plt.imshow(sm_image,'gray')
plt.xticks([]),plt.yticks([]);

#cv2.imshow("smoothed",sm_image)
ret,bw_image = cv2.threshold(sm_image,160,255,cv2.THRESH_BINARY_INV)

cv2.imshow("thresholded",bw_image)
plt.subplot(2,3,3)
plt.title("Thresholded")
plt.imshow(bw_image,'gray')
plt.xticks([]),plt.yticks([]);

kernel = np.ones((4,4),np.uint8)
er_image = cv2.erode(bw_image,kernel)

cv2.imshow("eroded",er_image)
plt.subplot(2,3,4)
plt.title("Eroded")
plt.imshow(er_image,'gray')
plt.xticks([]),plt.yticks([]);

kernel = np.ones((2,2),np.uint8)
di_image = cv2.dilate(er_image,kernel)

cv2.imshow("dilated",di_image)
plt.title("Dilated")
plt.subplot(2,3,5)
plt.imshow(di_image,'gray')
plt.xticks([]),plt.yticks([]);

mo_image = di_image.copy()
contour0 = cv2.findContours(mo_image.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
contours = [cv2.approxPolyDP(cnt,3,True) for cnt in contour0[0]]

maxArea = 0
rect = []
for ctr in contours:
maxArea = max(maxArea, cv2.contourArea(ctr))

if img == "C:\\Users\\dennn\\PycharmProjects\\untitled2\\output.jpg":
areaRatio = 0.05

for ctr in contours:
if cv2.contourArea(ctr) > maxArea * areaRatio:
    rect.append(cv2.boundingRect(cv2.approxPolyDP(ctr, 1, True)))

 symbols = []
for i in rect:
x = i[0]
y = i[1]
w = i[2]
h = i[3]
p1 = (x, y)
p2 = (x + w, y + h)
cv2.rectangle(mo_image, p1, p2, 255, 2)
image = cv2.resize(mo_image[y:y + h, x:x + w], (32, 32))
symbols.append(image.reshape(1024, ).astype("uint8"))

testset_data = np.array(symbols)

cv2.imshow("segmented", mo_image)
plt.subplot(2, 3, 6)
plt.title("Segmented")
plt.imshow(mo_image, 'gray')
plt.xticks([]), plt.yticks([]);
# plt.show()

# garbage collection
cv2.destroyAllWindows()
plt.close()

# show glyphs
for i in range(len(symbols)):
image = np.zeros(shape=(64,64))
image[15:47,15:47] = symbols[i].reshape((32,32))
cv2.imshow("sym",image)
cv2.waitKey(0)

cv2.destroyAllWindows()
plt.close()

Они возвращаются случайно. Сейчас мне сложно понять, все ли контуры символов я нахожу.

Пример: пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...