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);
    }

  • 相关阅读:
    HDFS入门详解
    Linux find example
    你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对?
    find 与 tar命令连用
    莫名其妙的主机名 VM_32_234_centos
    hadoop Safe mode is ON 的解决办法
    Does not contain a valid host:port authority: Master:8031 (configuration property 'yarn.resourcemanager.resource-tracker.address')
    Equals 和 == 的区别--转
    线程间操作无效: 从不是创建控件的线程访问它。
    C# EventHandler委托事件小结--百度
  • 原文地址:https://www.cnblogs.com/adong7639/p/5832327.html
Copyright © 2011-2022 走看看