Извлечение символов с использованием выпуклых координат корпуса - opencv - python - PullRequest
0 голосов
/ 17 мая 2018

У меня есть такие изображения персонажей:

image

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

import cv2
img = cv2.imread('test.png', -1)

ret, threshed_img = cv2.threshold(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),
                        127, 255, cv2.THRESH_BINARY)
image, contours, hier = cv2.findContours(threshed_img, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    # get convex hull
    hull = cv2.convexHull(cnt)
    cv2.drawContours(img, [hull], -1, (0, 0, 255), 1)
    print(hull)
cv2.imwrite("contours.jpg", img)

Результат выглядит следующим образом:

image

Я мог бы получить координаты корпуса следующим образом (для одного символа):

[[[546 134]]
 [[534 149]]
 [[532 151]]
 [[527 153]]
 [[523 154]]
 [[522 154]]
 [[520 109]]
 [[521 107]]
 [[524 106]]
 [[533 106]]
 [[539 111]]
 [[543 117]]
 [[546 122]]]

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

image image . , .

Основная причина, по которой я хочу использовать convexHull координаты, заключается в том, что я могу сегментировать символы, которые были перекрыты в вертикальном пространстве изображения. Вы можете понять, что я имел в виду, используя следующее изображение:

image

Я не могу точно сегментировать символы, так как большинство изображений содержат символы, как указано выше. Поэтому я хочу сегментировать символы, используя convexHull координаты.

1 Ответ

0 голосов
/ 17 мая 2018
  • Получив выпуклую оболочку для одного персонажа, я нашел соответствующий ей контур и залил его.
  • Я замаскировал каждый отдельный поданный контур исходным изображением, чтобы получить сегменты

Вот код:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\selwyn77\Desktop\letters.png', -1)
img2 = img.copy()
cv2.imshow("original.jpg", img)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, threshed_img = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
image, contours, hier = cv2.findContours(threshed_img, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

#--- Black image to be used to draw individual convex hull ---
black = np.zeros_like(img)
cv2.imshow("black.jpg", black)

contours = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0]) #added by OP : this sorts contours left to right, so images come in order

for cnt in contours:
    hull = cv2.convexHull(cnt)

    img3 = img.copy()
    black2 = black.copy()

    #--- Here is where I am filling the contour after finding the convex hull ---
    cv2.drawContours(black2, [hull], -1, (255, 255, 255), -1)
    g2 = cv2.cvtColor(black2, cv2.COLOR_BGR2GRAY)
    r, t2 = cv2.threshold(g2, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow("t2.jpg", t2)

    masked = cv2.bitwise_and(img2, img2, mask = t2)    
    cv2.imshow("masked.jpg", masked)

    print(len(hull))
    cv2.waitKey(0)

cv2.destroyAllWindows()

Теперь вы можете сохранить каждый из отдельных сегментов, используя cv2.imwrite().

Вот несколько сегментированных символов:

enter image description here

enter image description here

enter image description here

...