基于MATLAB的模糊图像复原

基于MATLAB的模糊图像复原需针对不同退化类型(运动模糊、椒盐噪声)设计针对性算法。


一、运动模糊复原

1. 数学模型与PSF估计

运动模糊图像退化模型为:

g(x,y)=f(x,y)∗h(x,y)+n(x,y)g(x,y)=f(x,y)∗h(x,y)+n(x,y)g(x,y)=f(x,y)∗h(x,y)+n(x,y)

其中h(x,y)h(x,y)h(x,y)为点扩散函数(PSF),形状由运动方向和长度决定。PSF估计是复原关键:

  • 频域分析法:通过傅里叶变换检测频谱中的平行暗线,计算运动角度与长度。
  • 二次变换法:对频谱进行对数变换与Radon变换,精确提取PSF参数。
2. 复原算法实现

(1) 维纳滤波(Wiener Filter)

  • 原理:最小化均方误差,平衡去模糊与噪声抑制。

  • MATLAB代码

    matlab 复制代码
    function restored = wiener_filter(blurred, psf, K)
        blurred_fft = fft2(blurred);
        psf_fft = fft2(psf);
        psf_conj = conj(psf_fft);
        denominator = abs(psf_fft).^2 + K;
        restored_fft = (psf_conj ./ denominator) .* blurred_fft;
        restored = real(ifft2(restored_fft));
    end
  • 参数选择:K通过噪声方差与信号功率比估计。

(2) 基于深度学习的盲复原

  • U-Net架构:编码器提取特征,解码器重建清晰图像,跳跃连接保留细节。

  • 训练流程

    matlab 复制代码
    net = unet(256,256,1); % 输入为灰度图像
    net = trainNetwork(trainingData, layers, options);
    restored = predict(net, blurred);
  • 数据增强:模拟不同运动模糊参数生成训练集。


二、椒盐噪声复原

1. 噪声特性与预处理

椒盐噪声表现为随机黑白像素,需先进行去噪:

  • 中值滤波:对局部区域取中值,保留边缘信息。

    matlab 复制代码
    denoised = medfilt2(noisy_img, [3,3]);
  • 自适应TV-L1模型:结合全变差正则化与L1保真度,处理高密度噪声。

    matlab 复制代码
    % 使用Primal-Dual梯度法求解
    [u, ~] = imtvdenoise(noisy_img, lambda, 'Method', 'primal-dual');
2. 联合去噪与复原
  • 两步法:先中值滤波去噪,再用维纳滤波复原。

  • 联合模型:构建含噪声与模糊的联合正则化模型:

    使用交替方向乘子法(ADMM)求解。


三、综合实现流程

  1. 输入图像预处理: 转换为灰度图像。 检测噪声类型(椒盐噪声用中值滤波,高斯噪声用高斯滤波)。
  2. 运动模糊参数估计: 频域分析或深度学习模型(如CNN)估计PSF。
  3. 复原算法选择: 低噪声:维纳滤波 + 中值滤波。 高噪声:深度学习盲复原(如U-Net)。
  4. 后处理优化: 边缘增强(Unsharp Mask)。 超分辨率重建(ESPCN模型)。

参考代码 实现模糊图像的复原,运动模糊复原,椒盐噪声复原 www.youwenfan.com/contentcsi/64279.html

四、MATLAB工具与代码示例

  1. PSNR计算

    matlab 复制代码
    function psnr_val = psnr(orig, restored)
        mse = mean((orig(:) - restored(:)).^2);
        if mse == 0
            psnr_val = Inf;
        else
            psnr_val = 10 * log10(255^2 / mse);
        end
    end
  2. 运动模糊PSF生成

    matlab 复制代码
    function psf = motion_psf(size, angle, length)
        psf = zeros(size);
        center = floor(size/2);
        rad = deg2rad(angle);
        for i = 1:length
            x = round(center + i*cos(rad));
            y = round(center + i*sin(rad));
            if x > 0 && x <= size(2) && y > 0 && y <= size(1)
                psf(y,x) = 1/length;
            end
        end
    end

五、应用场景与优化建议

  • 实时处理:使用简化U-Net或FFT加速的维纳滤波。
  • 医学影像:结合非局部均值滤波与深度学习,保留细节。
  • 卫星图像:多尺度分解(小波+BM3D)处理混合噪声。
相关推荐
灯澜忆梦6 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-7 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-7 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
段一凡-华北理工大学10 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe10 小时前
C++——多态
开发语言·c++
心平气和量大福大11 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
从零开始的代码生活_12 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸12 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地13 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis