В этом примере показано, как использовать управляемый фильтр для сглаживания изображения, уменьшения шума и сохранения ребер. В примере используются два снимка одной и той же сцены, один сделан со вспышкой, а другой - без вспышки. Версия без вспышки сохраняет цвета, но шумит из-за низких условий света. Этот пример использует версию, взятую со вспышкой, в качестве изображения руководства.
Прочтите изображение, которое вы хотите отфильтровать в рабочую область. Этот пример использует изображение некоторых игрушек, сделанных без вспышки. Из-за плохих условий освещения изображение содержит много шума.
A = imread('toysnoflash.png'); figure; imshow(A); title('Input Image - Camera Flash Off')
Прочтите изображение, которое вы хотите использовать в качестве изображения руководства, в рабочую область. В этом примере изображение руководства является изображением той же сцены, сделанным со вспышкой.
G = imread('toysflash.png'); figure; imshow(G); title('Guidance Image - Camera Flash On')
Выполните операцию направленной фильтрации. Использование imguidedfilter
функция, можно задать размер окрестности, используемой для фильтрации. По умолчанию это квадрат 5 на 5. Этот пример использует район 3х3. Можно также задать величину сглаживания, выполняемой фильтром. Значение может быть любым положительным числом. Один из способов приблизиться к этому - сначала использовать значение по умолчанию и просмотреть результаты. Если вы хотите меньше сглаживания и больше сохранения ребра, используйте более низкое значение для этого параметра. Для большего сглаживания используйте более высокое значение. Этот пример устанавливает значение параметра сглаживания.
nhoodSize = 3; smoothValue = 0.001*diff(getrangefromclass(G)).^2; B = imguidedfilter(A, G, 'NeighborhoodSize',nhoodSize, 'DegreeOfSmoothing',smoothValue); figure, imshow(B), title('Filtered Image')
Исследуйте крупным планом область оригинального изображения и сравните ее с отфильтрованным изображением, чтобы увидеть эффект этого сохраняющего край сглаживающего фильтра.
figure; h1 = subplot(1,2,1); imshow(A), title('Region in Original Image'), axis on h2 = subplot(1,2,2); imshow(B), title('Region in Filtered Image'), axis on linkaxes([h1 h2]) xlim([520 660]) ylim([150 250])