Разбейте образ слова на разные образы персонажа - PullRequest
0 голосов
/ 14 октября 2019

enter image description here

У меня есть двоичное изображение слов, как показано, и я хочу разбить изображение с каждым символом на другое изображение. Вывод должен иметь разные изображения k, 7,2, f, 5 & m. Я пытался использовать opencv в python, но по какой-то причине я не смог его сломать. Если я смогу нарисовать рамку над каждым текстом, то и этого будет достаточно.

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Вот простой подход:

  • Преобразование в оттенки серого
  • Порог Оцу
  • Поиск контуров, сортировка контуров слева направо и фильтрация по контуруarea
  • Извлечение ROI

После определения порога Оцу для получения двоичного изображения мы сортируем контуры слева направо, используя imutils.contours.sort_contours(). Это гарантирует, что, когда мы перебираем каждый контур, у нас есть каждый символ в правильном порядкеКроме того, мы фильтруем, используя минимальную пороговую площадь, чтобы удалить небольшой шум. Вот обнаруженные символы

enter image description here

Мы можем извлечь каждый символ, используя срез Numpy. Вот каждый сохраненный символ ROI

enter image description here

Если вы хотите другой способ, просто инвертируйте его

ROI = 255 - image[y:y+h, x:x+w]

enter image description here

import cv2
from imutils import contours

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray,0,255,cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts, _ = contours.sort_contours(cnts, method="left-to-right")

ROI_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area > 10:
        x,y,w,h = cv2.boundingRect(c)
        ROI = 255 - image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 1)
        ROI_number += 1
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
1 голос
/ 14 октября 2019

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

Вот один из способовсделать обнаружение края, а затем найти вертикальные расстояния:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("ZrnKr.png", cv2.IMREAD_GRAYSCALE)
edges = cv2.Canny(img,100,200)
vertical_sum = np.sum(edges, axis=0)
vertical_sum = vertical_sum != 0
changes = np.logical_xor(vertical_sum[1:], vertical_sum[:-1])
change_pts = np.nonzero(changes)[0]

plt.imshow(img)
for change in change_pts:
    plt.axvline(change+1)
plt.show()

enter image description here

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