Удалить шаблон текстуры бумаги с фотографии - PullRequest
28 голосов
/ 27 марта 2011

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

Я пытался применить преобразование FFT (используя плагин Photoshop ), но я не смог найти какие-либо четкие белые пятна для закрашивания. Вероятно, картина не так регулярна для этого метода?

Вы можете увидеть образец ниже. Если вам нужно полное изображение, я могу загрузить его куда-нибудь. photograph sample

Ответы [ 4 ]

23 голосов
/ 28 марта 2011

К сожалению, вы в значительной степени застряли в пространственной области, поскольку шаблон на самом деле недостаточно повторяющийся, чтобы его можно было использовать для анализа Фурье.

Как отметили @Jonas и @michid, фильтрация поможет вам с такой проблемой. С фильтрацией вы сталкиваетесь с компромиссом между количеством деталей, которые вы хотите сохранить, и количеством шума (или нежелательных компонентов изображения), который вы хотите удалить. Например, медианный фильтр, используемый @Jonas, полностью удаляет текстуру бумаги (даже круглую царапину у нижнего края изображения), но также удаляет всю текстуру в глазах, волосах, лице и фоне (хотя на самом деле это не так). так много заботиться о заднем плане, важен передний план). Вы также увидите небольшое снижение контрастности изображения, что обычно нежелательно. Это придает изображению искусственный вид.

Вот как бы я справился с этой проблемой:

  • Определить шаблон текстуры бумаги:
    • Применение размытия по Гауссу к изображению (используйте большое ядро, чтобы убедиться, что вся информация о текстуре бумаги уничтожена
    • Рассчитайте разницу в размерах между размытыми и исходными изображениями
    • РЕДАКТИРОВАТЬ 2 Применить размытие по Гауссу к разностному изображению (используйте небольшое ядро ​​3x3)
  • Порог вышеуказанного шаблона с использованием эмпирически определенного порога. Это дает двоичное изображение, которое можно использовать в качестве маски.
  • Используйте медианную фильтрацию (как упомянуто @Jonas) для замены только частей изображения, которые соответствуют рисунку на бумаге.

Шаблон текстуры бумаги (до порога):

enter image description here

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

Окончательное изображение:

enter image description here

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

EDIT

Заполненные области, как правило, однотонные и поэтому немного выделяются, если вы посмотрите на изображение очень внимательно. Вы также можете попробовать добавить немного слабого гауссовского шума с нулевым средним в заполненные области, чтобы они выглядели более реалистично. Вы должны выбрать дисперсию шума, чтобы соответствовать фону. Эмпирическое определение может быть достаточно хорошим.

Вот обработанное изображение с добавленным шумом:

enter image description here

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

13 голосов
/ 27 марта 2011

Медианный фильтр может вам немного помочь:

img = imread('http://i.stack.imgur.com/JzJMS.jpg');
%# convert rgb to grayscale
img = rgb2gray(img);
%# apply median filter
fimg = medfilt2(img,[15 15]);
%# show
imshow(fimg,[])

enter image description here

Обратите внимание, что сначала вы можете дополнить изображение, чтобы избежать краевых эффектов.

EDIT : Ядро фильтра меньшего размера, чем [15 15], лучше сохранит текстуру изображения, но оставит больше видимых следов фильтрации.

3 голосов
/ 05 мая 2012

Ну, я попробовал другой подход с использованием диффузии Anisotropc, используя 2-й коэффициент, который работает на более широких участках

Вот вывод, который я получил:

enter image description here

1 голос
/ 28 марта 2011

Как видно из рисунка, шум имеет относительно высокую частоту по сравнению с самим изображением. Так что применение фильтра низких частот должно работать. Посмотрите на спектр мощности abs(fft(...)), чтобы определить частоту среза.

...