Как восстановить текст из изображения, используя только морфологические операции?

16

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

Я пытался использовать эрозию, расширение, открытие и закрытие, но результат не очень хороший.

Это вообще возможно?

введите описание изображения здесь

Jackobsen
источник
Расширение выглядит как очевидный первый шаг, чтобы сгладить эти нечеткие края?
Пол Р
Да, я думаю, что это первый шаг в каждой комбинации, которую я пробовал.
2
Я думаю, что вам нужно определить свою проблему больше. Например, если вы имеете в виду, как вы можете сделать его более читабельным, то, вероятно, достаточно небольшого расширения. Если вы хотите восстановить точно, как это выглядело до какого-либо процесса искажения, то это невозможно, потому что ваш морфологический алгоритм не знает формы конкретного используемого шрифта.
so12311 13.12.11
Чтобы сделать его более читабельным, я сделал imdlates с [0 1 0; 1 1 1; 0 1 0]. Я ищу что-то, что сделает текст очень похожим на оригинальный.
Джекобсен

Ответы:

6

Если вы хотите добавить / вычесть и т. Д. Морфологически преобразованные изображения, вы можете подсчитать, сколько сигнальных пикселей находится вблизи каждого пикселя, и пороговое значение на основе этого числа.

img = imread('http://i.stack.imgur.com/wicpc.png');

n = false(3);n(4) = 1;
s = false(3);s(6) = 1;
w = false(3);w(2) = 1;
e = false(3);e(8) = 1;

%# note that you could convolve with a cross instead
fourNeighbourCount = imerode(img,n) + imerode(img,s) + imerode(img,w) + imerode(img,3) + img;

введите описание изображения здесь

%# require at least two neighbours
img = fourNeighbourCount > 1;

введите описание изображения здесь

Если затем вы свернете маску 3х3 с отверстием посередине, вы можете получить что-то вроде этого:

введите описание изображения здесь

Jonas
источник
3

Это довольно интересная проблема для решения! Попробуйте медианный фильтр . Смотрите ссылку здесь и здесь для более подробной информации.

Хотя я не приложил руки, чтобы смоделировать вашу проблему, это предложение. Мое инстинктивное чувство говорит о том, что оно может принести вам большую пользу, потому что, как известно, оно противодействует типу соли с перцем. В вашем случае изображения имеют дополнительные белые точки вокруг границы, которые будут либо преобразованы в полностью белый, либо в полностью черный в зависимости от того, какая сторона алфавита. Вот как это выглядит после медианной фильтрации:

введите описание изображения здесь

Дипан Мехта
источник
1

Если по какой-то причине вы ограничены использованием морфологических операций, то вы можете рассмотреть возможность использования «схемы голосования» для ориентированных операций закрытия.

Одна проблема с морфологическими операциями состоит в том, что они действительно не принимают во внимание направленность. Для центрального пикселя такая окрестность

1 0 0
1 1 0
0 1 1

на самом деле ничем не отличается от такого района

0 1 0
1 1 0
1 1 0

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

1 1 0   1 0 0   1 0 0
0 1 0   1 1 0   1 1 0
0 1 1   0 1 1   0 1 1 . . .

Это было бы лучше с 5 x 5 ядрами, но я думаю, что идея достаточно ясна. По сути, идея ядра обнаружения углов немного растянута, так что это ядро ​​обнаружения линейных сегментов. Вы также можете использовать его, чтобы найти наиболее подходящие кривые:

0 0 0 1 1
0 0 1 1 0
0 1 1 0 0 
0 0 1 1 0
0 0 0 1 1

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

В любом случае, если вы используете несколько ядер и некоторую логику, каждая операция в (x, y) требует больше вычислений, чем традиционный морфологический шаг:

  1. В каждом пикселе (x, y) примените каждый из нескольких морфологических операторов. Для каждого оператора рассчитайте как результат морфологической операции, так и степень соответствия входных данных ядру. («Степень» = количество совпадающих пикселей)
  2. Выберите морфологический результат для ядра, который наиболее точно соответствует фактической конфигурации пикселей вкл / выкл.

Размер ядра должен соответствовать размеру ввода. Вместо того, чтобы использовать ядро ​​большего размера, вы можете использовать «распространенное» ядро, чтобы уменьшить количество операций. Следующее ядро ​​- это просто ядро ​​3 x 3 с радиусом больше 1.

1 0 0 0 0 0 0
0 0 0 0 0 0 0
1 0 0 1 0 0 0
0 0 0 0 0 0 0
1 0 0 0 0 0 1
Rethunk
источник