运动模糊综述

原因

运动模糊是相机,物体,背景间相对运动造成的效果,可以借助移动镜头追踪移动的物体来避免

影响因素

影响模糊的参数主要是: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)

结果

运动模糊综述_第1张图片

干净图片与模糊核卷积生成模糊图片:

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)

运动模糊综述_第2张图片

去模糊

图像退化/复原模型:

g(x,y)=h(x,y) \times f(x,y)+n(x,y)

其中h(x,y)为退化函数,n(x,y)为噪声函数,目标就是根据观测图像g(x,y)以及一些先验或者估计信息复原f(x,y)。

图像复原的核心内容就是估计退化函数,因为当噪声为0的时候,F=G/H,知道了退化函数,即可以复原图像,但是当N不为0,且H比较小的时候,无法直接使用盲复原。

维也纳滤波:最小均方差滤波,它的目标是找到一个原图像f的估计图像f1,使得它们之间的均方误差最小。

e^2=E((f-f1)^2)

推导如下:

运动模糊综述_第3张图片

运动模糊综述_第4张图片

维也纳滤波如下,从上公式可以看到,该表达式将估计图像和原图像的信噪比联系,当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 

运动模糊综述_第5张图片

逆滤波:

运动模糊综述_第6张图片

运动模糊综述_第7张图片

代码:

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

 

 

 

你可能感兴趣的:(人工智障)