先推荐界面比较丑,但是还不错的在线图片处理网站:

http://www168.lunapic.com/editor/

由于最近在做毕设了,结合前面关于图像处理和机器学习的操作,想做一些好玩的东西,其中有一部分需要构建一个模糊人脸库。一想到人脸照,大概都是超清晰的自拍(selfie)或者证件照,所以自然模糊的人脸好难找。。。

所以自己仿真。。做了一个小小的test set。。。

参杂了高斯模糊、失焦模糊、和运动模糊。。

opencv没有motion blur的filter

为了方便批量处理,写了一个小小小小的函数。。

 cv::Mat MotionBlur(cv::Mat srcImg, int filterSize) {
int size = filterSize;
cv::Mat filter = cv::Mat::zeros(size, size, CV_8UC1);
cv::Mat result = cv::Mat(srcImg.size(), srcImg.type());
for (int i = ; i < size; i++)filter.at<uchar>(i, i) = (uchar);
for (int i = ; i < filter.rows; i++) {
for (int j = ; j < filter.cols; j++) {
cout << (int)filter.at<uchar>(i, j) << " ";
}
cout << endl;
} int len = size / ; for (int r = ; r < srcImg.rows; r++) {
for (int c = ; c < srcImg.cols; c++) {
//mask
int red = , green = , blue = ;
for (int i = r - len; i <= r + len; i++) {
for (int j = c - len; j <= c + len; j++) {
if (i < || j < || i >= srcImg.rows || j >= srcImg.cols) continue;
blue += ((int)srcImg.at<cv::Vec3b>(i, j)[]) * ((int)filter.at<uchar>(i - (r - len), j - (c - len)));
green += ((int)srcImg.at<cv::Vec3b>(i, j)[]) * ((int)filter.at<uchar>(i - (r - len), j - (c - len)));
red += ((int)srcImg.at<cv::Vec3b>(i, j)[]) * ((int)filter.at<uchar>(i - (r - len), j - (c - len)));
}
} result.at<cv::Vec3b>(r, c)[] = (uchar)(blue / size);
result.at<cv::Vec3b>(r, c)[] = (uchar)(green / size);
result.at<cv::Vec3b>(r, c)[] = (uchar)(red / size);
}
} cv::imshow("motion blur", result);
cv::waitKey(); return result;
}

e.g.

filterSize = 9时, 角度45,矩阵如下

1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0

0 0 1 0 0 0 0 0 0

0 0 0 1 0 0 0 0 0

0 0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 0 0

0 0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 0 1

卷积过后还要归一化, 即 * 1/9

【OpenCV】motion blur 的简单实现的更多相关文章

  1. Motion Blur

    [Motion Blur] 此篇介绍最简单的全局Motion Blur.算法是将当前帧与前一帧按某一比例混合.这是一个过程,例如有10帧,在第1帧中,只有第1帧原图,第2帧中有1.2帧原图,第3帧中会 ...

  2. OpenCV安装配置的简单记录

    在ubuntu16.04下安装OpenCV 2.4.11的简单记录 1. 安装cmake,执行$apt-get install cmake即可,cmake -version验证 2. 下载OpenCV ...

  3. OpenCV学习:实现简单的图像叠加

    本实例使用简单的线性叠加方法来实现两幅图像的叠加,主要使用的知识如下: 1)线性融合 2)addWeighted函数 //! computes weighted sum of two arrays ( ...

  4. Python版本OpenCV安装配置及简单实例

    # 2018-06-03 # 1. Python下载:https://www.python.org/downloads/ 选择对应平台对应版本的的Python进行安装. 2. Python版OpenC ...

  5. OpenCV学习(2)——一个简单的例子

    光说不练假把式,来看一个简单的例子,了解了解OpenCV.这个小demo没有几行代码,作用是显示项目目录下面的一张图片. #include <opencv2\opencv.hpp> #in ...

  6. 文本框监听事件blur()的简单使用

    场景描述:在做编辑功能的时候,经常要判断编码,或者密码之类的是否已经被使用,以前自己做的时候,经常都是在提交了之后才判断的,到现在,才发现,这样做的用户体验不好,完美一点的做法就是当此文本框失去焦点的 ...

  7. [转]第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV

    仅供参考,还未运行程序,理解部分有误,请参考英文原版. 绿色部分非文章内容,是个人理解. 转载请注明:http://blog.csdn.net/raby_gyl/article/details/174 ...

  8. OpenCV学习 3:平滑过度与边缘检测

    原创文章,欢迎转载,转载请注明出处  用来记录学习的过程,这个是简单的相关函数的熟悉,内部机制和选择何种选择函数参数才能达到自己的要求还不太清楚,先学者吧..后面会慢慢清楚的.     和前面相比,主 ...

  9. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

随机推荐

  1. codeforces 672A A. Summer Camp(水题)

    题目链接: A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. opencv直方图该怎么画

    图像直方图是反映图像中像素分布特性的统计表,一般显示如下: 其中横坐标代表的是图像像素的种类,或者说是灰度级,纵坐标代表的是每一级灰度下像素数或者该灰度级下像素数在所有图像总像素数总所占的百分比. 直 ...

  3. function.py

    #文档字符串 def square(x): 'calculates the square of the number x' return x*x square.__doc__ help(square) ...

  4. AtCoder Beginner Contest 057

    A题 分析:24进制转换 #include<iostream> using namespace std; int main() { int a,b; while(cin>>a& ...

  5. MyBatis缓存设计

    和大多数ORM框架一样,为了尽可能减少数据库的访问,MyBatis设计支持缓存功能.设计上通过Cache接口提供SPI(服务提供接口),可以让第三方缓存提供具体的缓存实现,比如使用ehcache.Re ...

  6. 深入研究 Java Synchronize 和 Lock 的区别与用法

    在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方.  ...

  7. jsp实现文件上传(一)用jspSmartUpload组件实现文件上传

    java类(ImageUtil.java) import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ...

  8. 百度也推出公共DNS服务:180.76.76.76(转载)

    转自:http://www.cnbeta.com/articles/352221.htm

  9. 6.while循环正向反向打印一句话

    message = "伤情最是晚凉天,憔悴厮人不堪言."' count=0 num=-1 while count<len(message): print(message[co ...

  10. 笔记-JavaWeb学习之旅3

    数据库的设计 1.多表之间的关系 一对一 一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键 一对多 在多的一方建立外键指向一的一方建立主键 多对多 多对多关系实现需要借助第三张中间表.中间表 ...