我正在尝试模糊一个图像的基础上,我的教程如下。这里的指示。
模糊有很多种方法可以创建模糊或柔化图像的效果。对于这个问题,我们将使用“框模糊”,它的工作原理是取每个像素,并为每个颜色值,通过平均相邻像素的颜色值来赋予它一个新的值。
考虑下面的像素网格,其中我们对每个像素进行了编号。
像素网格
每个像素的新值将是原始像素的1行和1列内的所有像素的值的平均值例如,像素6的每个颜色值将通过平均像素1、2、3、5、6、7、9、10的原始颜色值来获得,类似地,像素11的颜色值将通过对像素6、7、8、10、11、12、14、15和16的颜色值求平均来获得。
对于沿着边缘或角的像素,如像素15,我们仍将寻找1行和1列内的所有像素:在这种情况下,像素10、11、12、14、15和16。
为了解决这个问题,我想出了这个办法。
for each row
for each column
add the pixel if upper left exists
add the pixel if directly above exists
add the pixel if upper right exists
add the pixel if right exists
add the pixel if directly below exists
add the pixel if left exists
divide by times added
我已经输入了代码-
void blur(int height, int width, RGBTRIPLE image[height][width])
{
int red;
int green;
int blue;
int counter = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (i + 1 && j - 1)
{
red = image[i][j].rgbtRed + image[i + 1][j - 1].rgbtRed;
green = image[i][j].rgbtGreen + image[i + 1][j - 1].rgbtGreen;
blue = image[i][j].rgbtBlue + image[i + 1][j - 1].rgbtBlue;
counter++;
}
if (j + 1)
{
red = image[i][j].rgbtRed + image[i][j + 1].rgbtRed;
green = image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen;
blue = image[i][j].rgbtBlue + image[i][j + 1].rgbtBlue;
counter++;
}
if (i + 1 && j + 1)
{
red = image[i][j].rgbtRed + image[i + 1][j + 1].rgbtRed;
green = image[i][j].rgbtGreen + image[i + 1][j + 1].rgbtGreen;
blue = image[i][j].rgbtBlue + image[i + 1][j + 1].rgbtBlue;
counter++;
}
if (i + 1)
{
red = image[i][j].rgbtRed + image[i + 1][j].rgbtRed;
green = image[i][j].rgbtGreen + image[i + 1][j].rgbtGreen;
blue = image[i][j].rgbtBlue + image[i + 1][j].rgbtBlue;
counter++;
}
if (j - 1)
{
red = image[i][j].rgbtRed + image[i][j - 1].rgbtRed;
green = image[i][j].rgbtGreen + image[i][j - 1].rgbtGreen;
blue = image[i][j].rgbtBlue + image[i][j - 1].rgbtBlue;
counter++;
}
if (i - 1)
{
red = image[i][j].rgbtRed + image[i - 1][j].rgbtRed;
green = image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen;
blue = image[i][j].rgbtBlue + image[i - 1][j].rgbtBlue;
counter++;
}
image[i][j].rgbtRed = red/counter;
image[i][j].rgbtGreen = green/counter;
image[i][j].rgbtBlue = blue/counter;
}
}
return;
}
好像我得到了错误消息
~/pset4/filter/ $ ./filter -b images/courtyard.bmp test.bmp
helpers.c:84:45: runtime error: index -1 out of bounds for type 'RGBTRIPLE [width]'
helpers.c:85:49: runtime error: index -1 out of bounds for type 'RGBTRIPLE [width]'
helpers.c:86:47: runtime error: index -1 out of bounds for type 'RGBTRIPLE [width]'
helpers.c:112:45: runtime error: index -1 out of bounds for type 'RGBTRIPLE [width]'
helpers.c:113:49: runtime error: index -1 out of bounds for type 'RGBTRIPLE [width]'
helpers.c:114:47: runtime error: index -1 out of bounds for type 'RGBTRIPLE [width]'
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==4657==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x7fd1249a490a (pc 0x00000042b7ea bp 0x7ffd589ca4f0 sp 0x7ffd589c90f0 T4657)
==4657==The signal is caused by a READ memory access.
#0 0x42b7e9 (/home/ubuntu/pset4/filter/filter+0x42b7e9)
#1 0x422ed2 (/home/ubuntu/pset4/filter/filter+0x422ed2)
#2 0x7fd123897b96 (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
#3 0x402d69 (/home/ubuntu/pset4/filter/filter+0x402d69)
对我来说,这段代码似乎并没有真正解决这个问题。它在第一次迭代时就失败了。因为i
和j
的值变成了负值,因此并没有真正达到检查附近像素存在的目的。
你能分享一两点关于这里应该做些什么来更好地发现程序应该如何检测周围的像素吗?
6条答案
按热度按时间goqiplq21#
在C中,非零视为真,j=0处的j-1为-1真。
z6psavjg2#
这是一个更好的方法,有可能增加模糊框到其他维度形成一个3x3框,或其他。
qxsslcnc3#
好的,我正在高顶线程。。不幸的是提供的解决方案没有工作。正确的解决方案应该是这样的。
aiazj4mn4#
我已经研究这个问题两天了(天啊!编程是坚韧和令人沮丧的)。我需要一个很好的逻辑,可以帮助我们避免重复同样的事情一遍又一遍。因此,我发现了这个循环。希望它是可以理解的。请让我知道,如果有什么需要澄清。注:包括<math.h>
qrjkbowd5#
我写这篇文章时完全是一个野蛮人。
t3irkdon6#
这段代码在你考虑模糊一个图像或者使用方块模糊的n*n matxix时效果很好。它考虑顶部,底部和中间行,并且分别计算像素RGB。