You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C++实现OpenCV谐波均值滤波仅左半部分生效问题排查

谐波均值滤波实现问题

原始图像与处理后图像对比:左侧为原始图像,右侧为经谐波均值滤波处理后的图像(仅左半部分被处理)。

以下是我最初的实现代码:

Mat HarmonicBlur(Mat img, int size) {
    img += 1;

    Mat imgBlur;
    img.copyTo(imgBlur);
    int radius = size / 2;
    uchar* pointImg = img.data;
    uchar* pointImageBlur = imgBlur.data;
    size_t stepImg = img.step;
    size_t stepImgBlur = imgBlur.step;
    for (int i = radius; i < img.rows - radius; i++) {
        for (int j = radius; j < img.cols - radius; j++) {
            std::vector<double> neighbors;
            for (int k = -radius; k <= radius; k++) {
                for (int l = -radius; l <= radius; l++) {
                    neighbors.push_back(double(pointImg[(i + k) * stepImg + j + l]));
                }
            }
            double sum = 0.0;
            for (int m = 0; m < neighbors.size(); m++) {
                sum += 1.0 / neighbors[m];
            }
            uchar n = neighbors.size() / sum;
            pointImageBlur[i * stepImgBlur + j] = n;
        }
    }
    //normalize(imgBlur, imgBlur, 0, 255, 32);
    return imgBlur;
}

我尝试过用.at遍历和指针遍历两种方式,结果完全一致。之后又修改代码,用imgBlur.create()创建图像,处理后的图像效果如下:

(注:原问题附带处理后图像,此处以文字说明替代)

对应的修改后代码:

Mat HarmonicBlur(Mat img, int size) {
    img += 1;

    Mat imgBlur;
    //img.copyTo(imgBlur);
    imgBlur.create(img.rows, img.cols, img.type());
    int radius = size / 2;
    uchar* pointImg = img.data;
    uchar* pointImageBlur = imgBlur.data;
    size_t stepImg = img.step;
    size_t stepImgBlur = imgBlur.step;
    for (int i = radius; i < img.rows - radius; i++) {
        for (int j = radius; j < img.cols - radius; j++) {
            std::vector<double> neighbors;
            for (int k = -radius; k <= radius; k++) {
                for (int l = -radius; l <= radius; l++) {
                    neighbors.push_back(double(pointImg[(i + k) * stepImg + j + l]));
                }
            }
            double sum = 0.0;
            for (int m = 0; m < neighbors.size(); m++) {
                sum += 1.0 / neighbors[m];
            }
            uchar n = neighbors.size() / sum;
            pointImageBlur[i * stepImgBlur + j] = n;
        }
    }
    //normalize(imgBlur, imgBlur, 0, 255, 32);
    return imgBlur;
}

内容的提问来源于stack exchange,提问作者tao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:12:11