圖像各向異性平滑濾波
- 介紹
-
- 原了解析
- 實作
介紹
圖像進行中先驗知識較少的情況下,需要在保留圖像邊緣資訊下同時對圖像進行平滑,可以采用将越明顯的邊緣減少平滑率的方式進行濾波,就是今天要講的PM各向異性擴散濾波。
https://max.book118.com/html/2018/0913/6034150213001215.shtm
https://wenku.baidu.com/view/9c2897cbf78a6529657d5391.html
原了解析
通過疊代計算最佳擴散平滑尺度,
一般疊代1到100次,可以通過擷取的最佳效果來決定。
實作
function [filtmap2d] = anisotropicfiltering(map2d, iterations, lambda, contrastK, smoothsigma, Dosharpenfirst, sharpensigma)
%ANISOTROPICFILTER 此處顯示有關此函數的摘要
% 此處顯示詳細說明
if iterations <= 0
iterations = 100;
end
if smoothsigma <= 0
smoothsigma = 2;
end
smoothfilt = fspecial('gaussian',ceil(6*smoothsigma),smoothsigma);
contrastK_square = contrastK^2;
if Dosharpenfirst == true
result_map2d = tools_sharpen(grapmap3d, sharpensigma);
result_map2d(result_map2d < 0) = 0;
result_map2d = result_map2d / 256;
else
result_map2d = map2d / 256;
end
for iter=1:iterations
Delta_N = result_map2d(1:end-2,2:end-1) - result_map2d(2:end-1,2:end-1);
Delta_S = result_map2d(3:end,2:end-1) - result_map2d(2:end-1,2:end-1);
Delta_E = result_map2d(2:end-1,3:end) - result_map2d(2:end-1,2:end-1);
Delta_W = result_map2d(2:end-1,1:end-2) - result_map2d(2:end-1,2:end-1);
% % % PM filter
g_N = exp(-(Delta_N.^2)/contrastK_square);
g_S = exp(-(Delta_S.^2)/contrastK_square);
g_E = exp(-(Delta_E.^2)/contrastK_square);
g_W = exp(-(Delta_W.^2)/contrastK_square);
% % % % catte et al filter (gaussian smoothing)
% temp_map2d = imfilter(result_map2d, smoothfilt);
% temp_Delta_N = temp_map2d(1:end-2,2:end-1) - temp_map2d(2:end-1,2:end-1);
% temp_Delta_S = temp_map2d(3:end,2:end-1) - temp_map2d(2:end-1,2:end-1);
% temp_Delta_E = temp_map2d(2:end-1,3:end) - temp_map2d(2:end-1,2:end-1);
% temp_Delta_W = temp_map2d(2:end-1,1:end-2) - temp_map2d(2:end-1,2:end-1);
% g_N = 1 ./ (1+(temp_Delta_N.^2)/contrastK_square);
% g_S = 1 ./ (1+(temp_Delta_S.^2)/contrastK_square);
% g_E = 1 ./ (1+(temp_Delta_E.^2)/contrastK_square);
% g_W = 1 ./ (1+(temp_Delta_W.^2)/contrastK_square);
result_map2d(2:end-1,2:end-1) = result_map2d(2:end-1,2:end-1) + lambda .* (g_N.*Delta_N + g_S.*Delta_S + g_E.*Delta_E + g_W.*Delta_W);
if mod(iter,5) == 0
figure;imshow(result_map2d(2:end-1,2:end-1),[]);
end
end
filtmap2d = result_map2d;
filtmap2d(1,:) = result_map2d(2,:);
filtmap2d(end,:) = result_map2d(end-1,:);
filtmap2d(:,1) = result_map2d(:,2);
filtmap2d(:,end) = result_map2d(:,end-1);
filtmap2d = (filtmap2d - min(filtmap2d(:))) / (max(filtmap2d(:)) - min(filtmap2d(:))) * 256;
end