【问题标题】:Strange (multiplied) PPM image after Sobel filtrationSobel 过滤后的奇怪(相乘)PPM 图像
【发布时间】:2014-01-27 02:51:00
【问题描述】:

我的应用程序遇到了非常奇怪的问题,该应用程序旨在将 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];

这可以正常工作。

谁能告诉我这段代码有什么问题?

【问题讨论】:

    标签: c image-processing ppm


    【解决方案1】:

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

    【讨论】:

    • 不是这个,而是感谢您指出这一点。我不知道如何,但在我发布之后编辑了那些值。现在我发布正确的。
    猜你喜欢
    • 2017-01-12
    • 2019-03-11
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2017-11-19
    • 2013-07-22
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多