Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+;中执行sobel filter函数时,我做错了什么+;_C++_Image Processing_Convolution_Ppm_Sobel - Fatal编程技术网

C++ 在c+;中执行sobel filter函数时,我做错了什么+;

C++ 在c+;中执行sobel filter函数时,我做错了什么+;,c++,image-processing,convolution,ppm,sobel,C++,Image Processing,Convolution,Ppm,Sobel,这是我对灰度图像执行的sobel滤波函数。显然,我的计算不正确,因为我一直得到一个全黑的图像。我已经上交了这个项目,但结果不对,这让我很烦恼 int sobelH[3][3] = { -1, 0, 1, -2, 0, 2, -1, 0, 1 }, sobelV[3][3] = { 1, 2, 1, 0, 0, 0, -1

这是我对灰度图像执行的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;
    }
}
intsobelh[3][3]={-1,0,1,
-2, 0, 2, 
-1, 0, 1 },
sobelV[3][3]={1,2,1,,
0, 0, 0, 
-1, -2, -1 };
//变量声明
国际杂志;
int pix_x,pix_y=0;
int img_x,img_y;
对于(img_x=0;img_xx;img_x++)
{
对于(img_y=0;img_yy;img_y++)
{
pix_x=0;
pix_y=0;
//计算X和Y卷积
对于(inti=-1;ix+img\ux.),红色+img->数据[img\uy*img->x+img\ux]。绿色+img->数据[img\uy*img->x+img\ux]。蓝色)*sobelH[1+i][1+j];
pix_y+=(img->data[img_y*img->x+img_x]。红色+img->data[img_y*img->x+img_x]。绿色+img->data[img_y*img->x+img_x]。蓝色)*sobelV;
}
}
//梯度幅度
mag=sqrt((pix_x*pix_x)+(pix_y*pix_y));
中频(磁>RGB_分量_颜色)
mag=255;
if(mag<0)
mag=0;
//设置新的像素值
img->data[img_y*img->x+img_x]。红色=磁;
img->data[img_y*img->x+img_x]。绿色=mag;
img->data[img_y*img->x+img_x].蓝色=mag;
}
}

虽然您的代码可能需要一些改进,但主要原因是您在常量
img_y
img_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];
实际上,索贝尔卷积是对称的,所以如果你用一个恒定的图像计算卷积,它只会产生黑色


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

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


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

不知道这是否解决了您的问题,但您有
pix_x
pix_y
未签名,但使用的计算可能会产生负值。这并不能解决问题,但非常感谢@vu1p3nxplz的任何帮助修改此=>for(img_x=0;img_xx;img_x++)您还需要在每次迭代中将rgb转换为灰色->然后在水平方向和垂直方向上找到卷积运算符的大小。@程序员我认为我必须为我的项目自己做这件事,但我也从未使用过OpenCV,所以我会检查它。