【问题标题】:1 Dimensional Sobel Produces Noise一维索贝尔产生噪声
【发布时间】:2015-04-18 21:29:38
【问题描述】:

我正在为学校的一个项目尝试使用一块一块的 Sobel 边缘检测器,但我不知道哪里出了问题。在不提供太多细节的情况下,我认为其中很大一部分归结为下面的代码。当我放一张 lenna.pgm 图片时:

通过沿 x 梯度的 2D 蒙版,我得到很多噪点。

我和我的导师讨论了代码,我正在按照他说的去做。

这是x方向卷积的代码:

void applySobel(int maskX[3][3], int maskY[3][3], int maskWidth, int imageH, int imageW, 
                                              int threshold, int*** generated){
    int sumX, sumY;

     // convolve smoothed image with Sobel mask in the X-direction
     for(int i = 0; i < imageH; i++) {
         for(int j = 0; j < imageW; j++) {
             if(i == 0 || i >= imageH - 1 || j == 0 || j >= imageW - 1) {
                 sumX = 0;
             } else {
                 sumX = 0;
                 for(int x = -1; x <= 1; x++) {
                     for(int y = -1; y <= 1; y++) {
                         sumX += generated[0][i+x][j+y] * maskX[x+1][y+1];
                     }
                 }
             }
             generated[1][i][j] = sumX;
         }
     }
}

我也尝试过在输出到文件之前对图像进行标准化,但是图像变暗了。

    for(int a = 1; a < 6; a++) {

    min = imageOUT[a][0][0];
    max = 0;
    // normalize the pixel values and then write to files
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < N; j++) {
            pixel = imageOUT[a][i][j];
            if(pixel < min) {
                min = pixel;
            } if(pixel > max) {
                max = pixel;
            }
        }
    }

    for(int i = 0; i < M; i++) {
        for(int j = 0; j < N; j++) {
            imageOUT[a][i][j] = (int)(imageOUT[a][i][j] - min) * (255/(max-min));
        }
    }

    WriteImage(fileOutName[a-1].c_str(), imageOUT[a], M, N, Q);
}

我非常感谢任何见解。这已经让我好几天了。

【问题讨论】:

  • 您的学校是否要求您使用 C++ 进行模式识别?我建议您先在 Matlab 中尝试,然后在必要时迁移到 C++。
  • 是的。我们尽可能使用 C/C++。这个作业也是用 C/C++ 编写的。我应该补充一点,卷积适用于我事先应用于图像的高斯滤波器。
  • 欢迎来到 Stack Overflow!您可以发布图像的链接,然后有人可以检查并添加它。SO 在很大程度上是通过迭代编辑来工作的。
  • 好的:i.imgur.com/82L05Kb.png 感谢您的欢迎。
  • 图像的存储方式有点奇怪,为int ***。通常您会将图像存储为连续像素,例如int *(或 int ** 用于多个图像)和使用乘法的索引,例如pixels[j*w+i]。此外,您似乎是先按列索引,然后按行索引 - 您确定这是正确的吗?通常图像以行优先顺序存储,而不是列优先顺序。

标签: c++ edge-detection sobel


【解决方案1】:

更新:这是我得出的解决方案。基本上,我只取了掩码中感兴趣的对象,而不是全部相乘和相加,因此省略了零空格。

void applySobel(int maskX[3][3], int maskY[3][3], int maskWidth, int imageH, int imageW, 
                                          int threshold, int*** generated){
int sumX, sumY;

 // convolve smoothed image with Sobel mask in the X-direction
 for(int i = 0; i < imageH; i++) {
     for(int j = 0; j < imageW; j++) {
         if(i == 0 || i == imageH - 1 || j == 0 || j == imageW - 1) {
             sumX = generated[0][i][j];
         } else {
             sumX = (int)(generated[0][i-1][j-1]*maskX[0][0] + 
                    generated[0][i][j-1]*maskX[1][0] +
                    generated[0][i+1][j-1]*maskX[2][0] +
                    generated[0][i-1][j+1]*maskX[0][2] +
                    generated[0][i][j+1]*maskX[1][2]+
                    generated[0][i+1][j+1]*maskX[2][2])/2;
         }
         generated[1][i][j] = sumX/3;
     }
 }

以及应用 X 方向渐变后的美丽 Lenna:

非常感谢大家的建议。

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2013-03-31
    相关资源
    最近更新 更多