【发布时间】:2020-06-13 19:35:57
【问题描述】:
我正在开发一个程序,它会稍微模糊 c 中的图像。
知道我需要 8 个周围像素和所选像素的平均值和 rgb 值来更改该像素的颜色,我将它们加在一起并取平均值。
我知道我执行此操作的方式并不是最有效的方式,因此如果有任何关于如何简化此操作的建议,请告诉我。
我计划在最后的第三个 for 循环中将 tempimage 复制回 image。
结构 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;
}
【问题讨论】:
-
你需要选择当像素没有被包围时要做什么。您可以采样更少的像素,或者您可以将最近的像素重新采样到丢失的像素
-
您不需要将像素复制到临时图像。从源代码中读取,然后将它们分配给临时文件。现在,跳过困难的部分,只做除边界之外的所有事情。使用当前像素的偏移量的循环和查找表。一旦你有了它,你就可以对边缘和角落进行特殊处理..