首页 > 其他 > 详细

【OpenCV】motion blur 的简单实现

时间:2017-02-09 19:13:45      阅读:382      评论:0      收藏:0      [点我收藏+]

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

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

 

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

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

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

opencv没有motion blur的filter

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

 

 1 cv::Mat MotionBlur(cv::Mat srcImg, int filterSize) {
 2     int size = filterSize;
 3     cv::Mat filter = cv::Mat::zeros(size, size, CV_8UC1);
 4     cv::Mat result = cv::Mat(srcImg.size(), srcImg.type());
 5     for (int i = 0; i < size; i++)filter.at<uchar>(i, i) = (uchar)1;
 6     for (int i = 0; i < filter.rows; i++) {
 7         for (int j = 0; j < filter.cols; j++) {
 8             cout << (int)filter.at<uchar>(i, j) << " ";
 9         }
10         cout << endl;
11     }
12 
13     int len = size / 2;
14     
15     for (int r = 0; r < srcImg.rows; r++) {
16         for (int c = 0; c < srcImg.cols; c++) {
17             //mask
18             int red = 0, green = 0, blue = 0;
19             for (int i = r - len; i <= r + len; i++) {
20                 for (int j = c - len; j <= c + len; j++) {
21                     if (i < 0 || j < 0 || i >= srcImg.rows || j >= srcImg.cols) continue;
22                     blue += ((int)srcImg.at<cv::Vec3b>(i, j)[0]) * ((int)filter.at<uchar>(i - (r - len), j - (c - len)));
23                     green += ((int)srcImg.at<cv::Vec3b>(i, j)[1]) * ((int)filter.at<uchar>(i - (r - len), j - (c - len)));
24                     red += ((int)srcImg.at<cv::Vec3b>(i, j)[2]) * ((int)filter.at<uchar>(i - (r - len), j - (c - len)));
25                 }
26             }
27 
28             result.at<cv::Vec3b>(r, c)[0] = (uchar)(blue / size);
29             result.at<cv::Vec3b>(r, c)[1] = (uchar)(green / size);
30             result.at<cv::Vec3b>(r, c)[2] = (uchar)(red / size);
31         }
32     }
33 
34     cv::imshow("motion blur", result);
35     cv::waitKey(0);
36 
37     return result;
38 }

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 的简单实现

原文:http://www.cnblogs.com/cheermyang/p/6383266.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!