先推荐界面比较丑,但是还不错的在线图片处理网站:
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