我得到了用C编写的以下代码,但我对这个图像过滤程序有一个小问题。问题符合常规的一切,但是我的图像roller2.raw没有根据迭代次数进行更改(在rawpixels.net中检查)。它应该读取roller1并写入roller2。我是以错误的方式写作吗?以下代码如下
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char image[251][256];
int main()
{
int h,i,j,k,l,sum,iterations;
image *datain, *dataout;
FILE *f , *g;
f = fopen("/home/osboxes/prestandaoptimering/roller1.raw", "r");
g = fopen("/home/osboxes/prestandaoptimering/roller2.raw", "w");
datain = (image*)malloc(sizeof(image));
dataout = (image*)malloc(sizeof(image));
fread(*datain, sizeof(image), 1, f);
printf("Enter number of iterations:");
scanf("%d", &iterations);
getchar();
printf("Computing result\n");
for( i = 0; i <= 250; i ++) {
for( j = 0; j <= 255; j ++) {
(*dataout) [i][j] = (*datain) [i][j];
}
}
for( h = 1; h <= iterations; h ++) {
for( i = 1; i <= 249; i ++) {
for( j = 1; j <= 254; j ++) {
sum = 0;
for( k = -1; k <= 1; k ++) {
for( l = -1; l <= 1; l ++) {
sum = sum + (*datain)[i+k][j+l];
}
(*dataout)[i][j] = (sum + (*datain)[i][j]*7) / 16;
}
}
for( i = 0; i <= 250; i ++) {
for( j = 0; j <= 255; j ++) {
(*datain)[i][j] = (*dataout)[i][j];
}
}
}
}
printf("Writing result\n");
fwrite(dataout, sizeof(image), 1, g);
if (f != NULL) {
fclose(f);
}
f = NULL;
if (g != NULL) {
fclose(g);
}
g = NULL;
free(datain);
free(dataout);
return 0;
}
答案 0 :(得分:1)
我认为问题出在iterations
循环中。
for( h = 1; h <= iterations; h ++)
{
for( i = 1; i <= 249; i ++)
{
for( j = 1; j <= 254; j ++)
{
sum = 0;
for( k = -1; k <= 1; k ++)
{
for( l = -1; l <= 1; l ++)
{
sum = sum + (*datain)[i+k][j+l];
}
}
//This should be outside the k and l loop.
(*dataout)[i][j] = (sum + (*datain)[i][j]*7) / 16;
}
//You should use different variable name instead of i. OR declare 'i' again for `for` loop.
for(int i2 = 0; i2 <= 250; i2 ++)
{
for( j = 0; j <= 255; j ++)
{
(*datain)[i2][j] = (*dataout)[i2][j];
}
}
}
}