代码之家  ›  专栏  ›  技术社区  ›  Butterworth Filter

CS50 Pset4过滤更少的褐色。如果没有使用公式输出正确的RBG值

  •  0
  • Butterworth Filter  · 技术社区  · 2 年前
    // Convert image to sepia
    void sepia(int height, int width, RGBTRIPLE image[height][width])
    {
        int i = 0;
        int j = 0;
        int oRed;
        int oGreen;
        int oBlue;
        int sepiaBlue;
        int sepiaGreen;
        int sepiaRed;
    
    
        for (i = 0; i < height; i++)
        {
            for (j = 0; j < width; j++)
            {
                oRed = image[i][j].rgbtRed;
                oGreen = image[i][j].rgbtGreen;
                oBlue = image[i][j].rgbtBlue;
                sepiaRed = round((.393 * oRed) + (.769 * oGreen) + (.189 * oBlue));
                sepiaGreen = round((.349 * oRed) + (.686 * oGreen) + (.168 * oBlue));
                sepiaRed = round((.272 * oRed) + (.534 * oGreen) + (.131 * oBlue));
    
                if (sepiaRed > 255)
                {
                    sepiaRed = 255;
                }
    
                if (sepiaGreen > 255)
                {
                    sepiaGreen = 255;
                }
    
                if (sepiaBlue > 255)
                {
                    sepiaBlue = 255;
                }
    
                image[i][j].rgbtRed = sepiaRed;
                image[i][j].rgbtGreen = sepiaGreen;
                image[i][j].rgbtBlue = sepiaBlue;
            }
        }
    
        return;
    }
    

    检查结果:

    使用像素(20、40、90)进行测试 跑步/正在测试1 0。。。 正在检查输出“56 50 39\n”。。。 预期输出: 56 50 39 实际输出: 39 50 0

    当我确信我使用了corect公式时,它只是输出了错误的RGB值。 如下所示,甚至无法获得一个像素的权利。不确定问题出在哪里。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Fe2O3    2 年前

    在处理重复代码(复制/粘贴)时,很容易出现无意的失明。

    敏锐的读者看到 的实例 sepiaRed = round((...
    你要小心。。。

    既然你看到了bug,再看看什么是好的&坏消息正试图告诉你。注意值的位置 39 出现?注意值 0 在中 蓝色 频道


    试着写更多 契约 代码,并使用简化水平和垂直扫描的布局和变量名:

    // Convert image to sepia
    void sepia( int height, int width, RGBTRIPLE image[height][width] ) {
        for ( int i = 0; i < height; i++ ) {
            for ( int j = 0; j < width; j++ ) {
                int red = image[i][j].rgbtRed;
                int grn = image[i][j].rgbtGreen;
                int blu = image[i][j].rgbtBlue;
    
                int sred = round((.393 * red) + (.769 * grn) + (.189 * blu));
                int sgrn = round((.349 * red) + (.686 * grn) + (.168 * blu));
                int sblu = round((.272 * red) + (.534 * grn) + (.131 * blu));
    
                image[i][j].rgbtRed     = (sred > 255) ? 255 : sred;
                image[i][j].rgbtGreen   = (sgrn > 255) ? 255 : sgrn;
                image[i][j].rgbtBlue    = (sblu > 255) ? 255 : sblu;
            }
        }
    }