运动模糊_运动模糊原理 - CSDN
精华内容
参与话题
  • 运动模糊图像复原

    万次阅读 2018-11-20 13:19:32
    deconvwnr 用wiener滤波器实现图像去模糊 deconvreg 用regularized滤波器实现图像去模糊 deconvlucy 用Lucy-Richardson滤波器实现图像去模糊 deconvbind 用盲反卷积算法实现图像去模糊 ...

    1.维纳滤波

    deconvwnr 用wiener滤波器实现图像去模糊
    deconvreg 用regularized滤波器实现图像去模糊
    deconvlucy 用Lucy-Richardson滤波器实现图像去模糊
    deconvbind 用盲反卷积算法实现图像去模糊

    题目是已知模糊核的,我们需要自己尝试不同的方差找到最合适的。

    img=imread('motion.bmp');
    img=im2double(img);
    subplot(2,2,1),imshow(img),title("initial")
    len=30;
    theta=11;
    PSF=fspecial("motion",len,theta);
    sVar=var(img(:));
    
    wnr1=deconvwnr(img,PSF,0);
    subplot(2,2,2),imshow(wnr1),title("without using NSR")
    
    wnr2=deconvwnr(img,PSF,0.0001/sVar);
    subplot(2,2,3),imshow(wnr2),title("with using NSR=0.0001");
    
    wnr3=deconvwnr(img,PSF,0.001/sVar);
    subplot(2,2,4),imshow(wnr3),title("with using NSR=0.001");
    
    figure(2),imshow(wnr2)
    
    h=fspecial('average');
    f=filter2(h,wnr2);
    figure(3),imshow(f)
    

    在这里插入图片描述
    处理之后发现取0.001时效果最好,把图像去除,加以均值滤波(对于高斯噪声来说略优)。

    2.模糊及逆滤波

    使用imnoise对模糊后的图像加高斯噪声。
    fspecial是定义核所用的,非常重要。

    img=imread('work.jpg');
    img=rgb2gray(img);
    img=im2double(img);
    
    len=28;
    theta=14;
    PSF=fspecial("motion",len,theta);
    blurred=imfilter(img,PSF,'circular');
    % motion blur
    subplot(2,3,1),imshow(img),title("原图")
    subplot(2,3,2),imshow(blurred),title("运动模糊")
    If=fft2(blurred);
    Pf=fft2(PSF,500,500);
    deblurred=ifft2(If./Pf);
    subplot(2,3,3),imshow(deblurred),title("直接逆滤波")
    
    mean=0;
    var=0.0001;
    noised=imnoise(blurred,'gaussian',mean,var);
    subplot(2,3,4),imshow(noised),title("模糊加噪声")
    
    Ifn=fft2(noised);
    deblurredn=ifft2(Ifn./Pf);
    subplot(2,3,5),imshow(deblurredn),title("直接逆滤波")
    

    在这里插入图片描述
    呵呵,逆滤波不能处理有噪声的图像哦。

    展开全文
  • 简单的运动模糊效果实现

    千次阅读 2007-10-02 03:34:00
    当一个物体快速移动的时候, 人眼会感觉它变模糊. 同样的现象在电影和照片上也存在. 产生这种现象的原因是人眼并不是无限快地接收信息的, 而是每隔一段很短的时间” 截取” 一幅画面。如果物体移动的速度超过了人眼...
     
    
    当一个物体快速移动的时候, 人眼会感觉它变模糊. 同样的现象在电影和照片上也存在. 产生这种现象的原因是人眼并不是无限快地接收信息的, 而是每隔一段很短的时间” 截取” 一幅画面。如果物体移动的速度超过了人眼捕获画面的速度, 那么物体会呈现条纹效果.
     
    了解现实世界中的效果有助于我们用计算机去实现它. 理想的方法是判断每个像素在相邻两帧之间移动的速度, 跟据这个信息再来进行处理. 这个方案是可行的, 但是有点复杂. 另一种方法就是将当前帧的画面跟上一帧的画面进行混合, 并不考虑物体的移动速度. 这只是一种近似效果, 并在如今的视频游戏中得到了广泛的应用.
    实现运动模糊屏幕效果有两方面的目的: 一是为了模拟现实中的运动模糊 二是它可以减轻渲染中的锯齿效果, 特别是在硬件不支持反锯齿的情况下, 这是一个廉价的替代方案.
     
    实现原理:
    1.先将场景渲染到一个RenderTarget1上
    2.将RenderTarget1跟上一帧渲染的结果进行混合, 并输出到RenderTarget2
    3.将RenderTarget2输出到屏幕, 并将其保留到下一帧进行混合
    详见下图:
     
    Shader实现
    两个Pass
    Teapot Pass将场景正常渲染到BaseSceneRT上.
     
    BlurPass进行混合, 输出到BluredRT, 注意同时这里BluredRT做为Texture1输入上一帧的结果所以设置在渲染时不进行清除操作.
     
    混合时需要一个比例值blur_factor进行插值, 在这里我设置为0.5
    PixelShader代码:
    sampler2D Texture0;
    sampler2D Texture1;
    float blur_factor;
     
    float4 ps_main( float2 texCoord : TEXCOORD0 ) : COLOR
    {
       float4 color1 = tex2D( Texture0, texCoord );
       float4 color2 = tex2D( Texture1, texCoord );
      
       //插值
       return lerp( color1, color2, blur_factor );
    }
     
    最后把BluredRT输出到屏幕即可(按说这里应该再加一个Pass的, 我偷懒, 直接把BluredRT显示到窗口上看效果了)
    快速拖动物体, 可以看到效果了^_^:
     
    展开全文
  • 深度学习去运动模糊----《DeblurGAN》

    千次阅读 2018-12-12 21:37:44
    前言现实生活中,大多数图片是模糊不清的,...拍照时手抖,或者画面中的物体运动都会让画面模糊,女友辛辛苦苦摆好的各种Pose也将淹没在各种模糊的线条中,是时候要有一种新的算法解救水深火热中的你了。这不,去...

    前言

    现实生活中,大多数图片是模糊不清的,试想一下,追剧时视频不清晰,看着都很捉急,何况现实中好端端的一幅美景(美女也可以)被抓拍得不忍直视,瞬间暴躁!!拍照时手抖,或者画面中的物体运动都会让画面模糊,女友辛辛苦苦摆好的各种Pose也将淹没在各种模糊的线条中,是时候要有一种新的算法解救水深火热中的你了。

    这不,去年(2017)乌克兰天主教大学、布拉格捷克理工大学和解决方案提供商Eleks联手公布了一篇论文,文章标题为《DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks》。目前文章已更新,2018。

    这篇文章中,研究人员提出一种基于条件对抗式生成网络和内容损失(content loss)的端对端学习法DeblurGAN,去除图像上因为物体运动而产生的模糊。今天我们不看美图,且之论学术。大致聊一聊这个去模糊的过程。

    Introduction

    在没有提供任何关于核(kernel)或相机的运动信息的情况下,怎样去除单张照片中的运动模糊(Motion Blur)呢?

    这不禁让人联想起生成对抗网络(GAN),因为它能够保存高纹理细节,创建的图案又接近真实图像,所以是图像超分辨率和图像修复中的主力军。

    能否将这种方法应用到消除运动模糊的工艺中呢?

    可以。模糊处理可以看作是图像转化中的一个特例,研究人员提出基于条件生成式对抗网络和多元内容损失的DeblurGAN法。

    最近,生成式对抗网络(GAN)在图像超分辨率重建、in-painting等问题上取得了很好的效果。GAN能够保留图像中丰富的细节、创造出和真实图像十分相近的图像。而在CVPR2017上,一篇由Isola等人提出的《Image-to-Image Translation with Conditional Adversarial Networks》的论文更是使用条件生成式对抗网络(cGAN)开启了“image-to-image translation”任务的大门。

    Example results on several image-to-image translation problems.

    本文的思想主要受近期图像超分辨率重建和“image-to-image translation”的启发,把去模糊问题当做“image-to-image translation”的一个特例。使用的网络是 image-to-image translation 论文中使用的cGAN(pix2pix)。


    Proposed method:DeblurGAN的实现原理

    给出一张模糊的图像 I_{b} ,我们希望重建出清晰的图像 I_{s} 。为此,作者构建了一个生成式对抗网络,训练了一个CNN作为生成器 G_{\theta_{G}} 和一个判别网络 D_{\theta_{D}} 。

    网络结构

    生成器CNN的结构如下图:


    从上图的架构中可以看出,DeblurGAN包含两个1/2间隔的卷积单元、9个剩余residual单元和两个反卷积单元。每个ResBlock由一个卷积层、实例归一化层和ReLU激活组成。


    去除运动模糊的整个流程(网络结构),如下图所示:



    网络结构类似Johnson在风格迁移任务中提出的网络。作者添加了“ResOut”,即“global skip connection”。CNN学习的是残差,即 I_{S}=I_{B}+I_{R} ,这种方式使得训练更快、模型泛化能力更强。

    判别器的网络结构与PatchGAN相同(即 image-to-image translation 论文中采用的判别网络)。


    损失函数

    损失函数使用的是“content loss”和“adversarial loss”之和:

    在文章实验中,\lambda=100 。

    Adversarial loss

    训练原始的GAN(vanilla GAN)很容易遇到梯度消失、mode collapse等问题,训练起来十分棘手。后来提出的“Wassertein GAN”(WGAN)使用“Wassertein-1”距离,使训练不那么困难。之后Gulrajani等提出的添加“gradient penalty”项,又进一步提高了训练的稳定性。WGAN-GP实现了在多种GAN结构上稳定训练,且几乎不需要调整超参数。本文使用的就是WGAN-GP,adversarial loss的计算式为:

    Content loss

    内容损失,也就是评估生成的清晰图像和ground truth之间的差距。两个常用的选择是L1(也称为MAE,mean absolute error)损失,和L2(也称为MSE)损失。最近提出了“perceptual loss”,它本质上就是一个L2 loss,但它计算的是CNN生成的feature map和ground truth的feature map之间的距离。定义如下:

    其中, \phi_{i,j} 表示将图像输入VGG19(在ImageNet上预训练的)后在第i个max pooling层前,第j个卷积层(after activation)输出的feature map。 W_{i,j} , H_{i,j} 表示feature map的维度。

    Motion blur generation

    想去糊,先得知道怎样将清晰图像转换成运动模糊图像,这个准备阶段也学问多多。

    与超分辨率和黑白照片上色等流行的图像到图像(image-to-image)的转换问题相比,用于训练算法的清晰和模糊的图像对(image pairs)难以获取,一种典型的获取方法是用高帧频相机捕捉视频中清晰的帧模拟模糊图像。

    用这种方法创建真实图片的模糊图像,会将图像空间(image space)局限在拍摄的视频中出现的场景,并将数据集变得更复杂。另一种方法就是用清晰图像卷积上各式各样的“blur kernel”,获得合成的模糊图像。作者在现有第二种方法的基础上进一步拓展,提出的方法能够模拟更复杂的“blur kernel”。

    根据前人的实验,研究人员提出的方法更真实地模拟了复杂的模糊核(blur kernel)。这种方法遵循了Boracchi和Foi 2012年在论文Modeling the performance of image restoration from motion blur中所描述的随机轨迹生成的概念,对轨迹矢量应用亚像素插值法生成核。每个轨迹矢量都是一个复杂矢量,对应着一个连续域中的二维随机运动物体的离散位置。


    首先,作者采用了Boracchi和Foi[1]提出的运动轨迹随机生成方法(用马尔科夫随机过程生成);然后对轨迹进行“sub-pixel interpolation”生成blur kernel。当然,这种方法也只能在二维平面空间中生成轨迹,并不能模拟真实空间中6D相机的运动。

    轨迹生成由马尔可夫过程完成、由算法总结。根据前一个点速度和位置、高斯摄动方程和脉冲摄动,随机生成下一个点的位置。

    Training Details

    DeblurGAN的代码在很大程度上借鉴了pix2pix的代码,使用的框架是pyTorch。作者一共在不同数据集上训练了三个model,分别是:

    1. DeblurGAN_{WILD} :训练数据是GOPRO数据集,将其中的图像随机裁剪成256×256的patches输入网络训练
    2. DeblurGAN_{Synth} :训练数据集是MS COCO生成的模糊图像(根据上面提到的方法),同样随机裁剪成256×256的patches
    3. DeblurGAN_{Comb} :在以上两个数据集的混合数据集上训练,合成图像:GOPRO=2:1

    所有模型训练时的batch size都为1。作者在单张Titan-X GPU上训练,每个模型需要6天的训练时间。


    由于它们均为全卷积模型,又是在图像patch上训练的,因此可以应用在任意大小的图像中。

    为了进行优化,研究人员在DθD上执行了5次梯度下降,在GθG上执行了1次。最初生成器和判别器设置的学习速率为10-4,经过150次迭代后,在接下来的有一轮150次迭代中将这个比率线性衰减。


    实验结果对比

    GoPro数据集

    GoPro数据集包含了2103对从不同的场景拍摄的720p的模糊-清晰的图像对。研究人员将模型的结果与标准指标的模型状态进行比较,并在单个GPU上显示每个算法的运行时间,结果如下:



    上图是DeblurGAN和Nah等人提出的 Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring 方法的结果对比。左侧一列是输入的模糊图像,中间是Nah等人的结果,右侧是DeblurGAN的结果。


    Kohler标准数据集


    Kohler数据集由4张图像组成,每张用12个不同的核模糊图像。这是一个标准的基准数据集,用于评价去模糊算法。数据集通过记录和分析真实的相机运动产生,并在机器人载体上回放,这样在6D相机运动轨迹上会留下一系列清晰的图像。





    YOLO上的目标检测基准

    这项研究中还有一个小彩蛋。

    研究人员探索了动态模糊对目标检测的影响,基于在预训练的YOLO网络上目标检测的结果,提出一种评估质量的去模糊算法的新方式。

    通过用高帧率摄像机模拟相机抖动,研究人员构建了一个清晰-模糊的街景数据集。之后,对240fps(每秒显示帧数-帧率)相机拍摄的5到25帧进行随机抽样,并计算中间帧的模糊版作为这些帧的平均值。

    总体来说,数据集包括410对模糊-清晰图像,这些图像是从不同街道和停车场拍摄的,包含不同数量和类型的汽车。







    论文主要贡献:

    • 提出使用DeblurGAN对模糊图像去模糊,网络结构基于cGAN和“content loss”。获得了目前最佳的去模糊效果
    • 将去模糊算法运用到了目标检测上,当待检测图像是模糊的的时候,先对图像去模糊能提高目标检测的准确率
    • 提出了一个新的合成模糊图像的方法


    论文来源:arXiv2017

    论文作者:Orest Kupyn,Volodymyr Budzan等

    下载链接:PDF | github


    参考链接:

    1.https://blog.csdn.net/yh0vlde8vg8ep9vge/article/details/78641844

    2.https://zhuanlan.zhihu.com/p/32260634



    (上述内容都是转发别人的》
    **个人感言:**个人认为DeblurGAN文章不论从题材还是创新这篇文章都足够,但是可能目前个人能力也有限,还没有达到论文中作者的实验结果,后续继续就自己实现的继续更新!
    展开全文
  • 运动模糊综述

    千次阅读 2019-03-27 15:41:12
    运动模糊是相机,物体,背景间相对运动造成的效果,可以借助移动镜头追踪移动的物体来避免 影响因素 影响模糊的参数主要是:1,角度,0~360度,不同角度会造成不同模糊类型,2,长度,长度为移动多少间隔的像素 ...

    原因

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

    影响因素

    影响模糊的参数主要是:1,角度,0~360度,不同角度会造成不同模糊类型,2,长度,长度为移动多少间隔的像素

    动态模糊类型:1,线性,动态模糊发生在单一方向,长度越长越模糊。2,旋转,产生物体在旋转的环状动态模糊,此类型的模糊

    以镜头对准的点为中心,角度为主要影响因素,角度变化越大越模糊。3,缩放,缩放的动态模糊是以图片中心为中心辐射来影响的模糊。

    数学表达:最简单的动态模糊可用直线型点扩散函数以离散卷积形式表示为:

    psf(x_1,x_2)=\frac{1}{L}, if: x_1=x_2tanb*\sqrt{x_1^2+x_2^2<=L/2}, else: psf(x1,x2)=0

    模糊生成

    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)

    去模糊

    图像退化/复原模型:

    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)

    推导如下:

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

     

     

     

    展开全文
  • 运动模糊恢复

    千次阅读 2018-10-26 11:41:47
    维纳滤波—deconvwnr函数利用维纳滤波器来对图像模糊修复 function image_restoration_deconvwnr()  %Read image  I = im2double(imread('lena.tif'));  I=rgb2gray(I);  figure,subplot(2,3,1),imshow(I);  ...
  • 运动模糊算法推论

    千次阅读 2019-06-10 17:44:14
    运动模糊是photoshop中的一种滤镜,也是AE中的一种动效。本文提出了该效果的一种算法实现及原理推论。演示demo见github。 一、效果演示 二、背景介绍 运动模糊是景物图像中的移动效果。它比较明显地出现在长时间...
  • 什么是运动模糊(Motion Blur)

    千次阅读 2018-04-22 23:58:59
     运动模糊是景物图象中的移动效果。它比较明显地出现在长时间暴光或场景内的物体快速移动的情形里。 为什么会出现运动模糊  摄影机的工作原理是在很短的时间里把场景在胶片上暴光。场景中的光线投射在胶片上,引起...
  • 运动模糊是个经常会用到的效果,常见的实现步骤是: 对深度纹理进行采样,取得当前片元的深度信息 根据深度信息建立当前片元的NDC空间的坐标curNDCPos 把curNDCPos乘以当前VP矩阵的逆矩阵(即View*Projection)-...
  • 游戏运动模糊技术讲解

    千次阅读 2017-03-24 15:44:53
    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区...CSDN视频网址:http://edu.csdn.net/lecturer/144 运动模糊是3D格斗游戏中非常受欢迎的技术,其目的是为移动物体增加模糊效果,这增强了玩家体验到的现实
  • 申明:本资源提供matlab版的图像复原常用的运动模糊仿真图像生成程序,未经授权,仅供研究使用,不得使用于任何商用场合。 仿真程序提供2种途径:空域仿真方法和频域仿真方法。
  • 运动模糊的去除

    2020-07-30 23:33:35
    这个是运动模糊的去除研究 包括代码 希望对大家有用
  • 去除运动模糊代码

    热门讨论 2020-07-30 23:32:37
    国外利用投影法去除运动模糊的C++程序,附带实例图片。
  • Matlab处理运动模糊的图像恢复算法

    热门讨论 2020-07-30 23:33:01
    这是我用Matlab写的,用维纳滤波处理运动模糊,请高手指点一下,希望对大家有帮助
  • 运动模糊-维纳滤波

    2020-07-30 23:32:14
    本资源包含了去运动模糊的Matlab源码和测试图,为经典的维纳滤波方法。
  • maya有关运动模糊的解决方案(转)
  • 了解完高斯模糊之后,接下来看看运动模糊。 什么是运动模糊? 根据百科的定义:动态模糊或运动模糊是静态场景或一系列的图片像电影或是动画中快速移动的物体造成明显的模糊拖动痕迹。 为什么会出现运动模糊? 摄影...
  • matlab运动模糊图像复原 实验报告

    热门讨论 2020-07-30 23:32:55
    matlab运动模糊图像复原matlab运动模糊图像复原matlab运动模糊图像复原matlab运动模糊图像复原matlab运动模糊图像复原
  • OpenCV实现运动模糊图像的模拟

    万次阅读 2013-12-18 13:57:06
    产生模糊和噪声的原因有很多,比如拍摄环境的不稳定、拍摄设备的不精密、拍摄对象的快速运动、空气气流的扰动、储存与传输过程电路产生的错误等,本文要考虑的是由于拍摄对象和拍摄设备相对运动引起的运动模糊。...
  • 摘 要:通过对运动模糊产生原因的分析,提出了一种去运动模糊的新方法。首先应用Hough变换和自相关函数估计出运动模糊的方向和长度,然后应用迭代步长自适应的整体变分模型进行图像恢复。实验结果表明,这样的空间域...
  • 运动模糊(Motion Blur)

    2019-06-13 10:33:20
    为什么80%的码农都做不了架构师?>>> ...
1 2 3 4 5 ... 20
收藏数 28,368
精华内容 11,347
关键字:

运动模糊