-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提前。
爲什麼你聲明's'爲'float'?你的計算是整數,你存儲的數組是整數,所以我建議把它聲明爲'unsigned int'。 – Ctx
是的,它應該是int :) – Mkuz