Как убрать царапину с изображения с помощью matlab - PullRequest
8 голосов
/ 27 декабря 2011

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

enter image description here

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

Ответы [ 3 ]

22 голосов
/ 27 декабря 2011

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

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

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

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

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

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

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

Полный код Mathematica:

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

EDIT:

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

Poor man's inpainting

0 голосов
/ 22 июля 2015

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

enter image description here

0 голосов
/ 27 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...