【图像去噪的扩散滤波】图像线性扩散滤波、边缘增强线性和非线性各向异性滤波(Matlab代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

一、扩散滤波技术概述

二、线性扩散滤波:基本原理与局限

2.1 数学模型与实现

2.2 应用与局限性

三、边缘增强线性扩散滤波:改进与局限

3.1 设计原理

3.2 性能分析

四、非线性各向异性扩散滤波:理论与创新

4.1 基本原理

4.3 改进方法

五、关键对比:数学模型与性能指标

5.1 数学模型差异

5.2 性能指标对比

六、研究挑战与前沿方向

七、结论

📚2 运行结果

2.1 non_aniso

2.2 inhomo_iso

2.3 heat_imp

2.4 heat_explicit

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

【图像去噪的扩散滤波】图像线性扩散滤波、边缘增强线性和非线性各向异性滤波

各种基于扩散的图像滤波方法:
1.使用热方程的线性扩散滤波 - 使用隐式和显式欧拉方法求解。
2. 边缘增强线性各向异性扩散滤波。
3. 边缘增强非线性各向异性扩散滤波。

一、扩散滤波技术概述

扩散滤波基于热传导物理模型,通过控制像素间的扩散过程平滑噪声,同时恢复图像结构。其核心方程为偏微分方程(PDE):

其中 U 为图像灰度场,D 为扩散系数(或张量),∇ 为梯度算子,div⁡ 为散度算子。根据 D 的设计,可分为三类:

  1. 线性扩散滤波(D 为常数)
  2. 边缘增强线性扩散滤波(线性滤波 + 边缘算子预处理)
  3. 非线性各向异性扩散滤波(D 为梯度或结构的函数)

二、线性扩散滤波:基本原理与局限

2.1 数学模型与实现
2.2 应用与局限性
  • 应用场景:深度结构分析、多尺度分割、立体匹配 。
  • 核心局限
    • 边缘模糊:各向同性扩散导致重要特征(如边缘)失真。
    • 尺度空间特性丢失:无法区分噪声与结构 。

三、边缘增强线性扩散滤波:改进与局限

3.1 设计原理

线性滤波基础上引入边缘增强算子,通过预处理或后处理保留细节:

  1. 边缘检测:使用 Sobel、Prewitt 或 Laplacian 算子提取边缘。
  2. 增强处理:在边缘区域抑制平滑强度,非边缘区域正常扩散 。
3.2 性能分析
  • 优势:较纯线性滤波更好保留边缘轮廓。
  • 局限
    • 噪声误判:强噪声梯度可能超过真实边缘梯度,导致边缘被平滑 。
    • 参数依赖:扩散系数 λλ 和迭代次数 tt 需手动调优,自适应性差 。

四、非线性各向异性扩散滤波:理论与创新

4.1 基本原理
4.3 改进方法
  • 多尺度扩散:在不同尺度处理噪声与细节 。
  • 正则化:避免阶梯效应(阶梯状伪影) 。
  • 小波融合:结合小波分解分离高低频分量,提升扩散准确性 。

五、关键对比:数学模型与性能指标

5.1 数学模型差异
特征线性扩散边缘增强线性非线性各向异性
扩散方程∂U∂t=ΔU∂t∂U​=ΔU线性滤波 + 边缘算子div⁡(g⋅∇U)div(g⋅∇U)
扩散系数 DD常数(标量)常数梯度/结构的函数(标量或张量)
各向异性
计算复杂度
5.2 性能指标对比
指标线性扩散边缘增强线性非线性各向异性
去噪能力强(均匀噪声)强(自适应噪声)
边缘保留
细节增强局部增强结构定向增强
参数敏感性高(kk, tt 需调优)
抗强噪声能力中(需改进模型)

:非线性方法在边缘保护上显著优于线性方法,但面临阶梯效应和参数敏感性问题 。


六、研究挑战与前沿方向

  1. 参数自适应
    • 通过机器学习动态优化 kk 和迭代次数 tt,减少人工干预 。
  2. 噪声鲁棒性
    • 结合高斯预平滑梯度计算,避免强噪声误判为边缘 。
  3. 多模态融合
    • 联合小波、总变分(TV)或深度学习模型提升细节保留能力 。
  4. 应用扩展
    • 地震数据(断层增强)、医学影像(血管分割)、无人机影像(边缘检测) 。

七、结论

扩散滤波技术通过物理启发的偏微分方程模型,在图像去噪领域形成完整体系:

  • 线性扩散:计算高效但边缘模糊,适用于均匀噪声场景。
  • 边缘增强线性:改进边缘保留,但强噪声下性能下降。
  • 非线性各向异性:通过方向敏感扩散实现最优权衡,是当前研究主流,Weickert张量模型进一步提升了纹理保护能力。

未来研究需聚焦于参数自适应设计噪声鲁棒性优化跨模态算法融合,以推动其在实时高精度图像处理中的应用。

📚2 运行结果

2.1 non_aniso

2.2 inhomo_iso

2.3 heat_imp

2.4 heat_explicit

部分代码:

% set up finite difference parameters
alpha =.5;
k = 1;
h = 1;

lambda = (alpha^2)*(k/(h^2));

[m n] = size(w);
%stick image into a vector
w_vec = reshape(w,n*n,1);
w_old = w;
w_new = w;

%smooth the image
im_smth = filter_function(w,1);
im_smth = im_smth';
% required for g() calculation
[dx_im_smth dy_im_smth] = gradient(im_smth);
gr_im_smth = dx_im_smth.^2 + dy_im_smth.^2;

[mmm nnn] = size(gr_im_smth);
% g() calculation
for i=1:mmm
    for j=1:nnn
        g(i,j) = 1/(1+(gr_im_smth(i,j)/32));
    end
end
%g = g';
jj=1;

[im_sx im_sy]  = gradient(im_smth);
% diffusion tensor D is preconputed here
D = zeros(n*n,2,2);
for i=1:n*n
    row = ceil(i/n);
    col = i - (row-1) * n;
  %  if((col > 1) && (col < n) && (row > 1) && (row < n))
        
        % choose eigenvector parallel and perpendicular to gradient
        eigen_vec = [im_sx(row,col) im_sy(row,col); im_sy(row,col) -im_sx(row,col) ];
        %choose eigenvalues
        eigen_vec(:,1) = eigen_vec(:,1) ./ norm(eigen_vec(:,1));
        eigen_vec(:,2) = eigen_vec(:,2) ./ norm(eigen_vec(:,2));
        eigen_val = [g(row,col) 0;0 1];
        
        % form diffusion tensor
        D(i,:,:) = eigen_vec * eigen_val * (eigen_vec');        
        % end
end

figure;
for k=1:400 % for each iteration
    for i=1:n*n % solve using Jacobi iterations scheme
        row = ceil(i/n); %compute what row this pixel belongs to in original image
        col = i - (row-1) * n; % compute cols similarly

        %different if conditions handles pixels at different location in
        %the image as depending on their location they may or may not have
        %all their neighbor pixels which will be required for finite
        %differences
        
        if((col > 1) && (col < n) && (row > 1) && (row < n))
            
            s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) +  ...
                (D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
            w_new(i) = (-s + w_old(i))/(1 + lambda * (2 * D(i,1,1) + 2 * D(i,2,2) - D(i,1,2) - D(i,2,1)));
            
        elseif((row == 1) && (col > 1) && (col < n))
            s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) +  ...
                ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
            
            %s = -(lambda) * (w_old(i+1) + w_old(i-1) + w_old(i+n));
            w_new(i) = (-s + w_old(i))/(1+4*lambda);
        elseif((row == n) && (col > 1) && (col < n))
            s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) +  ...
                (D(i,2,2) * w_old(i-n)));
            
            %s = -(lambda) * (w_old(i+1) + w_old(i-1) + w_old(i-n));
            w_new(i) = (-s + w_old(i))/(1+4*lambda);
        elseif((col == 1) && (row > 1) && (row < n))
            s = -lambda * (((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) +  ...
                (D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
            
            %s = -(lambda) * (w_old(i+1) + w_old(i+n) + w_old(i-n));
            w_new(i) = (-s + w_old(i))/(1+4*lambda);
        elseif((col == n) && (row > 1) && (row < n))
            s = -lambda * ((D(i,1,1) * w_old(i-1)) +  ...
                (D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))));            
            %s = -(lambda) * (w_old(i-1) + w_old(i+n) + w_old(i-n));
            w_new(i) = (-s + w_old(i))/(1+4*lambda);
        elseif((col==1) && (row==1))

% set up finite difference parameters
alpha =.5;
k = 1;
h = 1;

lambda = (alpha^2)*(k/(h^2));

[m n] = size(w);
%stick image into a vector
w_vec = reshape(w,n*n,1);
w_old = w;
w_new = w;

%smooth the image
im_smth = filter_function(w,1);
im_smth = im_smth';
% required for g() calculation
[dx_im_smth dy_im_smth] = gradient(im_smth);
gr_im_smth = dx_im_smth.^2 + dy_im_smth.^2;

[mmm nnn] = size(gr_im_smth);
% g() calculation
for i=1:mmm
    for j=1:nnn
        g(i,j) = 1/(1+(gr_im_smth(i,j)/32));
    end
end
%g = g';
jj=1;

[im_sx im_sy]  = gradient(im_smth);
% diffusion tensor D is preconputed here
D = zeros(n*n,2,2);
for i=1:n*n
    row = ceil(i/n);
    col = i - (row-1) * n;
  %  if((col > 1) && (col < n) && (row > 1) && (row < n))
        
        % choose eigenvector parallel and perpendicular to gradient
        eigen_vec = [im_sx(row,col) im_sy(row,col); im_sy(row,col) -im_sx(row,col) ];
        %choose eigenvalues
        eigen_vec(:,1) = eigen_vec(:,1) ./ norm(eigen_vec(:,1));
        eigen_vec(:,2) = eigen_vec(:,2) ./ norm(eigen_vec(:,2));
        eigen_val = [g(row,col) 0;0 1];
        
        % form diffusion tensor
        D(i,:,:) = eigen_vec * eigen_val * (eigen_vec');        
        % end
end

figure;
for k=1:400 % for each iteration
    for i=1:n*n % solve using Jacobi iterations scheme
        row = ceil(i/n); %compute what row this pixel belongs to in original image
        col = i - (row-1) * n; % compute cols similarly

        %different if conditions handles pixels at different location in
        %the image as depending on their location they may or may not have
        %all their neighbor pixels which will be required for finite
        %differences
        
        if((col > 1) && (col < n) && (row > 1) && (row < n))
            
            s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) +  ...
                (D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
            w_new(i) = (-s + w_old(i))/(1 + lambda * (2 * D(i,1,1) + 2 * D(i,2,2) - D(i,1,2) - D(i,2,1)));
            
        elseif((row == 1) && (col > 1) && (col < n))
            s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) +  ...
                ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
            
            %s = -(lambda) * (w_old(i+1) + w_old(i-1) + w_old(i+n));
            w_new(i) = (-s + w_old(i))/(1+4*lambda);
        elseif((row == n) && (col > 1) && (col < n))
            s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) +  ...
                (D(i,2,2) * w_old(i-n)));
            
            %s = -(lambda) * (w_old(i+1) + w_old(i-1) + w_old(i-n));
            w_new(i) = (-s + w_old(i))/(1+4*lambda);
        elseif((col == 1) && (row > 1) && (row < n))
            s = -lambda * (((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) +  ...
                (D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
            
            %s = -(lambda) * (w_old(i+1) + w_old(i+n) + w_old(i-n));
            w_new(i) = (-s + w_old(i))/(1+4*lambda);
        elseif((col == n) && (row > 1) && (row < n))
            s = -lambda * ((D(i,1,1) * w_old(i-1)) +  ...
                (D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))));            
            %s = -(lambda) * (w_old(i-1) + w_old(i+n) + w_old(i-n));
            w_new(i) = (-s + w_old(i))/(1+4*lambda);
        elseif((col==1) && (row==1))

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]张建伟,王译禾,陈允杰.基于非线性扩散滤波结构信息的图像去噪方法[J].计算机工程与设计, 2016, 37(11):8.DOI:10.16208/j.issn1000-7024.2016.11.021.

[2]文武,苗放.复数域非线性扩散滤波在图像处理中的应用[J].微电子学与计算机, 2012.DOI:CNKI:SUN:WXYJ.0.2012-06-015.

[3]傅艳莉,李超,陈浩,等.各向异性扩散滤波远探测声波测井图像降噪方法[J].应用声学, 2022, 41(4):10.

[4]许韬.非线性扩散图像混合滤波去噪方法研究[J].计算机仿真, 2020, 037(012):460-464.

[5]李志伟,冯象初.维纳滤波和非线性扩散相结合的图像去噪[J].电子科技, 2007(9):4.DOI:10.3969/j.issn.1007-7820.2007.09.016.

🌈4 Matlab代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值