第5章 Python 数字图像处理(DIP) - 图像复原与重建15 - 最小均方误差(维纳)滤波

标题

    • 最小均方误差(维纳)滤波

最小均方误差(维纳)滤波

目标是求未污染图像fff的一个估计f^\hat{f}f^,使它们之间的均方误差最小。
e2=E{(f−f^)2}(5.80)e^2 = E \big\{(f - \hat{f})^2 \big\} \tag{5.80}e2=E{(ff^)2}(5.80)

误差函数的最小值在频率域中的表达比如下:
F^(u,v)=[H∗(u,v)Sf(u,v)Sf(u,v)∣H(u,v)∣2+Sη(u,v)]G(u,v)=[H∗(u,v)∣H(u,v)∣2+Sη(u,v)/Sf(u,v)]G(u,v)=[1H(u,v)∣H(u,v)∣2∣H(u,v)2+K]G(u,v)(5.81)\begin{aligned} \hat{F}(u, v) & = \Bigg[\frac{H^*(u, v) S_{f}(u, v)}{S_{f}(u, v)|H(u, v)|^2 + S_{\eta}(u, v)} \Bigg] G(u, v) \\ & = \Bigg[\frac{H^*(u, v) }{|H(u, v)|^2 + S_{\eta}(u, v) / S_{f}(u, v)} \Bigg] G(u, v) \\ & = \Bigg[\frac{1}{H(u,v)} \frac{|H(u,v)|^2}{|H(u,v)^2 + K} \Bigg]G(u,v) \end{aligned} \tag{5.81}F^(u,v)=[Sf(u,v)H(u,v)2+Sη(u,v)H(u,v)Sf(u,v)]G(u,v)=[H(u,v)2+Sη(u,v)/Sf(u,v)H(u,v)]G(u,v)=[H(u,v)1H(u,v)2+KH(u,v)2]G(u,v)(5.81)

注:逆滤波与维纳滤波都要求未退化图像和噪声的功率谱是已知的。

# 运动模糊PSF与谱
fft_shift = np.fft.fftshift(PSF)
fft = np.fft.fft2(PSF)
spect = spectrum_fft(fft)
plt.figure(figsize=(8, 8))
plt.subplot(1,2,1), plt.imshow(PSF, 'gray')
plt.subplot(1,2,2), plt.imshow(spect, 'gray')
plt.show()
# 仿真运动模糊
def motion_process(image_size, motion_angle, degree=15):"""This function has some problem"""PSF = np.zeros(image_size)
#     print(image_size)center_position=(image_size[0]-1)/2
#     print(center_position)slope_tan=math.tan(motion_angle*math.pi/180)slope_cot=1/slope_tanif slope_tan<=1:for i in range(degree):offset=round(i*slope_tan)    #((center_position-i)*slope_tan)PSF[int(center_position+offset),int(center_position-offset)]=1return PSF / PSF.sum()  #对点扩散函数进行归一化亮度else:for i in range(degree):offset=round(i*slope_cot)PSF[int(center_position-offset),int(center_position+offset)]=1return PSF / PSF.sum()def get_motion_dsf(image_size, motion_angle, motion_dis):"""Get motion PSFparam: image_size: input image shapeparam: motion_angle: blur motion angleparam: motion_dis: blur distant, the greater value, more blurredreturn normalize PSF"""PSF = np.zeros(image_size)  # 点扩散函数x_center = (image_size[0] - 1) / 2y_center = (image_size[1] - 1) / 2sin_val = np.sin(motion_angle * np.pi / 180)cos_val = np.cos(motion_angle * np.pi / 180)# 将对应角度上motion_dis个点置成1for i in range(motion_dis):x_offset = round(sin_val * i)y_offset = round(cos_val * i)PSF[int(x_center - x_offset), int(y_center + y_offset)] = 1return PSF / PSF.sum()    # 归一化# 对图片进行运动模糊
def make_blurred(input, PSF, eps):"""blurred image with PSFparam: input: input imageparam: PSF: input PSF maskparam: eps: epsilon, very small value, to make sure not divided or multiplied by zeroreturn blurred image"""input_fft = np.fft.fft2(input)              #  image FFTPSF_fft = np.fft.fft2(PSF)+ eps             # PSF FFT plus epsilonblurred = np.fft.ifft2(input_fft * PSF_fft) # image FFT multiply PSF FFTblurred = np.abs(np.fft.fftshift(blurred))return blurreddef inverse_filter(input, PSF, eps): """inverse filter using FFT to denoiseparam: input: input imageparam: PSF: known PSFparam: eps: epsilon"""input_fft = np.fft.fft2(input)PSF_fft = np.fft.fft2(PSF) + eps           #噪声功率,这是已知的,考虑epsilonresult = np.fft.ifft2(input_fft / PSF_fft) #计算F(u,v)的傅里叶反变换result = np.abs(np.fft.fftshift(result))return resultdef wiener_filter(input, PSF, eps, K=0.01):"""wiener filter for image denoiseparam: input: input imageparam: PSF: input the PSF maskparam: eps: epsilonparam: K=0.01: K value for wiener fuctionreturn image after wiener filter"""input_fft = np.fft.fft2(input)PSF_fft = np.fft.fft2(PSF) + epsPSF_fft_1 = np.conj(PSF_fft) / (np.abs(PSF_fft)**2 + K)# 按公式,居然得不到正确的值
#     PSF_abs = PSF * np.conj(PSF)
#     PSF_fft_1 = (1 / (PSF + eps)) * (PSF_abs / (PSF_abs + K))result = np.fft.ifft2(input_fft * PSF_fft_1)result = np.abs(np.fft.fftshift(result))return result# 要实现的功能都在这里调用
if __name__ == "__main__":image = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif', 0)# 显示原图像plt.figure(1, figsize=(6, 6))plt.title("Original Image"), plt.imshow(image, 'gray')plt.xticks([]), plt.yticks([])plt.figure(2, figsize=(18, 12))# 进行运动模糊处理PSF = get_motion_dsf(image.shape[:2], -50, 100)blurred = make_blurred(image, PSF, 1e-3)plt.subplot(231), plt.imshow(blurred, 'gray'), plt.title("Motion blurred")plt.xticks([]), plt.yticks([])# 逆滤波result = inverse_filter(blurred, PSF, 1e-3)   plt.subplot(232), plt.imshow(result, 'gray'), plt.title("inverse deblurred")plt.xticks([]), plt.yticks([])# 维纳滤波result = wiener_filter(blurred, PSF, 1e-3)     plt.subplot(233), plt.imshow(result, 'gray'), plt.title("wiener deblurred(k=0.01)")plt.xticks([]), plt.yticks([])# 添加噪声,standard_normal产生随机的函数blurred_noisy = blurred + 0.1 * blurred.std() * np.random.standard_normal(blurred.shape)   # 显示添加噪声且运动模糊的图像plt.subplot(234), plt.imshow(blurred_noisy, 'gray'), plt.title("motion & noisy blurred")plt.xticks([]), plt.yticks([])# 对添加噪声的图像进行逆滤波result = inverse_filter(blurred_noisy, PSF, 0.1 + 1e-3)    plt.subplot(235), plt.imshow(result, 'gray'), plt.title("inverse deblurred")plt.xticks([]), plt.yticks([])# 对添加噪声的图像进行维纳滤波result = wiener_filter(blurred_noisy, PSF, 0.1 + 1e-3)         plt.subplot(236), plt.imshow(result, 'gray'), plt.title("wiener deblurred(k=0.01)")plt.xticks([]), plt.yticks([])plt.tight_layout()plt.show()

在这里插入图片描述

在这里插入图片描述

# 要实现的功能都在这里调用
if __name__ == "__main__":image = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif', 0)# 显示原图像plt.figure(1, figsize=(6, 6))plt.title("Original Image"), plt.imshow(image, 'gray')plt.xticks([]), plt.yticks([])plt.figure(2, figsize=(18, 12))# 进行运动模糊处理PSF = get_motion_dsf(image.shape[:2], -45, 95)blurred = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0529(d)(medium_noise_var_pt01).tif', 0)plt.subplot(231), plt.imshow(blurred, 'gray'), plt.title("Motion blurred")plt.xticks([]), plt.yticks([])# 逆滤波result = inverse_filter(blurred, PSF, 1e-3)   plt.subplot(232), plt.imshow(result, 'gray'), plt.title("inverse deblurred")plt.xticks([]), plt.yticks([])# 维纳滤波result = wiener_filter(blurred, PSF, 1e-3, K=0.01)     plt.subplot(233), plt.imshow(result, 'gray'), plt.title("wiener deblurred(k=0.01)")plt.xticks([]), plt.yticks([])# 添加噪声,standard_normal产生随机的函数blurred_noisy = blurred + 0.1 * blurred.std() * np.random.standard_normal(blurred.shape)   # 显示添加噪声且运动模糊的图像plt.subplot(234), plt.imshow(blurred_noisy, 'gray'), plt.title("motion & noisy blurred")plt.xticks([]), plt.yticks([])# 对添加噪声的图像进行逆滤波result = inverse_filter(blurred_noisy, PSF, 0.1 + 1e-3)    plt.subplot(235), plt.imshow(result, 'gray'), plt.title("inverse deblurred")plt.xticks([]), plt.yticks([])# 对添加噪声的图像进行维纳滤波result = wiener_filter(blurred_noisy, PSF, 0.1 + 1e-3)         plt.subplot(236), plt.imshow(result, 'gray'), plt.title("wiener deblurred(k=0.01)")plt.xticks([]), plt.yticks([])plt.tight_layout()plt.show()

在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

入网许可证_入网许可证怎么办理,申请流程

移动通信系统及终端投资项目核准的若干规定》的出台&#xff0c;打开了更多企业进入手机业的大门&#xff0c;然而一些企业在关心拿到手机牌照后&#xff0c;是不是就是意味了拿到入网许可证&#xff0c;就可以上市销售。某些厂商认为:"手机牌照实行核准制&#xff0c;意味…

OpenGL编程低级错误范例手册

看到一篇OpenGL编程的错误总结&#xff0c;对我初学来说应该比较有用&#xff0c;先保留&#xff0c;嘿嘿... 谢谢原文作者的贡献&#xff1a;http://www.cnitblog.com/linghuye/archive/2005/08/13/1845.html 1.没有glDisable(GL_TEXTURE_2D),导致基本几何作图全部失败。 2.镜…

C/C++ 中变量的声明、定义、初始化的区别

今天突然思考到这样的一个问题&#xff0c;发现已经在学习或者编写程序的时候压根就没有注意到这些&#xff0c;经过比较这些还是有很大的区别的。 int i;//声明 不分配地址空间 int j1&#xff1b;//转载于:https://www.cnblogs.com/kuoyan/p/3687391.html

使用python matplotlib画图

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/52577631 未经博主允许不得转载。 博主地址是&#xff1a;http://blog.csdn.net/freewebsys 1&#xff0c;关于 非常简单的画图类库。 简直就是matlab的命令了。 python设计都是非常简单的。 在使用pyt…

碧桂园博智林机器人总部大楼_碧桂园职院新规划曝光!将建机器人实训大楼、新宿舍、水幕电影等...

4月10日&#xff0c;广东碧桂园职业学院召开院务(扩大)会议&#xff0c;学院党政班子领导和相关负责人出席。会议集中观看了学院四期工程的规划区介绍&#xff0c;并就具体方案的可行性进行了研讨。在碧桂园集团董事局主席杨国强先生的带领下&#xff0c;碧桂园职院正紧随集团产…

第5章 Python 数字图像处理(DIP) - 图像复原与重建16 - 约束最小二乘方滤波、几何均值滤波

标题约束最小二乘方滤波几何均值滤波约束最小二乘方滤波 F^(u,v)[H∗(u,v)∣H(u,v)∣2γ∣P(u,v)∣2]G(u,v)(5.89)\hat{F}(u,v) \bigg[\frac{H^*(u,v)}{|H(u,v)|^2 \gamma |P(u,v)|^2} \bigg]G(u,v) \tag{5.89}F^(u,v)[∣H(u,v)∣2γ∣P(u,v)∣2H∗(u,v)​]G(u,v)(5.89) P(u,…

securecrt是什么工具_比较一下几款常用的SSH工具

WX众号&#xff1a;基因学苑Q群&#xff1a;32798724更多精彩内容等你发掘&#xff01;编者按工欲善其事&#xff0c;必先利其器。作为生物信息分析人员&#xff0c;每天都需要通过SSH工具远程登录服务器&#xff0c;那么使用一款高效的连接工具就很有必要。这次我们来点评一下…

华为手机如何调时间显示_华为手机照片如何出现时间地点天气,教你30秒,一学就会...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都会有分享&#xff0c;都是免费订阅&#xff0c;请您放心关注。 …

Dreamweaver使用详解

1&#xff1a;dreamweaver的基本功能&#xff0c;其中各种功能的灵活使用 转载于:https://www.cnblogs.com/snowhumen/archive/2012/08/01/2618480.html

第5章 Python 数字图像处理(DIP) - 图像复原与重建17 - 由投影重建图像、雷登变换、投影、反投影、反投影重建

标题由投影重建图像投影和雷登变换 Johann Radon反投影滤波反投影重建由投影重建图像 本由投影重建图像&#xff0c;主要是雷登变换与雷登把变换的应用&#xff0c;所以也没有太多的研究&#xff0c;只为了保持完整性&#xff0c;而添加到这里。 # 自制旋转投影图像# 模拟一个…

NFC

NFC近场通信技术是由非接触式射频识别&#xff08;RFID&#xff09;及互联互通技术整合演变而来&#xff0c;在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能&#xff0c;能在短距离内与兼容设备进行识别和数据交换。 场通信是一种短距高频的无线电技术&#xff0c;在…

day12-nginx

nginx 前台服务器并发大 安装nginx useradd –s /sbin/nologin nginx tar xf nginx-xxx.tar.gz yum install –y gcc pcre-devel openssl-devel ./configure --prefix/etc/nginx --usernginx --groupnginx --with-http_ssl_module --http-log-path/var/log/nginx/access.…

python args_Python可变参数*args和**kwargs用法实例小结

本文实例讲述了Python可变参数*args和**kwargs用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 一句话简单概括&#xff1a;当函数的参数不确定的时候就需要用到*args和**kwargs&#xff0c;前者和后者的区别在于&#xff0c;后者引入了”可变”key的概念&#xf…

文件组备份还原

-- 参考 USE master; GO-- 测试的DB CREATE DATABASE DB_Test ON PRIMARY(NAME DB_Test,FILENAME C:\DB_Test.mdf ), FILEGROUP FG1 (NAME DB_Test_FG1,FILENAME C:\DB_Test_fg1.ndf ), FILEGROUP FG2 (NAME DB_Test_FG2,FILENAME C:\DB_Test_fg2.ndf ) LOG ON(NAME DB_…

php调用c++

1.在/var/www中建个测试文件夹 cpp 在此文件夹中新建c文件sort.cpp&#xff0c;如下 编译并测试执行通过进行以下步骤。 2.在cpp文件夹下新建文件cpp.html&#xff0c;如下 3.同样在cpp下建php文件cpp.php&#xff0c;如下 保存。 4.程序执行如下 提交后&#xff1a; 转载于:ht…

AI+无线通信——Top7 (Baseline)分享与总结

从浩哥那里转载 https://wanghao.blog.csdn.net/article/details/115813954 比赛已经告一段落&#xff0c;现在我们队兑现承诺&#xff0c;将比赛方案开源给大家&#xff0c;互勉互助&#xff0c;共同进步。 队伍介绍 我们的队伍名是Baseline&#xff0c;我们因分享Baseline…

拼字符串成为时间,和两个计算时间点的中间值

拼字符串成为时间&#xff0c;和两个计算时间点的中间值 select convert(datetime,2016-09-18 SUBSTRING(CONVERT(varchar(100),d_bdate, 24), 0, 9),21) from B2C_daima where d_noB04 select case when Datename(hour,d_edate)> Datename(hour,d_bdate) then convert(dat…

tornado post第3方_[33]python-Web-框架-Tornado

1.TornadoTornado&#xff1a;python编写的web服务器兼web应用框架1.1.Tornado的优势轻量级web框架异步非阻塞IO处理方式出色的抗负载能力优异的处理性能&#xff0c;不依赖多进程/多线程&#xff0c;一定程度上解决C10K问题WSGI全栈替代产品&#xff0c;推荐同时使用其web框架…

android 串口调试工具_树莓派通用串口通信实验

一、介绍对于树莓派 3B来说&#xff0c;他的UART功能有三种&#xff1a;1、内部蓝牙使用&#xff1b;2、控制终端使用&#xff1b;3、与其他设备进行串口通信。在树莓派USB TO TTL模块实验中学习了通过串口对树莓派进行控制台控制&#xff0c;让串口作为控制终端调试口即 seria…

Laravel5.2目录结构及composer.json文件解析

目录或文件说明&#xff5c;– app包含Controller、Model、路由等在内的应用目录&#xff0c;大部分业务将在该目录下进行&#xff5c;  &#xff5c;– Console命令行程序目录&#xff5c;  &#xff5c;  &#xff5c;– Commands包含了用于命令行执行的类&#xff…