zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    servlet 与缓存(4)
    向架构师进军---&gt;系统架构设计基础知识
    sql语法:inner join on, left join on, right join on具体用法
    关于sources.list和apt-get [转载]
    SoftReference
    MFC 之 截图工具
    Outlook Express 收发邮件出现&quot;0x800CCC0F&quot;错误代码解决方法
    使用ffmpeg视频编码过程中踩的一个坑
    Libgdx环境搭建及介绍
    从简单的信道预计说起
  • 原文地址:https://www.cnblogs.com/cheermyang/p/6383266.html
Copyright © 2011-2022 走看看