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. Spring Security Config : 注解 EnableWebSecurity 启用Web安全

    https://blog.csdn.net/andy_zhang2007/article/details/90023901

  2. labview状态机

    状态机主要由3部分组成,包括一个while循环,一个条件结构,以及while循环的移位寄存器,其中while循环用于保证程序的持续运行,条件结构用于处理不同状态的执行,移位寄存器用于实现从一个状态跳转 ...

  3. 公式化学习requests(第二卷)

    请求浏览器分为两种一种是不需要用户登录验证直接请求 另一种是需要用户登陆验证请求,现在说一下利用COOKIE实现,COOKIE在前端开发时有很多的作用,要熟练使用, 直接上代码了: 第一步:访问页面, ...

  4. java中的深拷贝

    对象拷贝有时让我们忽视其重要性,又或者因为想当然而导致若干程序问题. 浅拷贝 浅拷贝即普通拷贝,即对要拷贝的对象进行复制.例如对于Entity类: class Entity{ int a; Strin ...

  5. 整合SSM遇到的错误,数据库连接失败问题集合

    Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be a ...

  6. jenkins使用(1)

    术语:构建一次job指的是执行一次任务 注:到了公司,如果需要搭建jenkins环境可以找运维 jenkins使用: 创建视图 常用的两个配置: 新建任务: 可以选择构建后的步骤: 然后保存 图标状态 ...

  7. Android开发之《硬件加速》

    Intel® SDK for OpenCL™ Applications Support:https://software.intel.com/en-us/intel-opencl-support/co ...

  8. json/xml processing model与xml和json的简要区别

    1.JavaScript Object Notation(JSON) JSON是一种轻量级数据交换格式,广泛用作通用格式,用于序列化和反序列化通过Internet相互通信的应用程序中的数据.这些应用程 ...

  9. 吴裕雄--天生自然 R语言数据分析:火箭发射的地点、日期/时间和结果分析

    dfS = read.csv("F:\\kaggleDataSet\\spacex-missions\\database.csv") library(dplyr) library( ...

  10. Rails (栈)

    题目链接:https://vjudge.net/problem/UVA-514 题目大意: 有A,B,C三个火车停靠点,火车最初停在A站,给你一个序列,问你能不能通过中转站C到达B站,火车从A站进入到 ...