【问题标题】:What am I doing wrong when executing the sobel filter function in c++在c ++中执行sobel过滤函数时我做错了什么
【发布时间】:2018-04-08 14:08:05
【问题描述】:

这是我在灰度图像上执行的 sobel 过滤器功能。显然我的计算不正确,因为我不断得到全黑图像。我已经上交了项目,但结果不正确让我很困扰。

int sobelH[3][3] = { -1, 0, 1, 
                    -2, 0, 2, 
                    -1, 0, 1 },

    sobelV[3][3] = { 1, 2, 1, 
                    0, 0, 0, 
                    -1, -2, -1 };

//variable declaration
int mag;
int pix_x, pix_y = 0;
int img_x, img_y;

for (img_x = 0; img_x < img->x; img_x++)
{
    for (img_y = 0; img_y < img->y; img_y++)
    {
            pix_x = 0;
            pix_y = 0;

            //calculating the X and Y convolutions
            for (int i = -1; i <= 1; i++)
            {
                for (int j = -1; j <= 1; j++)
                {
                    pix_x += (img->data[img_y * img->x + img_x].red + img->data[img_y * img->x + img_x].green + img->data[img_y * img->x + img_x].blue) * sobelH[1 + i][1 + j];
                    pix_y += (img->data[img_y * img->x + img_x].red + img->data[img_y * img->x + img_x].green + img->data[img_y * img->x + img_x].blue) * sobelV[1 + i][1 + j];
                }
            }

        //Gradient magnitude
        mag = sqrt((pix_x * pix_x) + (pix_y * pix_y));

        if (mag > RGB_COMPONENT_COLOR)
            mag = 255;
        if (mag < 0)
            mag = 0;

        //Setting the new pixel value
        img->data[img_y * img->x + img_x].red = mag;
        img->data[img_y * img->x + img_x].green = mag;
        img->data[img_y * img->x + img_x].blue = mag;
    }
}

【问题讨论】:

  • 不知道这是否能解决您的问题,但您有 pix_xpix_y 为无符号但使用可能产生负值的计算。
  • 它不能解决问题,但感谢任何帮助@vu1p3n0x
  • 请修改 this=> for (img_x = 0; img_x x; img_x++)
  • 另外每次迭代都需要将rgb转为灰度->然后求卷积算子在水平和垂直方向上的幅度。
  • @Programmer 我以为我必须自己为我的项目做这件事,但我也从未使用过 OpenCV,所以我会检查一下。

标签: c++ image-processing convolution ppm sobel


【解决方案1】:

虽然您的代码可以进行一些改进,但主要原因是您在常数 img_yimg_x 处计算卷积。你需要做的是:

pix_x += (img->data[img_y * img->x + img_x + i].red + img->data[img_y * img->x + img_x + i].green + img->data[img_y * img->x + img_x + i].blue) * sobelH[1 + i][1 + j];

确实,Sobel 卷积是对称的,所以如果你用一个常数图像计算卷积,它只会得到黑色。

请注意,在上面的示例中,我没有考虑图像的边框。您应该确保不要访问像素阵列之外的像素。

【讨论】:

    【解决方案2】:

    另一个错误是您在输入图像中书写。您在位置 (x,y) 处写入,然后使用 (x,y) 处的修改值计算位置 (x+1,y) 的过滤器结果,这是使用错误的值。

    您需要将结果写入新图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2015-11-19
      相关资源
      最近更新 更多