CS50模糊功能实现

问题描述 投票:0回答:1

我写了模糊函数的代码,它的输出不正确:

{10,40,70
110,120,130
200,220,240}

上图是像素的3x3测试图。所有像素都是红色的。对中间像素

120
执行模糊使用我的代码给出平均
145
而不是
127
(正确答案)。对于那些不知道 cs50 使用的人;

链接

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    for (int row = 0; row < height; row++)
    {
        for (int column = 0; column < width; column++)
        {
            int sumRed = 0;
            int sumGreen = 0;
            int sumBlue = 0;
            int count = 0;
            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    if (abs(row - i) <= 1 && abs(column - j) <= 1)
                    {
                        sumRed += image[i][j].rgbtRed;
                        sumGreen += image[i][j].rgbtGreen;
                        sumBlue += image[i][j].rgbtBlue;
                        count++;
                    }
                }
            }

            float averagered = (float)sumRed / (count);
            float averagegreen = (float)sumGreen / (count);
            float averageblue= (float)sumBlue / (count);
            image[row][column].rgbtRed = round(averagered);
            image[row][column].rgbtGreen =  round(averagegreen);
            image[row][column].rgbtBlue =  round(averageblue);
        }
    }
    return;
}

我的代码是上面实现的。我的计划是使用前两个循环在每个像素处停止,然后使用另外两个循环从头开始迭代图像,并检查像素是否在我们停止的像素的 1 行和 1 列内。

c function nested-loops rgb cs50
1个回答
0
投票

您的实施存在一些问题:

  • 您必须使用一组单独的像素作为模糊函数的源和目标,否则您将对当前像素右侧和下方的像素重复使用修改后的值。

  • 您的实现在整个矩阵上使用 4 个嵌套循环,总时间复杂度为 O(N4),这在中等大图像上会很慢。您应该只在内部循环的 3x3 区域上迭代并为边缘情况添加测试。

© www.soinside.com 2019 - 2024. All rights reserved.