Как удалить царапину с изображения с помощью matlab


Допустим, у меня есть этот образ это :

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

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

3 8

3 ответа:

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

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

Когда я бинаризую это изображение с выбранным вручную порогом, я получаю быстрый и грязный детектор царапин: Бинаризованный

Если у вас есть больше знаний о том, как выглядят ваши царапины, вы можете значительно улучшить этот детектор. например, царапины всегда темные? Всегда ли они отличаются высокой контрастностью? Всегда ли они гладкие кривые, то есть всегда ли их кривизна низкая? - Каждое из этих свойств можно как-то измерить, так что вы бы объедините эти измерения в одно изображение и бинаризуйте его.

Одним из небольших улучшений является удаление мелких компонентов: DeleteSmallComponents

Это все еще не идеально, но результат достаточно хорош, чтобы использовать его в качестве маски для рисования.: подрисовка

Это также уберет некоторые детали, но различия труднее заметить.

Полный код Mathematica:

difference = ImageDifference[sourceImage, MedianFilter[sourceImage, 2]];
mask = DeleteSmallComponents[Binarize[difference, 0.15], 15];
Inpaint[sourceImage, mask]

Редактировать:

Если у вас нет доступа к стандартному алгоритму рисования (например, Navier Stokes или Telea), алгоритм бедного человека состоял бы в использовании медианного отфильтрованного изображения в тех областях, где маска равна 1 (вероятно, что-то вроде mask*sourceImage + (1-mask)*medialFilteredImage в Matlab). В зависимости от данных изображения, разница может не стоить дополнительных усилий" реального " алгоритма рисования:

Подрисовывание бедного человека

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

Мой результат с использованием медианного фильтра с ImageJ

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