我一直在為 CS50 做“無過濾器”問題,并注意到,這段代碼:
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i )
{
for (int j = 0; j < width; j )
{
image[i][j].rgbtBlue = (image[i][j].rgbtBlue image[i][j].rgbtRed image[i][j].rgbtGreen) / 3;
image[i][j].rgbtRed = image[i][j].rgbtBlue;
image[i][j].rgbtGreen = image[i][j].rgbtBlue;
}
}
return;
}
和這個,
// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i )
{
for (int j = 0; j < width; j )
{
image[i][j].rgbtBlue = (image[i][j].rgbtBlue image[i][j].rgbtRed image[i][j].rgbtGreen);
// Notice this line
image[i][j].rgbtBlue /= 3;
image[i][j].rgbtRed = image[i][j].rgbtBlue;
image[i][j].rgbtGreen = image[i][j].rgbtBlue;
}
}
return;
}
有完全不同的輸出,前者給出更好的結果。有人可以解釋這背后的原因嗎?為什么在單獨的行中進行算術運算時會有所不同?如果我在這里做錯了什么,請糾正我。
該程式應該以 BMP 格式獲取輸入影像,應用過濾器(在本例中為灰度)并創建輸出,該函式獲取影像的高度height和寬度width以及陣列中所述影像的 RGB 值image。
順便說一句,這是來自 CS50 的計算機科學入門課程第 4 周。
[編輯]
typedef uint8_t BYTE;
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
關于這個問題的更多資訊在這里:
https://cs50.harvard.edu/x/2022/psets/4/filter/less/
uj5u.com熱心網友回復:
image[i][j].rgbtBlue image[i][j].rgbtRed image[i][j].rgbtGreen比uint8_t能應付的大。和
image[i][j].rgbtBlue = (image[i][j].rgbtBlue image[i][j].rgbtRed image[i][j].rgbtGreen) / 3;
分配,例如,417/3(或者139,這里的操作是用 完成的int)給成員
image[i][j].rgbtBlue = (image[i][j].rgbtBlue image[i][j].rgbtRed image[i][j].rgbtGreen); image[i][j].rgbtBlue /= 3;
首先將417 % 256(或161)分配給成員,然后將其除以3
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/505833.html
上一篇:受約束的影像按鈕影像太放大了
