基于总变差(TV)的图像去模糊,使用总变差正则化进行图像去模糊研究(Matlab代码实现)

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

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

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

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

目录

 ⛳️赠与读者

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

图像去模糊是一项关键的图像处理任务,它旨在恢复因运动、焦距失准等原因造成模糊的图像。总变差 (Total Variation, TV) 正则化是一种常用的去模糊方法,因为它在保留图像边缘细节的同时能够有效地去除噪声。下面将介绍基于总变差正则化的图像去模糊方法。

总变差正则化简介

总变差正则化的核心思想是通过最小化图像的总变差来达到去模糊的目的。总变差定义为图像梯度的范数,即:

\[ TV(u) = \sum_{i,j} \sqrt{(u_{i+1,j} - u_{i,j})^2 + (u_{i,j+1} - u_{i,j})^2} \]

其中,\( u \) 是待恢复的图像,\( u_{i,j} \) 表示图像在位置 \((i,j)\) 处的像素值。

基于总变差正则化的图像去模糊模型

经典的基于总变差正则化的去模糊模型可以通过求解以下优化问题来实现:

\[ \min_u \left\{ \frac{1}{2} \| Ku - f \|_2^2 + \lambda TV(u) \right\} \]

其中:
- \( f \) 是模糊的观测图像。
- \( K \) 是模糊核(或卷积算子),它描述了模糊的方式。
- \( \lambda \) 是正则化参数,控制数据保真项与总变差正则化项之间的平衡。

交替方向乘子法 (ADMM)

交替方向乘子法(ADMM)是一种有效求解上述优化问题的方法,其流程可以概括如下:

1. **初始化**:初始化图像 \( u \)、辅助变量 \( v \) 和拉格朗日乘子 \( \eta \)。
2. **交替更新**:
   - 更新 \( u \):
     \[ u^{k+1} = \arg\min_u \left\{ \frac{1}{2} \| Ku - f \|_2^2 + \frac{\rho}{2} \| u - v^k + \frac{\eta^k}{\rho} \|_2^2 \right\} \]
   - 更新 \( v \):
     \[ v^{k+1} = \arg\min_v \left\{ \lambda TV(v) + \frac{\rho}{2} \| u^{k+1} - v + \frac{\eta^k}{\rho} \|_2^2 \right\} \]
   - 更新拉格朗日乘子 \( \eta \):
     \[ \eta^{k+1} = \eta^k + \rho (u^{k+1} - v^{k+1}) \]

实现步骤

1. **读取模糊图像和模糊核**。
2. **初始化参数**,包括正则化参数 \( \lambda \) 和 ADMM 参数 \( \rho \)。
3. **迭代更新** \( u \)、\( v \) 和 \( \eta \),直到收敛。
4. **输出去模糊后的图像**。

 示例代码

以下是一个简单的基于总变差正则化的图像去模糊示例代码(使用 Python 和 OpenCV):

```python
import numpy as np
import cv2
from skimage.restoration import denoise_tv_chambolle

def deblur_tv(image, kernel, lambda_tv, num_iter):
    # 初始化变量
    u = image.copy()
    v = np.zeros_like(image)
    eta = np.zeros_like(image)
    rho = 1.0

    # 预计算模糊核的傅里叶变换
    kernel_ft = np.fft.fft2(kernel, s=image.shape)
    kernel_ft_conj = np.conj(kernel_ft)

    for i in range(num_iter):
        # 更新 u
        u_ft = (np.fft.fft2(image) + rho * np.fft.fft2(v - eta / rho)) / (kernel_ft_conj * kernel_ft + rho)
        u = np.fft.ifft2(u_ft).real
        
        # 更新 v
        v = denoise_tv_chambolle(u + eta / rho, weight=lambda_tv / rho)
        
        # 更新拉格朗日乘子 eta
        eta = eta + rho * (u - v)
    
    return u

# 示例使用
image = cv2.imread('blurred_image.png', cv2.IMREAD_GRAYSCALE) / 255.0
kernel = np.ones((5, 5)) / 25  # 简单均值模糊核
deblurred_image = deblur_tv(image, kernel, lambda_tv=0.1, num_iter=50)

# 显示结果
cv2.imshow('Deblurred Image', deblurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

以上代码实现了基于总变差正则化的图像去模糊方法。你可以根据实际需求调整参数 \( \lambda \) 和迭代次数,以获得更好的去模糊效果。

📚2 运行结果

部分代码:

% Experience (numero) from paper
% Change here!!!!
numero=1;

% images
img1='cameraman.tif';
img3='lena_256.gif';


if numero==1
    h=ones(9)/81;
    sigma=0.56;
    img=double(imread(img1));
elseif(numero==2)
    h=ones(9)/81;
    sigma=0.4;
    img=255*phantom(256);
    
elseif(numero==3)
    h=[1 4 6 4 1]'*[1 4 6 4 1]/256;
    sigma=7;
    img=double(imread(img3));
elseif(numero==5)

end


% % zero noise image (not necessary)
img=img-mean(img(:));

% Blured noisy image
img_noisy=conv2c(img,h)+sigma*randn(size(img));


img_estimated=tvmm_a(img_noisy,h,'info_energyo','no','image',img, ...
    'cg_iter',200,'boa_iter',10,'info_ISNRo','yes','info_ISNRi','no','displayIm','yes');

🎉3 参考文献

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

[1]翟艳,潘振宽,魏伟波.基于法矢量雅可比的总广义变差图像修复模型[J].计算机仿真, 2022(003):039.

[2]杨夏芳.自适应加权全变差和非局部正则模型在图像重建中的应用[D].西安电子科技大学,2013.

[3]陈小莉.基于交替乘子法的图像去模糊技术研究[J].电子设计工程, 2019, 27(5):5.DOI:CNKI:SUN:GWDZ.0.2019-05-042. 

🌈4 Matlab代码实现

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值