C语言 关于 PPM 格式卷积的特殊问题



调试后,尝试不同的图像软件(xdg,gimp(我坚持有一个完全让我失望的错误。

问题是关于 PPM 格式的卷积,对于纵横比不同的图像,我使用的是 1500x1000px 的图像,其中 {0,0,0, 0,1,0, 0,0,0} 的掩码工作得很好(它只是复制图像(,但是对于第一行或最后一行不同于 0 的掩码,例如。{0,1,0, 0,0,0,0,0,0} 图像向右移动其大小的 1/3。我觉得这很奇怪,因为据我所知,我没有溢出或任何可能导致此问题的指针算法。

我已将其缩小到卷积的内核。Afaik我在保存,读取图像时没有任何问题,运行后i_convolution它只是按预定义值移动图像?

void i_convolution(unsigned int **in, unsigned int ***out,
int y_max, int x_max, int kernel_size)
{
int kernel_sum = 0;
for(int i = 0; i < kernel_size; i++)
{
for(int j = 0; j < kernel_size; j++)
{
kernel_sum += kernel[i * kernel_size + j];
}
}
printf("kernel sum = %dn", kernel_sum);
for (int i = 1; i < y_max - 1; i++)
{
for (int j = 1; j < x_max - 1; j++)
{
int r = 0;
int g = 0;
int b = 0;
for (int y_conv = -1; y_conv <= 1; y_conv++)
{
for (int x_conv = -1; x_conv <= 1; x_conv++)
{
int y_index = i + y_conv;
int x_index = j + x_conv;
unsigned char rval = (unsigned char)(in[y_index][x_index] & 0xff);
unsigned char gval = (unsigned char)((in[y_index][x_index] & 0xff00) >> 8);
unsigned char bval = (unsigned char)((in[y_index][x_index] & 0xff0000) >> 16);
int kernel_val = kernel[(y_conv + 1)*kernel_size + (x_conv + 1)];
r += (int)(rval * kernel_val);
g += (int)(gval * kernel_val);
b += (int)(bval * kernel_val);
}
}
r /= kernel_sum;//median filtration
g /= kernel_sum;//median filtration
b /= kernel_sum;//median filtration
// b = abs(b);
if (r > 255) r = 255;
else if(r < 0) r = 0;
if (g > 255) g = 255;
else if(g < 0) g = 0;
if (b > 255) b = 255;
else if(b < 0) b = 0;
unsigned int val;
val = 0;
val |= b & 0xff;
val <<= 8;
val |= g & 0xff;
val <<= 8;
val |= r & 0xff;
(*out)[i][j] = val;
}
}
}

让我们取内核 {0, 1, 0, 0, 0, 0,结果是
这样的,左边是原始的,右边是卷积之后 https://i.stack.imgur.com/aIlA0.jpg

我将感谢任何帮助。 此致敬意。

我将其标记为已解决,因为我误解了 PPM 格式的高度和宽度存在问题,这导致了这种行为,将 y 与 x 交换(并分配内存(解决了它!

最新更新