netpbm / pgm中的拉普拉斯算子

时间:2017-04-03 07:24:57

标签: c image

我需要在库netpbm / pgm中创建拉普拉斯算子。 处理图像很简单 - 我计算每个像素。我不用 归一化,因为我知道它是0,我想简化解决方案。

我的代码:

#include<stdio.h>
#include<stdlib.h>
#include <netpbm/pgm.h> 

int main(int argc, char *argv[])
{
    gray **image; // pointer to 2d array image
    gray **image_out;
    gray max2;  
    int cols,rows;
    int i,j;
    FILE* fp;   
    int mask[3][3] = {{0,-1,0},{-1,4,-1},{0,-1,0} }; 
    int min = 2000;
    int max = -2000;

    pgm_init(&argc, argv);

    fp = fopen("/mhome/matkuz/cwiczenia/cw3/images/foto01.pgm","rb");
    image = pgm_readpgm(fp,&cols,&rows,&max2);
    image_out = pgm_allocarray(cols,rows);

    //printf("cols %d rows %d image%d",cols,rows,image[cols][rows]);

    for(i=1;i<rows-1;i++) //rowy to sa x
    {
       for(j=1;j<cols-1;j++) // cols to sa kolumny
       {
        float s,suma; // wiesz wczesiejszy image[i-1,j]
        s = 
    mask[0][0]*image[i-1][j-1]+mask[0][1]*image[i-1][j]+
        mask[0][2]*image[i-1][j+1] + 
        mask[1][0]*image[i][j-1]+mask[1][1]*image[i][j]+
                mask[1][2]*image[i][j+1] +
        mask[2][0]*image[i][j-1]+mask[2][1]*image[i+1][j]+
                mask[2][2]*image[i+1][j+1];     

        // image_out[i][j] = (int) (s/suma);

        image_out[i-1][j-1] = (float) s;
      }
    }

    // normalization for display command
    for(i=1;i<rows-1;i++)
    {
        for(j=1;j<cols-1;j++)
        {
            image_out[i][j]= (float) (image_out[i][j]-min)/(float)(max-min)*255.0;
        }
    }


    pgm_writepgm(stdout,image_out,cols-1,rows-1,max2,1);

    // cleanup
    pgm_freearray(image,rows);
    pgm_freearray(image_out,rows);
    fclose(fp);

    return 0;
}

编译推荐:

gcc program.c -lnetpbm -o program

尝试使用显示后,我只获得白色像素。

有任何帮助吗? Thx提前。

1 个答案:

答案 0 :(得分:1)

这是一个很好的例子,说明草率格式化很难发现错误。这是您的过滤代码:

    s = 
mask[0][0]*image[i-1][j-1]+mask[0][1]*image[i-1][j]+
    mask[0][2]*image[i-1][j+1] + 
    mask[1][0]*image[i][j-1]+mask[1][1]*image[i][j]+
            mask[1][2]*image[i][j+1] +
    mask[2][0]*image[i][j-1]+mask[2][1]*image[i+1][j]+
            mask[2][2]*image[i+1][j+1];     

你能看到错误吗?如果你更加小心地格式化它怎么样?

    s = mask[0][0] * image[i-1][j-1]
      + mask[0][1] * image[i-1][j]
      + mask[0][2] * image[i-1][j+1]

      + mask[1][0] * image[i][j-1]
      + mask[1][1] * image[i][j]
      + mask[1][2] * image[i][j+1]

      + mask[2][0] * image[i][j-1]
      + mask[2][1] * image[i+1][j]
      + mask[2][2] * image[i+1][j+1];

你现在能看到吗? mask[2][0] * image[i][j-1]应为mask[2][0] * image[i+1][j-1]