Як реконструювати текст із зображення, використовуючи лише морфологічні операції?


16

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

Я намагався використовувати ерозію, дилатацію, відкривання та закриття, але результат не дуже хороший.

Це навіть можливо?

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


Дилатація виглядає як очевидний перший крок, щоб згладити ці нечіткі краї?
Павло Р

Так, я думаю, що це перший крок кожної комбінації, яку я спробував.

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

Щоб зробити його більш читабельним, я зробив іммідалі з [0 1 0; 1 1 1; 0 1 0]. Я шукаю те, що зробить текст дуже близьким до оригіналу.
Jackobsen

Відповіді:


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, яка має отвір посередині, ви можете отримати щось подібне:

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


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 х 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 х 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.