怎么使用python实现逆滤波与维纳滤波示例-创新互联
小编给大家分享一下怎么使用python实现逆滤波与维纳滤波示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
目前创新互联已为超过千家的企业提供了网站建设、域名、网络空间、网站托管、企业网站设计、留坝网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。构建运动模糊模型
现假定相机不动,图像f(x,y)在图像面上移动并且图像f(x,y)除移动外不随时间变化。令x0(t)和y0(t)分别代表位移的x分量和y分量,那么在快门开启的时间T内,胶片上某点的总曝光量是图像在移动过程中一系列相应像素的亮度对该点作用之总和。也就是说,运动模糊图像是由同一图像在产生距离延迟后与原图像想叠加而成。如果快门开启与关闭的时间忽略不计,则有:
由于各种运动都是匀速直线运动的叠加,因而我们只需考虑匀速直线运动即可。但由于我们自身水平有限,且旨在探讨找到实现运动模糊复原方法的思想与方向,因而我们未能自行构建模型,而是借鉴了参考文献[1]中建立的运动模糊模型。关于本模型的理论依据参见参考文献[1].
下面我们描述一下该模型函数motion_process(image_size,motion_angle),它包含两个参数:图像的尺寸大小image_size以及运动的角度motion_angle。
例如,当运动位移为9、运动角度为45度时,则该模型函数的构建过程如下:
1. 首先是创建与图像同等大小的全0矩阵,然后找到全0矩阵的中心行数center_position,再计算出运动角度的tan值与cot值,算出运动的偏移量offset。
2. PSF[int(center_position+offset),int(center_position-offset)]=1
3. PSF[int(center_position-offset),int(center_position+offset)]=1
则该模型对应的图像如下图所示:
运动位移为9,运动角度分别为45°、30°、60°时,运动模糊模型对应的图像
import matplotlib.pyplot as graph import numpy as np from numpy import fft import math import cv2 # 仿真运动模糊 def motion_process(image_size,motion_angle): 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_tan if slope_tan<=1: for i in range(15): offset=round(i*slope_tan) #((center_position-i)*slope_tan) PSF[int(center_position+offset),int(center_position-offset)]=1 return PSF / PSF.sum() #对点扩散函数进行归一化亮度 else: for i in range(15): offset=round(i*slope_cot) PSF[int(center_position-offset),int(center_position+offset)]=1 return PSF / PSF.sum() #对图片进行运动模糊 def make_blurred(input, PSF, eps): input_fft = fft.fft2(input)# 进行二维数组的傅里叶变换 PSF_fft = fft.fft2(PSF)+ eps blurred = fft.ifft2(input_fft * PSF_fft) blurred = np.abs(fft.fftshift(blurred)) return blurred def inverse(input, PSF, eps): # 逆滤波 input_fft = fft.fft2(input) PSF_fft = fft.fft2(PSF) + eps #噪声功率,这是已知的,考虑epsilon result = fft.ifft2(input_fft / PSF_fft) #计算F(u,v)的傅里叶反变换 result = np.abs(fft.fftshift(result)) return result def wiener(input,PSF,eps,K=0.01): #维纳滤波,K=0.01 input_fft=fft.fft2(input) PSF_fft=fft.fft2(PSF) +eps PSF_fft_1=np.conj(PSF_fft) /(np.abs(PSF_fft)**2 + K) result=fft.ifft2(input_fft * PSF_fft_1) result=np.abs(fft.fftshift(result)) return result image = cv2.imread('you.jpg') image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) img_h=image.shape[0] img_w=image.shape[1] graph.figure(1) graph.xlabel("Original Image") graph.gray() graph.imshow(image) #显示原图像 graph.figure(2) graph.gray() #进行运动模糊处理 PSF = motion_process((img_h,img_w), 60) blurred = np.abs(make_blurred(image, PSF, 1e-3)) graph.subplot(231) graph.xlabel("Motion blurred") graph.imshow(blurred) result = inverse(blurred, PSF, 1e-3) #逆滤波 graph.subplot(232) graph.xlabel("inverse deblurred") graph.imshow(result) result=wiener(blurred,PSF,1e-3) #维纳滤波 graph.subplot(233) graph.xlabel("wiener deblurred(k=0.01)") graph.imshow(result) blurred_noisy=blurred + 0.1 * blurred.std() * \ np.random.standard_normal(blurred.shape) #添加噪声,standard_normal产生随机的函数 graph.subplot(234) graph.xlabel("motion & noisy blurred") graph.imshow(blurred_noisy) #显示添加噪声且运动模糊的图像 result = inverse(blurred_noisy, PSF, 0.1+1e-3) #对添加噪声的图像进行逆滤波 graph.subplot(235) graph.xlabel("inverse deblurred") graph.imshow(result) result=wiener(blurred_noisy,PSF,0.1+1e-3) #对添加噪声的图像进行维纳滤波 graph.subplot(236) graph.xlabel("wiener deblurred(k=0.01)") graph.imshow(result) graph.show()
以上是“怎么使用python实现逆滤波与维纳滤波示例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联成都网站设计公司行业资讯频道!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享标题:怎么使用python实现逆滤波与维纳滤波示例-创新互联
文章转载:http://ybzwz.com/article/ddopis.html