Я написал этот алгоритм на Python для чтения CAPTCHA с использованием scikit-image:
from skimage.color import rgb2gray
from skimage import io
def process(self, image):
"""
Processes a CAPTCHA by removing noise
Args:
image (str): The file path of the image to process
"""
input = io.imread(image)
histogram = {}
for x in range(input.shape[0]):
for y in range(input.shape[1]):
pixel = input[x, y]
hex = '%02x%02x%02x' % (pixel[0], pixel[1], pixel[2])
if hex in histogram:
histogram[hex] += 1
else:
histogram[hex] = 1
histogram = sorted(histogram, key = histogram.get, reverse=True)
threshold = len(histogram) * 0.015
for x in range(input.shape[0]):
for y in range(input.shape[1]):
pixel = input[x, y]
hex = '%02x%02x%02x' % (pixel[0], pixel[1], pixel[2])
index = histogram.index(hex)
if index < 3 or index > threshold:
input[x, y] = [255, 255, 255, 255]
input = rgb2gray(~input)
io.imsave(image, input)
До:
После:
Он работает довольно хорошо, и я получаю неплохие результаты после проверки его с помощью Google Tesseract OCR, но я хочу сделать его лучше. Я думаю, что выпрямление букв даст гораздо лучший результат. Мой вопрос, как мне это сделать?
Я понимаю, что мне нужно как-то упаковать буквы, вот так:
Затем для каждого символа поверните его на некоторое количество градусов в зависимости от вертикальной или горизонтальной линии.
Моя первоначальная мысль состояла в том, чтобы определить центр символа (возможно, найдя кластеры наиболее часто используемых цветов на гистограмме), а затем расширить прямоугольник, пока он не найдет черный, но опять же, я не очень уверен, как это сделать.
Какие общие приемы используются при сегментации изображений для достижения такого результата?
Изменить:
В конце концов, дальнейшее уточнение цветовых фильтров и ограничение Tesseract только символами дало почти 100% точный результат без какого-либо исправления перекосов.