gpt4 book ai didi

c - netpbm/pgm 中的拉普拉斯运算符

转载 作者:行者123 更新时间:2023-11-30 19:09:28 25 4
gpt4 key购买 nike

我需要在库 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

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

有什么帮助吗?提前谢谢。

最佳答案

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

    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] .

关于c - netpbm/pgm 中的拉普拉斯运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43178811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com