Канонические сглаживающие фильтры с сохранением границ должны быть вполне подходящими для вашего конкретного приложения. Они одновременно удаляют шум (распределенный по Гауссу, я должен добавить ...), сохраняя при этом края как можно лучше. Классические примеры включают двусторонний фильтр, Фильтр управляемых изображений, автор Kaiming He, фильтрация преобразования домена Гастала и Оливейры (которую я успешно использовал в прошлом) и даже анизотропная диффузия.
Чтобы быстро попробовать что-то, управляемый фильтр изображений теперь включен в качестве официальной функции, которая является частью набора инструментов обработки изображений, начиная с MATLAB R2014a, через imguidedfilter
. Если у вас нет MATLAB R2014a или более поздней версии, вы можете загрузить необработанный исходный код MATLAB по этой ссылке здесь: http://kaiminghe.com/eccv10/guided-filter-code-v1.rar, но вы можете получить его на основном веб-сайте, на который я ссылался выше.
Предполагая, что у вас нет R2014a, загрузите код фильтра управляемого изображения и используйте его для фильтрации вашего примера. Учитывая вашу ссылку на пример изображения, которое было повреждено шумом, я скачал его и использую в приведенном ниже коде:
I = im2double(imread('http://i.stack.imgur.com/ACRE8.png')); %// Load in sample image that was corrupted by noise
r = 2; %// Parameters for the Guided image filter
eps = 0.1^2;
%// Filter the image, using itself as a guide
q = guidedfilter(I, I, r, eps);
%// Show the original image and the filtered result
figure;
subplot(1,2,1); imshow(I, []);
subplot(1,2,2); imshow(q, []);
Мы показываем исходное изображение, затем результат управляемого фильтра справа:
![введите здесь описание изображения](https://i.stack.imgur.com/UGSy0.png)
Получив это, попробуйте использовать любой канонический детектор краев для обнаружения краев. Тот, который вы используете, предварительно размывает изображение перед поиском краев, но он использует стандартное сглаживание и пропускает некоторые края. Поскольку использование фильтра управляемого изображения приводит нас к точке, в которой края сохраняются, а общее изображение практически лишено шумов, мы можем попробовать что-то простое, например фильтр Собеля, на результате сглаживания краев:
[Gmag,~] = imgradient(q, 'sobel');
imshow(max(Gmag(:)) - Gmag,[]);
В приведенном выше коде используется imgradient
для поиска градиентов изображения, а затем мы показываем изображение, инвертируя интенсивность, чтобы черные значения стали белыми, а белые стали черными, как показано в вашем примере.
... и мы получаем это:
![введите здесь описание изображения](https://i.stack.imgur.com/vN978.png)
Как видите, даже при наличии шума нам все же удалось сгладить множество краев.
13.08.2015