matlab实现各向异性扩散

看书一直不理解各向异性扩散究竟是什么,直到看了某大佬的解释:

主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像)。

通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的。

这次新鲜,将图像看作热量场了。每个像素看作热流,根据当前像素和周围像素的关系,来确定是否要向周围扩散。比如某个邻域像素和当前像素差别较大,则代表这个邻域像素很可能是个边界,那么当前像素就不向这个方向扩散了,这个边界也就得到保留了。

大佬博客在此

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);
           

 效果图

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值