运动模糊是相机,物体,背景间相对运动造成的效果,可以借助移动镜头追踪移动的物体来避免
影响模糊的参数主要是:1,角度,0~360度,不同角度会造成不同模糊类型,2,长度,长度为移动多少间隔的像素
动态模糊类型:1,线性,动态模糊发生在单一方向,长度越长越模糊。2,旋转,产生物体在旋转的环状动态模糊,此类型的模糊
以镜头对准的点为中心,角度为主要影响因素,角度变化越大越模糊。3,缩放,缩放的动态模糊是以图片中心为中心辐射来影响的模糊。
数学表达:最简单的动态模糊可用直线型点扩散函数以离散卷积形式表示为:
PSF:点扩展函数,描述了成像系统对点源或者点对象的响应
# 仿真运动模糊
def motion_process(image_size,motion_angle,motion_dis):
PSF = np.zeros(image_size)
x_center = (image_size[0]-1)/2
y_center = (image_size[1]-1)/2
sin_val = math.sin(motion_angle*math.pi/180)
cos_val = math.cos(motion_angle*math.pi/180)
for 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)] = 1
return PSF/PSF.sum()
defocus:失焦模糊
def de_focus(image,degree = 21):
blurred = cv2.GaussianBlur(image,ksize=(degree,degree),sigmaX=0,sigmaY=0)
return blurred
PSF = motion_process((img_h,img_w),60,100)
dst = np.zeros(PSF.shape)
norm_psf = cv2.normalize(PSF,dst,1.0,0.0,cv2.NORM_MINMAX)
graph.figure(5)
graph.gray()
graph.imshow(norm_psf)
结果:
干净图片与模糊核卷积生成模糊图片:
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
PSF = motion_process((img_h,img_w),60,100)
blurred = np.abs(make_blurred(image,PSF,1e-3))
graph.figure(2)
graph.gray()
graph.imshow(blurred)
图像退化/复原模型:
其中h(x,y)为退化函数,n(x,y)为噪声函数,目标就是根据观测图像g(x,y)以及一些先验或者估计信息复原f(x,y)。
图像复原的核心内容就是估计退化函数,因为当噪声为0的时候,F=G/H,知道了退化函数,即可以复原图像,但是当N不为0,且H比较小的时候,无法直接使用盲复原。
维也纳滤波:最小均方差滤波,它的目标是找到一个原图像f的估计图像f1,使得它们之间的均方误差最小。
推导如下:
维也纳滤波如下,从上公式可以看到,该表达式将估计图像和原图像的信噪比联系,当H(u,v)和信噪比比较大的时候,该公式接近盲复原公式G/H,所以一般表示如下:
当参数k=0的时候,其实就是逆滤波
流程如下:
代码:
def wiener(input,PSF,eps,K=0.01):
input_fft = fft.fft2(input)
PSF_fft = fft.fft2(PSF)+eps
# np.conj是计算共轭值
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
逆滤波:
代码:
def inverse(input,PSF,eps):
input_fft = fft.fft2(input)
PSF_fft = fft.fft2(PSF)+eps
result = fft.ifft2(input_fft/PSF_fft)
result = np.abs(fft.fftshift(result))
return result
参考:
http://www.robots.ox.ac.uk/~az/lectures/ia/
http://www.robots.ox.ac.uk/~az/lectures/ia/lect3.pdf
https://blog.csdn.net/mingtian715/article/details/51243000
https://blog.csdn.net/bingbingxie1/article/details/79398601