JYZJU 2023-03-31 21:32 采纳率: 83.3%
浏览 8
已结题

opencv入门,尝试基于积分图像进行盒式滤波

问题遇到的现象和发生背景
遇到的现象和发生背景,请写出第一个错误信息

输出的图像是一张几乎完全黑的图片(只有边缘没有做处理的地方显示出来)

img

#include <opencv2/core/core.hpp>                
#include <opencv2/highgui/highgui.hpp>    
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>   
using namespace std;
using namespace cv;

void myboxfilter(int filter_size, Mat& image_input, Mat& image_output)
{
    image_output = image_input.clone();
    int k = (filter_size - 1) / 2;


    Mat image_integral;
    integral(image_input, image_integral, CV_32F);
    Mat imageIntegralNorm;
    normalize(image_integral, image_integral, 0, 255, NORM_MINMAX);
    convertScaleAbs(image_integral, imageIntegralNorm);


    //进行盒式滤波
    for (int i = k; i < (image_input.rows - k); i++)
    {

        for (int j = k; j < (image_input.cols - k); j++)
        {
            int sum_r = 0, sum_g = 0, sum_b = 0;
            Vec3b& pixel1 = imageIntegralNorm.at<Vec3b>(i - k, j - k);
            Vec3b& pixel2 = imageIntegralNorm.at<Vec3b>(i - k, j + k);
            Vec3b& pixel3 = imageIntegralNorm.at<Vec3b>(i + k, j - k);
            Vec3b& pixel4 = imageIntegralNorm.at<Vec3b>(i + k, j + k);

            sum_r = pixel4[2] + pixel1[2] - pixel2[2] - pixel3[2];
            sum_g = pixel4[1] + pixel1[1] - pixel2[1] - pixel3[1];
            sum_b = pixel4[0] + pixel1[0] - pixel2[0] - pixel3[0];

            Vec3b& pixel5 = image_output.at<Vec3b>(i, j);
            pixel5[2] = round(sum_r / (filter_size * filter_size));
            pixel5[1] = round(sum_g / (filter_size * filter_size));
            pixel5[0] = round(sum_b / (filter_size * filter_size));
        }

    }
}


int main()
{
  
    Mat srcImage = imread("test.jpg");
    if (!srcImage.data)
    {
        cout << "读取失败!\n";
        system("pause");
        return -1;
    }
    imshow("original image", srcImage);

    Mat dstImage;
    myboxfilter(3,srcImage, dstImage);
    imshow("after myboxfilter", dstImage);
    imwrite("box_filtering.jpg", dstImage);


    waitKey(0);
    return 0;
}

我想要达到的结果

输出经过盒式滤波的彩色图片

  • 写回答

2条回答 默认 最新

  • test_boy001 2023-04-01 05:33
    关注

    myboxfilter 函数中进行积分图像的计算和归一化时,使用了 normalize 和 convertScaleAbs 两个函数。但是它们的使用似乎不太正确,因为在计算积分图像后,像素值已经是浮点型 CV_32F 类型的数值,不需要进行归一化和类型转换。这部分代码可以简化为:
    scss
    Copy code
    Mat image_integral;
    integral(image_input, image_integral, CV_32F);
    在 myboxfilter 函数中,对于输入图像的边缘区域并没有进行处理。因此,在进行像素遍历时需要注意边界的处理,避免访问越界导致程序崩溃。

    在 myboxfilter 函数中,进行像素计算时使用了 round 函数对浮点型像素值进行四舍五入。但是,由于 round 函数返回的是整型数值,因此可能会导致计算结果不太准确。可以考虑使用 cv::saturate_cast 函数将浮点型数值转换为合理的像素类型。

    在 main 函数中,没有使用 waitKey 函数等待用户按下按键后才退出程序。这可能会导致窗口一闪而过,用户无法看到处理结果。可以在最后添加如下代码:

    scss
    Copy code
    waitKey(0);
    这样可以等待用户按下任意键后才退出程序,用户可以看到处理结果

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 创建了问题 3月31日

悬赏问题

  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元