【发布时间】:2020-10-27 12:53:53
【问题描述】:
我正在尝试解决 CS50x 课程中 PSET4 滤镜(更少)中的模糊功能。这就是问题所在:
模糊
有多种方法可以创建模糊或柔化图像的效果。对于这个问题,我们将使用“框模糊”,它的工作原理是获取每个像素,并且对于每个颜色值,通过平均相邻像素的颜色值给它一个新值。
每个像素的新值将是原始像素 1 行和列内的所有像素值的平均值(形成一个 3x3 框)。例如,像素 6 的每个颜色值将通过平均像素 1、2、3、5、6、7、9、10 和 11 的原始颜色值来获得(请注意,像素 6 本身包含在平均的)。同样,像素 11 的颜色值将通过平均像素 6、7、8、10、11、12、14、15 和 16 的颜色值来获得。
对于沿边缘或角落的像素,例如像素 15,我们仍会查找 1 行和列内的所有像素:在本例中为像素 10、11、12、14、15 和 16。
这是我目前写的代码:
// Blur image
void blur(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;
float count = 0.0;
int blurRed = 0;
for (int k = 0; (k <= i + 1) && (k < height); k++)
{
for (int l = 0; (l <= j + 1) && (l < width); l++)
{
int sumRed = image[k][l].rgbtRed;
if ((k - 1 >= 0) && (k + 1 < height))
//these if statements should ensure that the following action is only carried out IF the k/l indices do not exceed height and width
{
sumRed += image[k - 1][l].rgbtRed;
count++;
}
if ((l - 1 >= 0) && (l + 1 < width))
{
sumRed += image[k][l - 1].rgbtRed;
count++;
}
blurRed = roundf(sumRed / count);
}
}
red = blurRed;
}
}
}
虽然我不确定我的解决方案是否走在正确的轨道上。当我运行代码时,我收到以下错误消息:
helpers.c:139:45:运行时错误:除以零 helpers.c:139:32:运行时错误:inf 超出了“int”类型的可表示值的范围
所以我想知道为什么我的计数器总是保持在 0。
期待一些帮助和答案!
【问题讨论】:
-
请注意,
(k - 1 >= 0) && (k + 1 < height)是(k > 0) && (k <= height)的等价物,难以阅读。所以你永远不会输入k == 0,并且k总是小于height,因为for循环条件。
标签: c if-statement cs50 divide-by-zero