1、原理

运动模糊产生: 由于相机传感器或物体相对运动, 按快门瞬间造成图像产生运动模糊。

在用摄像机获取景物图像时,如果在相机曝光期间景物和摄像机之间存在相对运动,例如用照相机拍摄快速运动的物体,或者从行驶中的汽车上拍摄外面静止不动的景物时,拍得的照片都可能存在模糊的现象,这种由于相对运动造成图像模糊现象就是运动模糊。运动模糊是一种图片“退化”现象,无法反应真实的场景。

假设图像f(x,y)进行平面运动,x(t0)和y(t0)分别是在x和y方向上随时间变化的量。那么介质上(如胶片或数字存储器)上任意点的曝光总数是通过对时间间隔内瞬间曝光量的积分得到的, 图像系统的快门在该段时间是开着的。假设快门开关所用的时间很短,因此光学成像过程不会受到图像运动干扰。运动模糊产生式:

g(x,y): 代表运动模糊后在坐标(x,y)的结果

T:代表曝光时间

2、实现过程

1)对图像方向分解为x和y方向;

2)因为图像Mat坐标对应图像的正下,所以翻转Y轴;

3)分别计算图像位移;

4)合并多个像素,防止溢出求平均值。

3、代码实例

实验代码如下。只是简单的实现了模糊原理,没有考虑加性噪声n(x)。

void MotionBlur(Mat& img, Mat& dst, int angle, int distance)
{
angle = -*angle % ;
double radian = ((double)angle + 180.0) / 180.0*3.1415926;
int dx = (int)((double)distance* cos(radian) + 0.5);
int dy = (int)((double)distance* sin(radian) + 0.5); int sign = ;
int height = img.rows;
int width = img.cols;
int chns = img.channels(); if (dst.empty()) dst.create(height, width, img.type());
int i, j, k;
int i0=, j0=, p, sum, count;
for (i = ; i < height; i++)
{
unsigned char* dstData = (unsigned char*)dst.data + dst.step*i;
for (j = ; j < width; j++)
{
for (k = ; k < chns; k++)
{
sum = , count = ;
sign = (dx > ) ? : -;
for (p = ; p < abs(dx); p++)
{
i0 = i;
j0 = j+p * sign;
if (i0 >= && i0 < height && j0 >= && j0 < width)
{
count++;
sum += img.at<Vec3b>(i0, j0)[k];
}
}
sign = (dy > ) ? : -;
for (p = ; p < abs(dy); p++)
{
i0 = i + p * sign;
j0 = j;
if (i0 >= && i0 < height && j0 >= && j0 < width)
{
count++;
sum += img.at<Vec3b>(i0, j0)[k];
}
} if (count == )
{
dstData[j*chns + k] = img.at<Vec3b>(i0, j0)[k];
}
else
{
dstData[j*chns + k] = saturate_cast<uchar>(sum / (double)count + 0.5);
} }
}
}
} void test_motion()
{
Mat src_img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic14.bmp");
imshow("原图", src_img); Mat dst_img;
MotionBlur(src_img, dst_img, , );
imshow("motion", dst_img);
}

4、测试

测试1:验证模糊的方向,输入棋盘格图,输出为不同方向的模糊效果图。

输出效果图如下。

测试2:模糊效果如下图。

测试3:模糊效果如下图。

5、参考文献

1、Motion Deblur Filter

https://docs.opencv.org/3.4/d1/dfd/tutorial_motion_deblur_filter.html

2、图像复原与重建篇——运动模糊

https://blog.csdn.net/jmu201521121021/article/details/80634361

3、PhotoShop算法实现进阶-模糊滤镜-运动模糊(二十四)

https://blog.csdn.net/kezunhai/article/details/41757681

4、《OpenCV3 编程入门》,电子工业出版社,毛星雨著

5、《学习OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著

技术博客,转载请注明。

https://www.cnblogs.com/pingwen/p/12495168.html

OpenCV3入门(十三)图像运动模糊的更多相关文章

  1. Win8 Metro(C#)数字图像处理--2.50图像运动模糊

    原文:Win8 Metro(C#)数字图像处理--2.50图像运动模糊  [函数名称] 图像运动模糊算法    MotionblurProcess(WriteableBitmap src,int  ...

  2. 维纳滤波和编码曝光PSF去除运动模糊【matlab】

    编码曝光知识 - ostartech - 博客园 https://www.cnblogs.com/wxl845235800/p/8276362.html %%%%%%%%%%%%%%%%%%%%%%% ...

  3. 从单幅图像高质量去除运动模糊——读JiaYaJia同名英文论文总结

    原始论文在这里 http://www.cse.cuhk.edu.hk/leojia/projects/motion_deblurring/ 一.概述 论文根据以下的基本模糊图像模型建立 其中I是我们观 ...

  4. Java 运动模糊

    Java 运动模糊代码 想用Java 写个运动模糊的效果,无奈本人水平有限,国内也没找到资源,于是Google到了一个文档,特地分享出来! 本代码源自 http://www.jhlabs.com/ip ...

  5. 使用 canvas 画图时图像文字模糊的解决办法

    最近在使用 canvas 画图的时候,遇到了图像文字模糊的问题,解决思路就是根据分辨率创建不同尺寸的画布.以下是创建高分辨率画布的代码: /** * 创建高分辨率画布 * @param w 画布宽 * ...

  6. Unity shader学习之屏幕后期处理效果之运动模糊

    运动模糊,代码如下: using UnityEngine; public class MotionBlurRenderer : PostEffectRenderer { [Range(0.1f, 0. ...

  7. OpenCV3入门(六)图像滤波

    1.图像滤波理论 1.1图像滤波理论 图像滤波即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作.消除图像中的噪声又叫做图像滤波或平滑,滤波的目的有两个,一是突出特 ...

  8. OpenCV3入门(七)图像形态学

    1.膨胀 所谓的图片的膨胀处理,其实就是在图像的边缘添加像素值,使得整体的像素值扩张,进而达到图像的膨胀效果. 对Z2上元素集合A和结构体元素S,使用S对A进行腐蚀,记作: A⊕S={z|(S)z ∩ ...

  9. OpenCV3入门(四)图像的基础操作

    1.访问图像像素 1)灰度图像 2)彩色图像 OpenCV中的颜色顺序是BGR而不是RGB. 访问图像的像素在OpenCV中就是访问Mat矩阵,常用的有三种方法. at定位符访问 Mat数据结构,操作 ...

随机推荐

  1. Qt Sleep、QCoreApplication::processEvents()(最佳的平衡:一边发送消息,一边睡眠)

    sleep()//秒 msleep()//毫秒 usleep()//微秒 以前为了模拟鼠标点击用过这些函数,可以让进程中断,今天发现我原来的做法其实不对.这组函数会将你当前的线程/进程变为“睡眠”状态 ...

  2. Qt QImage的浅拷贝与深拷贝

    首先简单说说什么是浅拷贝和深拷贝:浅拷贝就比如像引用类型,而深拷贝就比如值类型,即浅拷贝是共用一块内存的,而深拷贝是复制一份内容. 我们再来看看QImage类的几个构造函数: // 浅拷贝 QImag ...

  3. 使用记事本编写html代码并运行

    在使用记事本编写html代码,运行时需要将其.txt后缀改为.html双击运行即可. 有时电脑会默认的隐藏其后缀,这时需要修改一下. win7系统修改方法: 双击  我的电脑: 选择  组织: 选择  ...

  4. c/c++ main 函数命令行参数的使用

    C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程 序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用 ...

  5. MyBatis 逆向工程介绍

    1. 概念: 逆向工程就是根据数据库中对应的表在项目工程中生成相应的MyBatis代码(XXXMapper.java/XXXMapper.xml/Moudle(XXX)),逆向工程生成的代码可以进行简 ...

  6. SpringMVC在使用过程中的错误

    HTTP Status 500 - Request processing failed; nested exception is org.springframework.validation.Bind ...

  7. 吴裕雄--天生自然 R语言开发学习:高级数据管理(续三)

    #-----------------------------------# # R in Action (2nd ed): Chapter 5 # # Advanced data management ...

  8. Windows下使用swoole的环境搭建

    Cygwin 官方地址:http://www.cygwin.com/ swoole 官方下载地址:https://github.com/swoole/swoole-src/releases 方法/步骤 ...

  9. [转]<版本一>写代码的小女孩

    天冷极了,下着雪,又快黑了.这是NOIP的前夜.在这又冷又黑的晚上,一个衣衫破烂的小女孩在机房敲着代码.她从班里逃出来的时候还拿着一本算导,但是有什么用呢?那是一本很破旧的书——那么大,一向是她妈妈垫 ...

  10. 正则表达式入门-python代码

    题记 本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例. 正则表达式在很多的应用中都有使用到,特别是在网络爬虫中格式化html后取出自 ...