Используя Python и PIL, как я могу получить блок текста на изображении? - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть изображение (* .png), которое содержит два блока текста. Я пытаюсь захватить каждый блок текста по отдельности с помощью библиотеки изображений Python (PIL) в Python27.

Я попытался размыть изображение, а затем найти края размытого блока, чтобы потом можно было восстановить границы каждого блока (для последующего использования с «кадрированием»). Однако, когда я размываю изображение (я пробовал несколько итераций), фильтр «find_edges», кажется, просто захватывает края каждого символа.

pic = Image.open("a.jpg")
out = pic.filter(ImageFilter.BLUR)
out = out.filter(ImageFilter.FIND_EDGES)

Наверное, я ищу что-то похожее в фотошопе "Magnetic Lasso Tool". Есть идеи, какой подход может быть лучше?

1 Ответ

12 голосов
/ 23 февраля 2012

Я бы начал с создания гистограммы изображения, спроецированного на одну ось. Возьмите свое изображение, обрежьте сначала внешнюю ограничивающую рамку . Пример проекции гистограммы на ось Y:

from PIL import Image
import numpy as np

im = Image.open("dummytext.png")
pix = np.asarray(im)
pix = pix[:,:,0:3] # Drop the alpha channel
pix = 255 - pix  # Invert the image
H =  pix.sum(axis=2).sum(axis=1) # Sum the colors, then the y-axis

enter image description here

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

...