【问题标题】:Peculiar problem regarding convolution in PPM format关于 PPM 格式卷积的特殊问题
【发布时间】:2019-11-25 17:23:21
【问题描述】:

调试后,尝试了不同的图像软件(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 = %d\n", 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.imgur.com/rzXKjUY.png

我将不胜感激。 最好的问候。

【问题讨论】:

  • 我会理解它移动一个像素,但是图片的 1/3 有点太多了?至于补充,做 '''{1,1,1, 1,1,1, 1,1,1}''' 我有 3 个重叠的图像扇区@beaker
  • 啊,我误会了。我假设您指的是内核的 1/3,并且没有费心查看图像。我会仔细看看。

标签: c image algorithm ppm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2015-03-21
    • 2021-01-31
    • 1970-01-01
    • 2020-10-19
    • 2015-10-11
    • 2013-02-22
    相关资源
    最近更新 更多