我写了模糊函数的代码,它的输出不正确:
{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 列内。
您的实施存在一些问题:
您必须使用一组单独的像素作为模糊函数的源和目标,否则您将对当前像素右侧和下方的像素重复使用修改后的值。
您的实现在整个矩阵上使用 4 个嵌套循环,总时间复杂度为 O(N4),这在中等大图像上会很慢。您应该只在内部循环的 3x3 区域上迭代并为边缘情况添加测试。