看书一直不理解各向异性扩散究竟是什么,直到看了某大佬的解释:
主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像)。
通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的。
这次新鲜,将图像看作热量场了。每个像素看作热流,根据当前像素和周围像素的关系,来确定是否要向周围扩散。比如某个邻域像素和当前像素差别较大,则代表这个邻域像素很可能是个边界,那么当前像素就不向这个方向扩散了,这个边界也就得到保留了。
matlab脚本
pic = imread('C:\Users\lenovo\Desktop\素材\test.jpg', 'jpg');
pic = rgb2gray(pic);
picNew = PM(pic);
figure;
imshow(pic);
title('原图');
figure;
imshow(picNew);
title('各向异性扩散');
matlab各向异性扩散函数
function newPic = PM(pic)
[m n] = size(pic);
lambda = 0.15;
K = 15;
N = 20;
newPic = zeros(m, n);
pic = double(pic);
for t = 1 : N
for i = 2 : m-1
for j = 2 : n-1
NI = pic(i-1, j) - pic(i, j);
SI = pic(i+1, j) - pic(i, j);
EI = pic(i, j-1) - pic(i, j);
WI = pic(i, j+1) - pic(i, j);
cN = exp(-NI^2/K^2);
cS = exp(-SI^2/K^2);
cE = exp(-EI^2/K^2);
cW = exp(-WI^2/K^2);
%fprintf('%d %d\n', i, j);
newPic(i, j) = pic(i, j) + lambda*(NI*cN + SI*cS + EI*cE + WI*cW);
end;
end
pic = newPic;
end;
newPic = pic;
newPic = uint8(newPic);
效果图