【OpenCV】motion blur 的简单实现

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

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 的简单实现【OpenCV】motion blur 的简单实现【OpenCV】motion blur 的简单实现【OpenCV】motion blur 的简单实现【OpenCV】motion blur 的简单实现【OpenCV】motion blur 的简单实现【OpenCV】motion blur 的简单实现

原文链接: https://www.cnblogs.com/cheermyang/p/6383266.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/249069

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午3:23
下一篇 2023年2月14日 上午3:24

相关推荐