使用框模糊算法来模糊图像-除了最后一行,其他一切都可以



我正在研究一个框模糊算法,我必须为课程的一个练习实现它。基本上,我需要拍摄一张图像,并使用这个算法模糊每个像素(下面是课程的描述(。

"对于这个问题,我们将使用"框模糊",它的工作原理是取每个像素,对于每个颜色值,通过平均相邻像素的颜色值来给它一个新值"考虑下面的像素网格,我们对每个像素进行了编号。

https://i.stack.imgur.com/83CjW.jpg

每个像素的新值将是原始像素的1行和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行和1列内的所有像素:在这种情况下,是像素10、11、12、14、15和16。

因此,我尝试实现我的解决方案,创建一个扩展数组,其中图像周围的所有行和列的颜色值都应该设置为0。这样,我就不需要考虑边缘、角落的情况了。

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
int red = 0, green = 0, blue = 0;
float counter = 0.0;
int exheight = height + 2;
int exwidth = width + 2;
// Creates an extended array to make the implementation of the box blur algorithm easier
RGBTRIPLE eximg[exheight][exwidth];
for (int i = 0; i < exheight; i++) {
for (int j = 0; j < exwidth; j++) {
if (i == 0 || i == height + 1) {
eximg[i][j].rgbtRed = 0;
eximg[i][j].rgbtGreen = 0;
eximg[i][j].rgbtBlue = 0;
}                                  // Sets the '0' color value for the pixels in the extended row and column
if (j == 0 || j == width + 1) {    
eximg[i][j].rgbtRed = 0;
eximg[i][j].rgbtGreen = 0;
eximg[i][j].rgbtBlue = 0;
}
else if (i > 0) {
eximg[i][j].rgbtRed = image[i - 1][j - 1].rgbtRed;
eximg[i][j].rgbtGreen = image[i - 1][j - 1].rgbtGreen;    // Configure the layout for the extended array
eximg[i][j].rgbtBlue = image[i - 1][j - 1].rgbtBlue;
}

}
}
// Configure the blur effect for each pixel
for (int i = 1; i < exheight; i++) {
for (int j = 1; j < exwidth; j++) {
red = 0;
green = 0;
blue = 0;
counter = 0.0;
// Sets the counter for edge pixels
if (i - 1 == 0 && (j - 1 == 0 || j - 1 == 3)) {
counter = 4.0;
}
// Sets the counter for corner pixels
else if ((i == 1 && (j == 2 || j == 3)) || (i == 4 && (j == 2 || j == 3)) || (j == 1 && (i == 2 || i == 3)) || (j == 4 && (i == 2 || i == 3))) {
counter = 6.0;
}
// Sets the counter for middle pixels
else {
counter = 9.0;
}
// Calculation for the pixels
red = round((eximg[i][j].rgbtRed + eximg[i][j - 1].rgbtRed + eximg[i][j + 1].rgbtRed + eximg[i - 1][j - 1].rgbtRed + eximg[i - 1][j].rgbtRed + eximg[i - 1][j + 1].rgbtRed + eximg[i + 1][j - 1].rgbtRed + eximg[i + 1][j].rgbtRed + eximg[i + 1][j + 1].rgbtRed) / counter);
green = round((eximg[i][j].rgbtGreen + eximg[i][j - 1].rgbtGreen + eximg[i][j + 1].rgbtGreen + eximg[i - 1][j - 1].rgbtGreen + eximg[i - 1][j].rgbtGreen + eximg[i - 1][j + 1].rgbtGreen + eximg[i + 1][j - 1].rgbtGreen + eximg[i + 1][j].rgbtGreen + eximg[i + 1][j + 1].rgbtGreen) / counter);
blue = round((eximg[i][j].rgbtBlue + eximg[i][j - 1].rgbtBlue + eximg[i][j + 1].rgbtBlue + eximg[i - 1][j - 1].rgbtBlue + eximg[i - 1][j].rgbtBlue + eximg[i - 1][j + 1].rgbtBlue + eximg[i + 1][j - 1].rgbtBlue + eximg[i + 1][j].rgbtBlue + eximg[i + 1][j + 1].rgbtBlue) / counter);
// Applies the changes to the original image array
image[i - 1][j - 1].rgbtRed = red;
image[i - 1][j - 1].rgbtGreen = green;
image[i - 1][j - 1].rgbtBlue = blue;
}
}
return;
}

然后,我用一个4x4图像检查了我的输出。这是预期的输出:70 85 9580 95 105100 115 125110 125 135113 126 136123 136 145142 155 163152 165 173113 119 136143 151 164156 166 171180 190 194113 112 132155 156 171169 174 177203 207 209

这是我的输出:70 85 9580 95 105100 115 125110 125 135113 126 136123 136 145142 155 163152 165 173113 119 136143 151 164156 166 171180 190 19478 78 58239 198 211253 0 2118 119 147

一切正常,只有最后一行不正确。有人能帮我找出错误在哪里吗?

问题解决了!黑色像素插入确实错误,还有验证像素是否在图像的边缘、角落或中间的条件。现在一切都好了!

最新更新