Удалить остатки в письме изображения с Python - PullRequest
0 голосов
/ 27 ноября 2018

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

Некоторые образцы

Я работаю с openCV, и я попробовал два способа, и ни один не работает.

С помощью findContours:

def is_contour_bad(c):
    return len(c) < 50

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(gray, 50, 100)

contours = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if imutils.is_cv2() else contours[1]

mask = np.ones(image.shape[:2], dtype="uint8") * 255

for c in contours:
    # if the c  ontour is bad, draw it on the mask
    if is_contour_bad(c):
        cv2.drawContours(mask, [c], -1, 0, -1)

# remove the contours from the image and show the resulting images
image = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("After", image)
cv2.waitKey(0)

Я думаю, что это не работает, потому что изображение на краю cv2.drawContours не может правильно рассчитать площадь и не устраняет внутренние точки

С компонентом connectedComponentsWithStats:

cv2.imshow("Image", img)
cv2.waitKey(0)
nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(img)
sizes = stats[1:, -1];
nb_components = nb_components - 1

min_size = 150

img2 = np.zeros((output.shape))
for i in range(0, nb_components):
    if sizes[i] >= min_size:
        img2[output == i + 1] = 255

cv2.imshow("After", img2)
cv2.waitKey(0)

В этом случае я не знаю, почему мелкие элементы по бокам не распознают их как подключенные компоненты

Хорошо .. Я был бы очень признателен любомупомощь!

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

В самом начале вопроса вы упомянули, что буквы были извлечены из изображения слова .

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

Решение:

Вы можете использовать convex hull координаты для разделения символов, как это.

код:

import cv2
import numpy as np

img = cv2.imread('test.png', 0)
cv2.bitwise_not(img,img)
img2 = img.copy()

ret, threshed_img = cv2.threshold(img, 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)
contours = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0])

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)
    r, t2 = cv2.threshold(black2, 127, 255, cv2.THRESH_BINARY)
    masked = cv2.bitwise_and(img2, img2, mask = t2)
    cv2.imshow("masked.jpg", masked)
    cv2.waitKey(0)

cv2.destroyAllWindows()

выходы:

image image

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

0 голосов
/ 28 ноября 2018

Я бы попробовал следующее:

  1. Сумма по столбцам, чтобы каждое изображение проецировалось в вектор
  2. Предполагая, что white = 0 и black = 1, найдите первоезначение индекса в этом векторе, которое = 0.
  3. Удалите столбцы изображения слева от значения индекса с шага 2.
  4. Обратный суммированный вектор с шага 1
  5. Найтипервое значение индекса, которое = 0 в обратном векторе с шага четыре.
  6. Удалите столбцы изображения справа от значения обратного индекса из шага 5.

Это будет хорошо работать для двоичного изображения, где белый = 0 и черный = 1, но если нетСуществует несколько методов, в том числе пороговое значение изображения или установка уровней допуска (например, для шага 2. найдите первое значение индекса в векторе, которое> допуск ...)

...