Я работаю над программой, которая немного размывает изображение в c.
Зная, что мне нужны средние значения и значения rgb для 8 окружающих пикселей и выбранного пикселя, чтобы изменить цвет этого пикселя, я добавил их вместе и взял среднее значение.
Я знаю, что способ, которым я реализую это, не самый эффективный способ, которым это может быть сделано, поэтому, если есть какие-либо предложения о том, как упростить это, пожалуйста, дайте мне знать.
Я планирую скопировать tempimage
обратно в image
в третьем цикле for в конце.
Структура RGBTRIPLE
содержит значения rgb для пикселя.
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
Теперь моя проблема связана с особыми случаями, такими как края изображения или пиксели на стороне.
Как получить значения окружающих пикселей, если выбранный пиксель не окружен 9 пикселями?
Вот мой код:
void blur(int height, int width, RGBTRIPLE image[height][width])
{
// copy all values to temporary image
RGBTRIPLE tempimage[height][width];
int avgRed = 0;
int avgGreen = 0;
int avgBlue = 0;
//copy pixels to temp image
for ( int x = 0; x < height; x++)
{
for (int y = 0; y < width; y++)
{
tempimage[x][y] = image[x][y];
}
}
//get average of surrounding pixels
for ( int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
//TODO: edge check
//surrounding pixels
avgRed = round(((float)(image[i][j].rgbtRed
+ image[i][j - 1].rgbtRed + image[i][j + 1].rgbtRed
+ image[i - 1][j].rgbtRed + image[i - 1][j - 1].rgbtRed
+ image[i - 1][j + 1].rgbtRed + image[i + 1][j].rgbtRed
+ image[i + 1][j - 1].rgbtRed + image[i + 1][j + 1].rgbtRed)) / 9);
avgGreen = round(((float)(image[i][j].rgbtGreen
+ image[i][j - 1].rgbtGreen + image[i][j + 1].rgbtGreen
+ image[i - 1][j].rgbtGreen + image[i - 1][j - 1].rgbtGreen
+ image[i - 1][j + 1].rgbtGreen + image[i + 1][j].rgbtGreen
+ image[i + 1][j - 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen)) / 9);
avgBlue = round(((float)(image[i][j].rgbtBlue
+ image[i][j - 1].rgbtBlue + image[i][j + 1].rgbtBlue
+ image[i - 1][j].rgbtBlue + image[i - 1][j - 1].rgbtBlue
+ image[i - 1][j + 1].rgbtBlue + image[i + 1][j].rgbtBlue
+ image[i + 1][j - 1].rgbtBlue + image[i + 1][j + 1].rgbtBlue)) / 9);
tempimage[i][j].rgbtRed = avgRed;
tempimage[i][j].rgbtGreen = avgGreen;
tempimage[i][j].rgbtBlue = avgBlue;
}
}
//TODO: for loop to copy tempimage back to image here
return;
}