Объедините контуры по вертикали и получите выпуклый корпус - opencv - python - PullRequest
0 голосов
/ 20 мая 2018

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

image

После получения contours и convexHull результат будет таким:

image

Для этого я использовал следующий код:

import cv2
img = cv2.imread('input.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)    
cv2.imwrite("output.png", img)

Как видно на следующем рисунке , определены контуры, которые выровнены по вертикали с исходным символом.Но те разделены с оригинальным основным персонажем.(На самом деле это модификаторы языка, называемого синхала - සිංහල)

image

Теперь я хочу объединить эти вертикально выровненные контуры с основным персонажем.В конечном итоге вывод должен быть следующим.Как я могу сделать это эффективно?

image

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Вы можете попробовать выполнить морфологическую операцию, используя ядро ​​с вертикальной прямоугольной формой.Таким образом, кератиновые символы над исходными символами будут объединены в один.

rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 30))
threshed = cv2.morphologyEx(th2, cv2.MORPH_CLOSE, rect_kernel)
cv2.imshow('threshed', threshed)

enter image description here

imgContours, Contours, Hierarchy = cv2.findContours(threshed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in Contours:
    hull = cv2.convexHull(cnt)
    cv2.drawContours(img2, [hull], -1, (0, 0, 255), 1) 
cv2.imshow('convex hull', img2)

enter image description here

0 голосов
/ 20 мая 2018

Вы можете попробовать объединить контуры на основе расстояния между центрами контуров.Поскольку вы хотите уделять больше внимания вертикальным соединениям, вы можете изменить функцию расстояния так, чтобы она придавала большее значение вертикальным соединениям.Это можно сделать, рассматривая горизонтальные расстояния как более «дорогие» с точки зрения порога.Например, чтобы сделать акцент на вертикальной близости больше, чем горизонтальной близости, вы можете масштабировать горизонтальную разницу с константой больше 1:

distance = hypotenuse(distance_x * 5, distance_y)
...