【发布时间】:2021-09-29 14:58:53
【问题描述】:
我真的找不到我的代码有什么问题。输出图像甚至根本没有转换为棕褐色;它有点像灰度,有粉红色的天空。我应用的算法是正确的,并且我确实使用了 math.h 中实现的 round 函数。我猜我的 if-else 语句可能有问题?
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
//process pixels by row
for (int i = 0; i < height; i++)
{
//process a single pixel in a row
for(int j = 0; j < width; j++)
{
//implement the algorithm
float sepiaRed = 0.393 * image[i][j].rgbtRed + 0.769 * image[i][j].rgbtGreen + 0.189 * image[i][j].rgbtBlue;
//round sepiaRed
image[i][j].rgbtRed = round(sepiaRed);
if (image[i][j].rgbtRed > 255)
{
image[i][j].rgbtRed = 255;
}
else
{
image[i][j].rgbtRed = image[i][j].rgbtRed;
}
float sepiaGreen = 0.349 * image[i][j].rgbtRed + 0.686 * image[i][j].rgbtGreen + 0.168 * image[i][j].rgbtBlue;
//round sepiaGreen
image[i][j].rgbtGreen = round(sepiaGreen);
if (image[i][j].rgbtGreen > 255)
{
image[i][j].rgbtGreen = 255;
}
else
{
image[i][j].rgbtGreen = image[i][j].rgbtGreen;
}
float sepiaBlue = 0.272 * image[i][j].rgbtRed + 0.534 * image[i][j].rgbtGreen + 0.131 * image[i][j].rgbtBlue;
//round sepiaBlue
image[i][j].rgbtBlue = round(sepiaBlue);
if (image[i][j].rgbtBlue > 255)
{
image[i][j].rgbtBlue = 255;
}
else
{
image[i][j].rgbtBlue = image[i][j].rgbtBlue;
}
}
}
return;
}
【问题讨论】:
-
image是unsigned char的数组吗?如果是,则任何元素都不会大于 255:无符号算术回绕((unsigned char)((unsigned char)100 + (unsigned char)200)产生44) -
是的,我可以看到。
RGBTRIPLE的数组。RGBTRIPLE是由什么组成的? -
@pmg 我不确定。问题来自cs50.harvard.edu/x/2021/psets/4/filter/less,它带有一堆 .h 和 .c 文件,我对它们只有一点了解,但我的工作是为过滤器编写代码。
-
我的意思是:如果
image[i][j].rgbtRed是一个unsigned char分配超过255将环绕(image[i][j].rgbtRed = 280;实际上是image[i][j].rgbtRed = 24;) -
@pmg 它由 BYTE rgbtBlue 制成;字节 rgbtGreen; BYTE rgbtRed;