CS50 pset4 过滤器“边缘”

问题描述

例如,当我通过边缘代码运行图像时:

Input image,

Output image

我已经尝试调试我的代码,但我仍然无法弄清楚:

这里是日志:

预期输出

76 117 255

213 228 255

192 190 255

114 102 255

210 150 60

103 108 255

114 117 255

200 197 255

210 190 255

实际输出

237 190 202

218 178 158

255 255 190

255 244 198

255 255 196

255 255 255

211 218 193

255 255 255

255 255 180

代码

typedef struct
{
    int red;
    int green;
    int blue;
}
kernel;    
void edges(int height,int width,RGBTRIPLE image[height][width])
{
    RGBTRIPLE pixel[height + 2][width + 2];
    int G_x[3][3] = {
        {-1,1},{-2,2},{-1,1}
    };
    int G_y[3][3] = {
        {-1,-2,-1},{0,0},{1,2,1}
    };
    kernel x,y,net;  

    for (int p = 0; p < height + 2; p++)
    {
        for (int q = 0; q < width + 2; q++)
        {
            if (p == 0 || p == height + 1 || q == 0 || q == width + 1)
            {
                pixel[p][q] = (RGBTRIPLE){.rgbtRed = 0,.rgbtGreen = 0,.rgbtBlue = 0};
            }
            else
            {
                pixel[p][q] = image[p][q];
            }
        }
    }
    for (int i = 1; i <= height; i++)
    {
        for (int j = 1; j <= width; j++)
        {
            x = (kernel){.red = 0,.blue = 0,.green = 0};
            y = (kernel){.red = 0,.green = 0};
            net = (kernel){.red = 0,.green = 0};
            for (int m = -1; m < 2; m++)
            {
                for (int n = -1; n < 2; n++)
                {
                    x.red += pixel[i + m][j + n].rgbtRed * G_x[1 + m][1 + n];
                    x.blue += pixel[i + m][j + n].rgbtBlue * G_x[1 + m][1 + n];
                    x.green += pixel[i + m][j + n].rgbtGreen * G_x[1 + m][1 + n];
        
                    y.red += pixel[i + m][j + n].rgbtRed * G_y[1 + m][1 + n];
                    y.blue += pixel[i + m][j + n].rgbtBlue * G_y[1 + m][1 + n];
                    y.green += pixel[i + m][j + n].rgbtGreen * G_y[1 + m][1 + n];
                }
            }
            net = (kernel){
                .red = round(sqrt(abs((x.red * x.red) + (y.red * y.red)))),.green = round(sqrt(abs((x.green * x.green) + (y.green * y.green)))),.blue =round(sqrt(abs((x.blue * x.blue) + (y.blue * y.blue)))),};
            if (net.red > 255)
            {
                net.red = 255;
            }
            if (net.blue > 255)
            {
                net.blue = 255;
            }
            if (net.green > 255)
            {
                net.green = 255;
            }
            image[i - 1][j - 1].rgbtRed = net.red;
            image[i - 1][j - 1].rgbtGreen = net.green;
            image[i - 1][j - 1].rgbtBlue = net.blue;
        }
    }
    return;
}

我从过去 5 小时开始尝试,但我不知道,我做错了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)