【问题标题】:cs50 filter(blur) assignment (pset4) (SOLVED!)cs50 过滤器(模糊)分配(pset4)(已解决!)
【发布时间】:2021-08-08 13:30:49
【问题描述】:

我正在做一个 cs50 分配过滤器(模糊)。我没有做得很好,但它正在工作。模糊图片中除第一行(北)和最后一行(南)之外的所有像素。并且图片的角落是模糊的,但是角落之后的像素颜色真的很不寻常。我不知道它的条件或颜色变化搞砸了。所以我可以用另一双眼睛来发现问题谢谢 [click here to see the issues in detail]

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE changed[height][width];

    for(int i=0 ; i<=height-1 ;i++)
    {
         for(int j=0 ; j<=width-1 ; j++)
         {
             if(i==0) //main if  north corners
             {
                 if (j==0)
                 {
                     changed[i][j].rgbtRed =round( (image[i][j].rgbtRed + image[i][j+1].rgbtRed + image[i+1][j+1].rgbtRed + image[i+1][j].rgbtRed) /4);
                     changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i][j+1].rgbtGreen + image[i+1][j+1].rgbtGreen + image[i+1][j].rgbtGreen) /4);
                     changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i][j+1].rgbtBlue + image[i+1][j+1].rgbtBlue + image[i+1][j].rgbtBlue) /4);


                 }

                 else if(j==width-1)
                 {
                     changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i][j-1].rgbtRed + image[i+1][j-1].rgbtRed + image[i+1][j].rgbtRed) /4);
                     changed[i][j].rgbtGreen = round( (image[i][j].rgbtGreen + image[i][j-1].rgbtGreen + image[i+1][j-1].rgbtGreen + image[i+1][j].rgbtGreen) /4);
                     changed[i][j].rgbtBlue = round( (image[i][j].rgbtBlue + image[i][j-1].rgbtBlue + image[i+1][j-1].rgbtBlue + image[i+1][j].rgbtBlue) /4);
                 }

             }

             else if(i==height-1) //main if south corners
             {
                 if (j==0)
                 {
                    changed[i][j].rgbtRed = round( (image[i][j].rgbtRed + image[i-1][j].rgbtRed + image[i-1][j+1].rgbtRed + image[i][j+1].rgbtRed) /4);
                    changed[i][j].rgbtGreen = round( (image[i][j].rgbtGreen + image[i-1][j].rgbtGreen + image[i-1][j+1].rgbtGreen + image[i][j+1].rgbtGreen) /4);
                    changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i-1][j].rgbtBlue + image[i-1][j+1].rgbtBlue + image[i][j+1].rgbtBlue) /4);
                 }

                 else if(j==width-1)
                 {
                    changed[i][j].rgbtRed = round ((image[i][j].rgbtRed + image[i-1][j].rgbtRed + image[i-1][j-1].rgbtRed + image[i][j-1].rgbtRed) /4);
                    changed[i][j].rgbtGreen = round ((image[i][j].rgbtGreen + image[i-1][j].rgbtGreen + image[i-1][j-1].rgbtGreen + image[i][j-1].rgbtGreen) /4);
                    changed[i][j].rgbtBlue = round ((image[i][j].rgbtBlue + image[i-1][j].rgbtBlue + image[i-1][j-1].rgbtBlue + image[i][j-1].rgbtBlue) /4);
                 }

             }

             else if(i>0 && i<height-1 && j==0) //main if left side
             {
                 changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i-1][j].rgbtRed + image[i-1][j+1].rgbtRed + image[i][j+1].rgbtRed + image[i+1][j+1].rgbtRed + image[i+1][j].rgbtRed) /6);
                 changed[i][j].rgbtGreen = round( (image[i][j].rgbtGreen + image[i-1][j].rgbtGreen + image[i-1][j+1].rgbtGreen + image[i][j+1].rgbtGreen + image[i+1][j+1].rgbtGreen + image[i+1][j].rgbtGreen) /6);
                 changed[i][j].rgbtBlue = round ((image[i][j].rgbtBlue + image[i-1][j].rgbtBlue + image[i-1][j+1].rgbtBlue + image[i][j+1].rgbtBlue + image[i+1][j+1].rgbtBlue + image[i+1][j].rgbtBlue) /6);

             }
             else if(i>0 && i<height-1 && j==width-1) //main if right side 
             {
                 changed[i][j].rgbtRed = round ((image[i][j].rgbtRed + image[i-1][j].rgbtRed + image[i-1][j-1].rgbtRed + image[i][j-1].rgbtRed + image[i+1][j-1].rgbtRed + image[i+1][j].rgbtRed) /6);
                 changed[i][j].rgbtGreen = round ((image[i][j].rgbtGreen + image[i-1][j].rgbtGreen + image[i-1][j-1].rgbtGreen + image[i][j-1].rgbtGreen + image[i+1][j-1].rgbtGreen + image[i+1][j].rgbtGreen) /6);
                 changed[i][j].rgbtBlue = round ((image[i][j].rgbtBlue + image[i-1][j].rgbtBlue + image[i-1][j-1].rgbtBlue + image[i][j-1].rgbtBlue + image[i+1][j-1].rgbtBlue + image[i+1][j].rgbtBlue) /6);
            }

            else if(i==0 && j>0 && j<width-1) //main if north side
            {
                changed[i][j].rgbtRed = round ((image[i][j].rgbtRed + image[i][j-1].rgbtRed + image[i+1][j-1].rgbtRed + image[i+1][j].rgbtRed + image[i+1][j+1].rgbtRed + image[i][j+1].rgbtRed) /6);
                changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i][j-1].rgbtGreen + image[i+1][j-1].rgbtGreen + image[i+1][j].rgbtGreen + image[i+1][j+1].rgbtGreen + image[i][j+1].rgbtGreen) /6);
                changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i][j-1].rgbtBlue + image[i+1][j-1].rgbtBlue + image[i+1][j].rgbtBlue + image[i+1][j+1].rgbtBlue + image[i][j+1].rgbtBlue) /6);

            }

            else if(i==height-1 && j>0 && j>width-1) //main if south side
            {
                changed[i][j].rgbtRed = round( (image[i][j].rgbtRed + image[i][j-1].rgbtRed + image[i-1][j-1].rgbtRed + image[i-1][j].rgbtRed + image[i-1][j+1].rgbtRed + image[i][j+1].rgbtRed) /6);
                changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i][j-1].rgbtGreen + image[i-1][j-1].rgbtGreen + image[i-1][j].rgbtGreen + image[i-1][j+1].rgbtGreen + image[i][j+1].rgbtGreen) /6);
                changed[i][j].rgbtBlue = round( (image[i][j].rgbtBlue + image[i][j-1].rgbtBlue + image[i-1][j-1].rgbtBlue + image[i-1][j].rgbtBlue + image[i-1][j+1].rgbtBlue + image[i][j+1].rgbtBlue) /6);
            }

            else //other pixels in the middle
            {
                changed[i][j].rgbtRed = round ((image[i][j].rgbtRed + image[i][j-1].rgbtRed + image[i-1][j-1].rgbtRed + image[i-1][j].rgbtRed + image[i-1][j+1].rgbtRed + image[i][j+1].rgbtRed + image[i+1][j+1].rgbtRed + image[i+1][j].rgbtRed + image[i+1][j-1].rgbtRed) /9);
                changed[i][j].rgbtGreen = round ((image[i][j].rgbtGreen + image[i][j-1].rgbtGreen + image[i-1][j-1].rgbtGreen + image[i-1][j].rgbtGreen + image[i-1][j+1].rgbtGreen + image[i][j+1].rgbtGreen + image[i+1][j+1].rgbtGreen + image[i+1][j].rgbtGreen + image[i+1][j-1].rgbtGreen) /9);
                changed[i][j].rgbtBlue = round( (image[i][j].rgbtBlue + image[i][j-1].rgbtBlue + image[i-1][j-1].rgbtBlue + image[i-1][j].rgbtBlue + image[i-1][j+1].rgbtBlue + image[i][j+1].rgbtBlue + image[i+1][j+1].rgbtBlue + image[i+1][j].rgbtBlue + image[i+1][j-1].rgbtBlue) /9);
            }
         }

    }

    for (int i = 0 ;i<=height-1 ; i++)
    {
        for (int j = 0 ; j<=width-1 ; j++)
        {
        image[i][j]=changed[i][j];
        }
    }


return;

}

【问题讨论】:

  • 我猜 rbgtRed 等是一种字符形式。这会导致加法 a.rgbtred + b.rebtred +.... +n.rgbtred 溢出。
  • 请用标点符号将您的问题分成句子。这真的很难读。另外,解释一下代码应该做什么,并举例说明它出错的地方。
  • @mksteve char 值将提升为 int 以在同一表达式中进行求和和除法。我希望他们是unsigned
  • 您正在执行整数除法,这会截断,使round() 函数无效。请除以4.06.09.0
  • @mksteve rgbtblue 是整数类型数据。它是图片像素中蓝色的数量。像素位于 i 的高度和 j 的宽度。我认为计算是正确的,但我检查并更改了 if 语句条件。还是没有好结果

标签: c cs50


【解决方案1】:

对图片中除第一行(北)和最后一行(南)以外的所有像素进行模糊处理

如果您对所有 ifs 和 elses 进行案例区分,您会发现应该处理 northsouth 的代码块em> 在前面的if(i==0)if(i==height-1) 之后不输入角之间的边;确实有这么多很容易错过的案例。您可以移动代码块,或者您可以使整个操作更简洁,例如。 g.:

    for (int i = 0; i < height; ++i)
     for (int j = 0; j < width; ++j)
     {
      int r = 0, g = 0, b = 0, c = 0;   // surrounding pixel color sums and count
      for (int y = i-1; y <= i+1; ++y) if (0 <= y && y < height)
       for (int x = j-1; x <= j+1; ++x) if (0 <= x && x < width)
        r += image[y][x].rgbtRed,
        g += image[y][x].rgbtGreen,
        b += image[y][x].rgbtBlue,
        ++c;
      // now compute the rounded averages
      changed[i][j].rgbtRed   = (r+c/2)/c;
      changed[i][j].rgbtGreen = (g+c/2)/c;
      changed[i][j].rgbtBlue  = (b+c/2)/c;
     }

【讨论】:

  • 一开始我还以为南北两排被省略了,结果有else if(i==0 &amp;&amp; j&gt;0 &amp;&amp; j&lt;width-1) //main if north sideelse if(i==height-1 &amp;&amp; j&gt;0 &amp;&amp; j&gt;width-1) //main if south side。但是现在我可以看到 i==0 已经测试过了,所以这些测试不会通过,因为它们在错误的代码块中。
  • 没错,有,是的,那些else ifs 没有在前面的if(i==0)if(i==height-1) 之后输入。但是,我知道我不应该写 没有处理的代码块 - 我会找到更好的措辞。谢谢你的评论!
  • @armali 是的,感谢您指出问题。实际上,您编写解决方案的方式在风格上要好得多,但我是初学者。我几乎对解决方案进行了硬编码,因此它可能存在问题也就不足为奇了。但我很害怕,因为我可能无法使用你的解决方案,因为算法突然随着你的解决方案而改变,所以如果我能以某种方式改变解决方案而不改变主题,他们可能会指责我违反学术诚实政策是惊人的。无论如何,感谢您的惊人解决方案。我会研究这个来学习!
  • @Armali 你可以看到修改后的代码!我已添加代码作为此问题的新答案
  • @Armali 哇,我按照你说的做了,它解决了整个错误,并且通过了所有测试。多亏了你,没有更多的问题可以制造错误。哇,问题很简单,但是因为代码的风格很糟糕。在没有注意到他们的情况下离开它是如此容易。你帮我找到了他们,谢谢!!
【解决方案2】:

这是修改后的代码

RGBTRIPLE changed[height][width];

for (int i = 0 ; i <= height - 1 ;i++)
{
     for (int j = 0 ; j <= width - 1 ; j++)
     {
         //main if north side
        if (i == 0 && j > 0 && j < width - 1 )
        {
            changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i][j - 1].rgbtRed + image[i + 1][j - 1].rgbtRed + image[i + 1][j].rgbtRed + image[i + 1][j + 1].rgbtRed + image[i][j + 1].rgbtRed) / (6.0));
            changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i + 1][j - 1].rgbtGreen + image[i + 1][j].rgbtGreen + image[i + 1][j + 1].rgbtGreen + image[i][j + 1].rgbtGreen) / (6.0));
            changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i][j - 1].rgbtBlue + image[i + 1][j - 1].rgbtBlue + image[i + 1][j].rgbtBlue + image[i + 1][j + 1].rgbtBlue + image[i][j + 1].rgbtBlue) / (6.0));

        }
        //main if south side
        else if (i==height - 1  && j > 0 && j > width - 1)
        {
            changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i][j - 1].rgbtRed + image[i - 1][j - 1].rgbtRed + image[i - 1][j].rgbtRed + image[i - 1][j + 1].rgbtRed + image[i][j + 1].rgbtRed) / (6.0));
            changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i - 1][j - 1].rgbtGreen + image[i - 1][j].rgbtGreen + image[i - 1][j + 1].rgbtGreen + image[i][j + 1].rgbtGreen) / (6.0));
            changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i][j - 1].rgbtBlue + image[i - 1][j - 1].rgbtBlue + image[i - 1][j].rgbtBlue + image[i - 1][j + 1].rgbtBlue + image[i][j + 1].rgbtBlue) / (6.0));
        }


         //main if left side
         else if (i > 0 && i < height - 1 && j == 0)
         {
             changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i - 1][j].rgbtRed + image[i - 1][j + 1].rgbtRed + image[i][j + 1].rgbtRed + image[i + 1][j + 1].rgbtRed + image[i + 1][j].rgbtRed) / 6.0);
             changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i - 1][j + 1].rgbtGreen + image[i][j + 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen + image[i + 1][j].rgbtGreen) / 6.0);
             changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i - 1][j].rgbtBlue + image[i - 1][j + 1].rgbtBlue + image[i][j + 1].rgbtBlue + image[i + 1][j + 1].rgbtBlue + image[i + 1][j].rgbtBlue) / 6.0);

         }
         //main if right side
         else if (i > 0 && i < height - 1 && j == width - 1)
         {
             changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i - 1][j].rgbtRed + image[i - 1][j - 1].rgbtRed + image[i][j - 1].rgbtRed + image[i + 1][j - 1].rgbtRed + image[i + 1][j].rgbtRed) / 6.0);
             changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i - 1][j - 1].rgbtGreen + image[i][j - 1].rgbtGreen + image[i + 1][j - 1].rgbtGreen + image[i + 1][j].rgbtGreen) / 6.0);
             changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i - 1][j].rgbtBlue + image[i - 1][j - 1].rgbtBlue + image[i][j - 1].rgbtBlue + image[i + 1][j - 1].rgbtBlue + image[i + 1][j].rgbtBlue) / 6.0);
         }

         //main if  north corners
         if (i == 0)
         {
             //north left corner
             if (j == 0)
             {
                 changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i][j + 1].rgbtRed + image[i + 1][j + 1].rgbtRed + image[i + 1][j].rgbtRed) / 4.0);
                 changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen + image[i + 1][j].rgbtGreen) / 4.0);
                 changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i][j + 1].rgbtBlue + image[i + 1][j + 1].rgbtBlue + image[i + 1][j].rgbtBlue) / 4.0);


             }

             //north left corner
             else if (j == width - 1)
             {
                 changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i][j - 1].rgbtRed + image[i + 1][j - 1].rgbtRed + image[i + 1][j].rgbtRed) / 4.0);
                 changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i + 1][j - 1].rgbtGreen + image[i + 1][j].rgbtGreen) / 4.0);
                 changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i][j - 1].rgbtBlue + image[i + 1][j - 1].rgbtBlue + image[i + 1][j].rgbtBlue) / 4.0);
             }

         }
         //main if south corners
         else if (i == height - 1)
         {
             //south right corner
             if (j == 0)
             {
                changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i - 1][j].rgbtRed + image[i - 1][j + 1].rgbtRed + image[i][j + 1].rgbtRed) / 4.0);
                changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i - 1][j + 1].rgbtGreen + image[i][j + 1].rgbtGreen) / 4.0);
                changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i - 1][j].rgbtBlue + image[i - 1][j + 1].rgbtBlue + image[i][j + 1].rgbtBlue) / 4.0);
             }

             //south left corner
             else if (j == width - 1)
             {
                changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i - 1][j].rgbtRed + image[i - 1][j - 1].rgbtRed + image[i][j - 1].rgbtRed) / 4.0);
                changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i - 1][j - 1].rgbtGreen + image[i][j - 1].rgbtGreen) / 4.0);
                changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i - 1][j].rgbtBlue + image[i - 1][j - 1].rgbtBlue + image[i][j - 1].rgbtBlue) / 4.0);
             }
         }

        else //other pixels in the middle
        {
            changed[i][j].rgbtRed = round((image[i][j].rgbtRed + image[i][j - 1].rgbtRed + image[i - 1][j - 1].rgbtRed + image[i - 1][j].rgbtRed + image[i - 1][j + 1].rgbtRed + image[i][j + 1].rgbtRed + image[i + 1][j + 1].rgbtRed + image[i + 1][j].rgbtRed + image[i + 1][j - 1].rgbtRed) / (9.0));
            changed[i][j].rgbtGreen = round((image[i][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i - 1][j - 1].rgbtGreen + image[i - 1][j].rgbtGreen + image[i - 1][j + 1].rgbtGreen + image[i][j + 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen + image[i + 1][j].rgbtGreen + image[i + 1][j - 1].rgbtGreen) / (9.0));
            changed[i][j].rgbtBlue = round((image[i][j].rgbtBlue + image[i][j - 1].rgbtBlue + image[i - 1][j - 1].rgbtBlue + image[i - 1][j].rgbtBlue + image[i - 1][j + 1].rgbtBlue + image[i][j + 1].rgbtBlue + image[i + 1][j + 1].rgbtBlue + image[i + 1][j].rgbtBlue + image[i + 1][j - 1].rgbtBlue) / (9.0));
        }
      }

}

//putting the changed color value in original image(applying the blue filter)
for (int i = 0 ; i <= height - 1   ; i++)
{
    for (int j = 0 ; j <= width - 1 ; j++)
    {
        image[i][j] = changed[i][j];
    }
}


return;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多