【问题标题】:Blurring a .BMP with box BLUR in C用 C 中的框 BLUR 模糊 .BMP
【发布时间】:2021-05-25 19:35:23
【问题描述】:

继续。我在下面编写的代码没有给我一个模糊的图像。但取而代之的是黑色图像(像素边缘除外)。 为了测试,我刚刚尝试了内部 PIXELS,没有边缘 RGBTRIPLE 像素,因为我想看看到目前为止我是否做得很好。

谁能告诉我我的代码有什么问题吗? muy BUFFER RGB newImage 是否正确完成?如果 image[height][width].rgbtRed 这意味着 newImage[height][width].rgbtRed 将存在??提前致谢

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{


    //create a buffer to allocate new pixels.
    RGBTRIPLE newImage[height][width];

    // iterate through each row
    for (int i = 0 ; i < height ; i++)
    {
         // iterate through each column passing through every RGBTRIPLE
        for ( int j = 0; j < width ; j++)
        {
            int redSum = 0;
            int greenSum = 0;
            int blueSum = 0;

             //counter for pixels being add in every avg.
             //int count = 0;
             // take the average amount of RGB of every pixel in a range of 3x3 pixels
             // avg for left top corner
             /*if ( r == 0 && l == 0) {

             }
             // avg left bottom corner
             else if ( r == height - 1 && l == 0 ){

             }
             // avg right top corner
             else if ( r == 0 && l == width - 1){

             }
             // avg left bottom corner
             else if ( r == height - 1 && l == width - 1){

             }
             // avg  top side
             else if ( r == 0 && l > 0 && l != width - 1) {

             }
             // avg right side
             else if ( l == width - 1 && r > 0 && r != height - 1) {

             }
             // avg bottom side
             else if ( r == height - 1 && l > 0 && l != width - 1) {

             }
             // avg left side
             else if ( l == 0 && r > 0 && r != height - 1){

             }*/

             for ( int iy = -1 ; iy >= 1 ; iy++)
             {
                 for ( int jx = -1 ; jx >= 1 ; jx++)
                 {
                     redSum = redSum + image[i + iy][j + jx].rgbtRed;
                     greenSum = greenSum + image[i + iy][j + jx].rgbtGreen;
                     blueSum = blueSum + image[i + iy][j + jx].rgbtBlue;
                     //count++;
                     }
             }

             int avgRed = redSum / 9;
             int avgGreen = greenSum / 9;
             int avgBlue = blueSum / 9;
             newImage[i][j].rgbtRed = avgRed;
             newImage[i][j].rgbtGreen = avgGreen;
             newImage[i][j].rgbtBlue = avgBlue;

        }

    }

    for ( int y = 1 ; y < height - 1; y++)
    {
        for ( int x = 1; x < width - 1; x++)
        {
            image[y][x].rgbtRed = newImage[y][x].rgbtRed;
            image[y][x].rgbtGreen = newImage[y][x].rgbtGreen;
            image[y][x].rgbtBlue = newImage[y][x].rgbtBlue;
        }

    }

    return;
}

【问题讨论】:

  • 这个:for ( int py = 0 ; py &gt;= 2 ; py++) 看起来不对。如果您更正比较,您将越界访问像素缓冲区,因为与您所说的相反,您不会只考虑内部像素,至少不会在大量测试被注释掉的情况下。
  • 请,请不要使用变量名 l。是l 还是1?在单型字体中,您可以通过眯眼辨别,但在比例字体中则不行。它只是使代码很难阅读。无论如何,将rl 一起使用会欺骗读者认为它们是rightleft,但它们是rowcolumn
  • /*if ( r == 0 &amp;&amp; l == 0) { } // avg left bottom corner else if ( r == height - 1 &amp;&amp; l == 0 ){ ... else if ( l == 0 &amp;&amp; r &gt; 0 &amp;&amp; r != height - 1){ }*/ 什么都不做。为什么会在那里?
  • @WeatherVane 谢谢。我会考虑到这一点。
  • @chux-ReinstateMonica 这是我的下一步行动......但我正在尝试解决第一个问题。

标签: c pointers blur


【解决方案1】:

评论中没有提到的一个主要错误是redSumgreenSumblueSum只被初始化为0一次,而在处理每个像素之前它们必须设置为零,所以最好移动定义就在for ( int py = 0 ; py &gt;= 2 ; py++) 循环之前。

【讨论】:

  • 另外,将新图像复制到旧图像的第二对循环的限制减少了一个。我想我可以明白为什么 - 边缘像素已被跳过,但循环的初始 0 不正确。代码完成后,不要除以9,而是除以边缘可以平均的像素数(也可以求和)。
  • 谢谢@WeatherVane 我更正了你所说的所有这些。现在我有没有版本的 4 个边缘。但是没有边缘的像素是黑色的。我发现缓冲区有问题.. //create a buffer to allocate new pixels. RGBTRIPLE newImage[height][width]; 然后... newImage[i][j].rgbtRed = avgRed; newImage[i][j].rgbtGreen = avgGreen; newImage[i][j].rgbtBlue = avgBlue; .rgbtRed .rgbtGreen 。 rgbtBlue 对于 newImage 2 数组真的存在吗??
  • 您可以将更正后的版本添加到您的问题中,以便我们查看是否仍有未定义行为的原因。
  • 好,只是你最好不要更改原始代码,而是添加修改后的版本。
【解决方案2】:

难以置信的是,很多人(包括我的)查看代码时会忽略主要的简单错误 - 内部循环(在其原始版本和编辑版本中)永远不会执行:

             for ( int iy = -1 ; iy >= 1 ; iy++)
             {
                 for ( int jx = -1 ; jx >= 1 ; jx++)

当然,iy &gt;= 1 条件从一开始就是假的;你肯定是指iy &lt;= 1jx &lt;= 1

【讨论】:

  • 问题已解决!正是那个循环:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多