zoukankan      html  css  js  c++  java
  • 利用积分图进行均值滤波

    void integral_blur()
    {
        Mat src = imread("src960_720.bmp", 1);
        int height = src.rows;
        int width = src.cols;
        int Rmax = 5;
        int sh2 = Rmax / 2;
        int sw2 = Rmax / 2;
        int Rsize = Rmax;
        int RsizeArea = 1.0 / (Rsize * Rsize) * 2048;
        cout << RsizeArea << endl;
        Mat srcborder;
        MakeBorder(src, srcborder, sw2, sh2);
        int ybegin = sh2;
        //int yend = height - sh2;
        int xbegin = sw2;
        //int xend = width - sw2;
        int nchannel = src.channels();
        Mat blurimg(height, width, CV_8UC3);
        for (int i = 0; i < height; ++i)
        {
            uchar *blurimgRow = blurimg.ptr<uchar>(i);
            for (int j = 0; j < width; ++j)
            {
                uchar *blurimgCol = blurimgRow + j * nchannel;
                int nCenter = Rsize >> 1;
                int sumR = 0;
                int sumG = 0;
                int sumB = 0;
                int jxbegin = j + xbegin - nCenter;
                int iybegin = i + ybegin - nCenter;
                for (int y = 0; y < Rsize; ++y)
                {
                    uchar *srcRow = srcborder.ptr<uchar>(iybegin + y);
                    for (int x = 0; x < Rsize; ++x)
                    {
                        uchar *srcCol = srcRow + (jxbegin + x) *nchannel;
                        sumR += srcCol[2];
                        sumG += srcCol[1];
                        sumB += srcCol[0];
                    }
                }
                blurimgCol[0] = (sumB * RsizeArea) >> 11;
                blurimgCol[1] = (sumG * RsizeArea) >> 11;
                blurimgCol[2] = (sumR * RsizeArea) >> 11;
            }
        }


        Mat srcborder_integral;
        integral(srcborder, srcborder_integral, CV_32S);
        Mat blurimg_integral(height, width, CV_8UC3);
        for (int i = 0; i < height; ++i)
        {
            uchar *blurimgRow = blurimg_integral.ptr<uchar>(i);
            for (int j = 0; j < width; ++j)
            {
                uchar *blurimgCol = blurimgRow + j * nchannel;
                int nCenter = Rsize >> 1;
                int jxbegin = j + xbegin - nCenter;
                int iybegin = i + ybegin - nCenter;
                int jxend = jxbegin + Rsize;
                int iyend = iybegin + Rsize;

                int *p1 = srcborder_integral.ptr<int>(iybegin) +(jxbegin)*nchannel;
                int *p2 = srcborder_integral.ptr<int>(iybegin) +(jxend)*nchannel;
                int *p3 = srcborder_integral.ptr<int>(iyend) +(jxbegin)*nchannel;
                int *p4 = srcborder_integral.ptr<int>(iyend) +(jxend)*nchannel;

                int sumR = p1[2] +  p4[2] -  p2[2] - p3[2];
                int sumG = p1[1] + p4[1] - p2[1] - p3[1];
                int sumB = p1[0] + p4[0] - p2[0] - p3[0];
                blurimgCol[0] = (sumB * RsizeArea) >> 11;
                blurimgCol[1] = (sumG * RsizeArea) >> 11;
                blurimgCol[2] = (sumR * RsizeArea) >> 11;
            }
        }


        Mat blurimg_opencv;
        blur(src, blurimg_opencv, Size(Rmax, Rmax));

        namedWindow("src", 0);
        imshow("src", src);
        namedWindow("dst0", 0);
        imshow("dst0", blurimg);
        namedWindow("dst1", 0);
        imshow("dst1", blurimg_opencv);
        namedWindow("dst2", 0);
        imshow("dst2", blurimg_integral);
        waitKey(0);
    }

  • 相关阅读:
    递归和回溯的区别
    N皇后问题
    c输出格式
    python sublime run快捷键设置
    八皇后问题
    动态规划---从左上角到右下角的价值最大的路径
    莫队算法详解和c实现
    Shell 常用命令总结
    WeakHashMap和HashMap的区别
    【 Jquery插件】引导用户如何操作网站功能的向导
  • 原文地址:https://www.cnblogs.com/adong7639/p/5832327.html
Copyright © 2011-2022 走看看