利用积分图进行均值滤波

本文介绍了一种图像模糊处理方法,通过两种不同的技术实现:一种是直接像素遍历计算平均值;另一种是利用积分图像进行快速计算。同时使用了 OpenCV 库的内置模糊函数进行了对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值