2017-04-03 58 views
-1

我需要在庫netpbm/pgm中創建拉普拉斯算子。處理圖像很簡單 - 我計算每個像素。我不使用 規範化,因爲我知道它是0,我想簡化解決方案。在netpbm/pgm中的拉普拉斯算子

我的代碼:

#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提前。

+0

爲什麼你聲明's'爲'float'?你的計算是整數,你存儲的數組是整數,所以我建議把它聲明爲'unsigned int'。 – Ctx

+0

是的,它應該是int :) – Mkuz

回答

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]