微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CS50 pset4 过滤器“边缘”

如何解决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 举报,一经查实,本站将立刻删除。