0

我的应用程序遇到了非常奇怪的问题,该应用程序旨在将 Sobel 过滤器应用于图像。

问题是每次我的图像都会增加并移动一点。乘数取决于图片大小。

这是一个示例:

初始图像

初始图像

添加过滤器后

出图

为简单起见,我现在只研究一种颜色和一把斧头。

这是 Sobel 滤波器的代码:

///sobel code

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

        int sobY,sobX,sobI,sobJ;
        long sumX,sumY;
        int SUM;

        for(sobX = 0;sobX<=(x-1);sobX++)
        {
            for(sobY = 0;sobY<=(y-1);sobY++)
            {
                sumY = 0;
                sumX = 0;

                if(sobY==0||sobY==(y-1))
                {
                    SUM = 0;
                } else if(sobX==0||sobX==(x-1))
                {
                    SUM = 0;
                } else
                {    
                    ///Y gradient
                    for(sobI=-1;sobI<=1;sobI++)
                    {
                        for(sobJ=-1;sobJ<=1;sobJ++)
                        {
                            sumY = sumY + (int)(red[sobX+sobI][sobY+sobJ] * SY[sobI+1][sobJ+1]);
                        }
                    }

                    SUM = abs(sumX) + abs(sumY);
                }

                if(SUM>255)
                    SUM = 255;
                if(SUM<0)
                    SUM = 0;

                outputRed[sobX][sobY] = 255 - SUM;
            }
        }

可以在此处找到简化代码以及示例图像:https ://db.tt/szpEMZ3f

我已经测试了没有过滤器的读取和保存,所以这个片段:

outputRed[sobX][sobY] = 255 - SUM;

看起来像那样

outputRed[sobX][sobY] = red[sobX][sobY];

这可以正常工作。

有人可以告诉我这段代码有什么问题吗?

4

1 回答 1

0

您的尺寸SY是,[3][3]但您将值初始化为[2][14]. 这是典型的未定义行为。

于 2014-01-08T20:01:15.807 回答