Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C PPM格式卷积的特殊问题_C_Image_Algorithm_Ppm - Fatal编程技术网

C PPM格式卷积的特殊问题

C PPM格式卷积的特殊问题,c,image,algorithm,ppm,C,Image,Algorithm,Ppm,经过调试,尝试不同的图像软件(xdg,gimp),我坚持有一个错误,这使我完全摆脱 问题是PPM格式的卷积,对于纵横比不同的图像,我使用1500x1000px图像,{0,0,0,0,1,0,0,0,0}的掩模工作得很好(只是复制图像),但是对于第一行或最后一行不同于0的掩模,例如,{0,1,0,0,0,0,0}图像向右移动其大小的1/3。我觉得这很奇怪,因为据我所知,我没有可能导致这个问题的溢出或任何指针算法 我已经把它缩小到卷积的核心。好吧,我在保存、读取图像时没有任何问题,在运行I_卷积运算

经过调试,尝试不同的图像软件(xdg,gimp),我坚持有一个错误,这使我完全摆脱

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

我已经把它缩小到卷积的核心。好吧,我在保存、读取图像时没有任何问题,在运行I_卷积运算后,它只是按预定义的值移动图像

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;

        }
    }
}
void i_卷积(无符号整数**in,无符号整数***out,
int y_max,int x_max,int内核大小)
{
int-kernel_-sum=0;
for(int i=0;i>16);
int kernel_val=kernel[(y_conv+1)*kernel_size+(x_conv+1)];
r+=(int)(rval*内核值);
g+=(int)(gval*内核值);
b+=(int)(bval*内核值);
}
}
r/=核_和;//中值滤波
g/=核函数_和;//中值滤波
b/=核_和;//中值滤波
//b=绝对值(b);
如果(r>255)r=255;
如果(r<0)r=0,则为else;
如果(g>255)g=255;
如果(g<0)g=0,则为else;
如果(b>255)b=255;
如果(b<0)b=0,则为else;
无符号int-val;
val=0;
val |=b&0xff;

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

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

我理解它移动一个像素,但是移动图片的1/3有点太多?作为补充,执行“”{1,1,1,1,1,1,1}''我误解了,'我有3个重叠@bikerah的图像扇区。我假设你指的是1/3的内核,并没有费心看图像。我会仔细看一看。我会理解它移动一个像素,但是图片的1/3有点太多?作为补充,做'{1,1,1,1,1,1,1,1}''我误解了,@bikerah有3个重叠的图像扇区。我以为你指的是1/3的内核,没有费心看图像。我会仔细看一看。