Моя первая мысль - использовать размытие по Гауссу для своего рода «фильтра нерезкости». (Я думаю, моя вторая идея лучше ; она сочетает в себе это размытие и добавление с игрой с эрозией / расширением. Я опубликовал ее в качестве отдельного ответа, потому что я думаю, что это стратегия, которая по-другому заслуживает это.) @eldesgraciado отметил частоту, которая в основном и состоит в том, что мы здесь делаем. Я надену код и объяснение. ( Здесь - это один ответ на сообщение SO, в котором много говорится о повышении резкости - связанный ответ представляет собой более переменную маску нерезкости, написанную в Python. Не торопитесь, чтобы посмотреть другие ответы, включая this , одна из многих простых реализаций, которые выглядят так же, как у меня - хотя некоторые написаны на разных языках программирования.) Вам нужно будет возиться с параметрами. Возможно, это не сработает, но это первое, о чем я подумал.
>>> import cv2
>>> im_0 = cv2.imread("FWM8b.png")
>>> cv2.imshow("FWM8b.png", im_0)
>>> cv2.waitKey(0)
## Press any key.
>>> ## Here's where we get to frequency. We'll use a Gaussian Blur.
## We want to take out the "frequency" of changes from white to black
## and back to white that are less than the thickness of the "1973"
>>> k_size = 0 ## This is the kernal size - the "width frequency",
## if you will. Using zero gives a width based on sigmas in
## the Gaussian function.
## You'll want to experiment with this and the other
## parameters, perhaps trying to run OCR over the image
## after each combination of parameters.
## Hint, avoid even numbers, and think of it as a radius
>>> gs_border = 3
>>> im_blurred = cv2.GaussianBlur(im_0, (k_size, k_size), gs_border)
>>> cv2.imshow("gauss", im_blurred)
>>> cv2.waitKey(0)
Хорошо, мои параметры, вероятно, не размылись этого достаточно. Части слов, от которых вы хотите избавиться, не очень размыты. Я сомневаюсь, что вы даже увидите большую разницу от оригинала, но, надеюсь, вы поймете идею.
Мы собираемся умножить исходное изображение на значение, умножить размытое изображение на значение и вычтите value*blurry
из value*orig
. Надеюсь, код будет понятнее.
>>> orig_img_multiplier = 1.5
>>> blur_subtraction_factor = -0.5
>>> gamma = 0
>>> im_better = cv2.addWeighted(im_0, orig_img_multiplier, im_blurred, blur_subtraction_factor, gamma)
>>> cv2.imshow("First shot at fixing", im_better)
Да, не так уж и много другого. Разберитесь с параметрами, попробуйте сделать размытие, прежде чем вы установите адаптивный порог, и попробуйте другие методы. Я не могу гарантировать, что это сработает, но, надеюсь, это поможет вам начать.
Редактировать Это отличный вопрос. Отвечая на насмешливую критику @ eldesgraciado
Ах, непослушный, непослушный. Пытаетесь взломать их коды CAPTCHA, а? Их трудно сломать по причине. Сегментация текста, как видите, нетривиальна. В вашем конкретном изображении много высокочастотного шума, вы можете сначала попробовать какую-то частотную фильтрацию и посмотреть, какой результат вы получите.
Я отправляю следующее из статьи Википедии о reCAPTCHA ( в архиве ).
reCAPTCHA полностью оцифровала архивы New York Times и книги из Google Книг по состоянию на 2011 год. три Поиск в архиве можно найти в статье New York Times Archive.four Благодаря массовому сотрудничеству reCAPTCHA помогала оцифровывать книги, которые слишком неразборчивы для сканирования компьютерами, а также переводить книги на разные языки с 2015 года. *
Также посмотрите эту статью (в архиве).
Я не думаю, что эта CAPTCHA является частью массового онлайн-сотрудничества.
Редактировать: Потребуется другой тип заточки. Я только что понял, что применяю множители 1,5 и -0,5 к пикселям, которые обычно имеют значения, очень близкие к 0 или 255, то есть, вероятно, я просто восстанавливаю исходное изображение после повышения резкости. Я приветствую любые отзывы по этому поводу.
Кроме того, из комментариев с @eldesgracio:
Кто-то, вероятно, знает лучший алгоритм повышения резкости, чем тот, который я использовал. Размытие достаточно, и, возможно, пороговое значение для средних значений по сетке n-на-n (плотность пикселей). Я не очень много знаю обо всем, что связано с адаптивным порогом и контурами. Может быть, это можно сделать после размытия ...
Просто чтобы дать вам несколько идей ...
Вот размытие с k_size = 5
Вот размытие с k_size = 25
Обратите внимание, что это BLURS , а не исправления. Скорее всего, вам придется возиться с orig_img_multiplier
и blur_subtraction_factor
в зависимости от частоты (я точно не помню, как, поэтому я не могу точно сказать, как это делается.) Не стесняйтесь возиться с gs_border
, gamma
и все, что вы можете найти в документации для методов, которые я показал.
Удачи с этим.
Кстати, частота больше зависит от 2-D быстрого преобразования Фурье и, возможно, от деталей ядра. Я только что возился с этим материалом - определенно не эксперт и определенно рад, если кто-то хочет дать больше подробностей - но я надеюсь, что дал основную идею. Также может быть полезно добавить некоторый шум дрожания (размытие вверх и вниз или из стороны в сторону, а не на основе радиуса).