如何解决如何使用具有一系列结构的框模糊算法来模糊图像?
这个问题一开始可能令人困惑,但是我已经制定了一个对设置的输入图片执行模糊滤镜的功能(该功能相当长)。如果我真的很诚实,我不知道我在哪里搞砸了,但是代码不起作用。
功能如下:
void blur(int height,int width,RGBTRIPLE image[height][width])
{
RGBTRIPLE average[height][width];
for(int i = 0 ; i < height ; i++ )
{
for(int j = 0 ; j < width ; j++ )
{
if ( (i == 0 && j == 0) || (i == 0 && j == width - 1) )
{
if ( j == 0 )
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i][j+1].rgbtRed + (float)image[i+1][j+1].rgbtRed + (float)image[i+1][j].rgbtRed)/4.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i][j+1].rgbtBlue + (float)image[i+1][j+1].rgbtBlue + (float)image[i+1][j].rgbtBlue)/4.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i][j+1].rgbtGreen + (float)image[i+1][j+1].rgbtGreen + (float)image[i+1][j].rgbtGreen)/4.0);
}
else if( j == width - 1)
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i][j-1].rgbtRed + (float)image[i+1][j-1].rgbtRed + (float)image[i+1][j].rgbtRed)/4.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i][j-1].rgbtBlue + (float)image[i+1][j-1].rgbtBlue + (float)image[i+1][j].rgbtBlue)/4.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i][j-1].rgbtGreen + (float)image[i+1][j-1].rgbtGreen + (float)image[i+1][j].rgbtGreen)/4.0);
}
}
else if ( i == 0 )
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i][j+1].rgbtRed + (float)image[i+1][j+1].rgbtRed + (float)image[i+1][j].rgbtRed + (float)image[i+1][j-1].rgbtRed + (float)image[i][j-1].rgbtRed)/6.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i][j+1].rgbtBlue + (float)image[i+1][j+1].rgbtBlue + (float)image[i+1][j].rgbtBlue + (float)image[i+1][j-1].rgbtBlue + (float)image[i][j-1].rgbtBlue)/6.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i][j+1].rgbtGreen + (float)image[i+1][j+1].rgbtGreen + (float)image[i+1][j].rgbtGreen + (float)image[i+1][j-1].rgbtGreen + (float)image[i][j-1].rgbtGreen)/6.0);
}
else if ( (i == height - 1 && j == 0) || (i == height - 1 && j == width - 1) )
{
if ( j == 0 )
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i-1][j].rgbtRed + (float)image[i-1][j+1].rgbtRed + (float)image[i][j+1].rgbtRed)/4.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i-1][j].rgbtBlue + (float)image[i-1][j+1].rgbtBlue + (float)image[i][j+1].rgbtBlue)/4.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i-1][j].rgbtGreen + (float)image[i-1][j+1].rgbtGreen + (float)image[i][j+1].rgbtGreen)/4.0);
}
else if( j == width - 1)
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i-1][j].rgbtRed + (float)image[i-1][j-1].rgbtRed + (float)image[i][j-1].rgbtRed)/4.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i-1][j].rgbtBlue + (float)image[i-1][j-1].rgbtBlue + (float)image[i][j-1].rgbtBlue)/4.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i-1][j].rgbtGreen + (float)image[i-1][j-1].rgbtGreen + (float)image[i][j-1].rgbtGreen)/4.0);
}
}
else if ( i == height - 1)
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i][j+1].rgbtRed + (float)image[i-1][j+1].rgbtRed + (float)image[i-1][j].rgbtRed + (float)image[i-1][j-1].rgbtRed + (float)image[i][j-1].rgbtRed)/6.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i][j+1].rgbtBlue + (float)image[i-1][j+1].rgbtBlue + (float)image[i-1][j].rgbtBlue + (float)image[i-1][j-1].rgbtBlue + (float)image[i][j-1].rgbtBlue)/6.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i][j+1].rgbtGreen + (float)image[i-1][j+1].rgbtGreen + (float)image[i-1][j].rgbtGreen + (float)image[i-1][j-1].rgbtGreen + (float)image[i][j-1].rgbtGreen)/6.0);
}
else if ( j == 0 )
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i-1][j].rgbtRed + (float)image[i-1][j+1].rgbtRed + (float)image[i][j+1].rgbtRed + (float)image[i+1][j+1].rgbtRed + (float)image[i+1][j].rgbtRed)/6.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i-1][j].rgbtBlue + (float)image[i-1][j+1].rgbtBlue + (float)image[i][j+1].rgbtBlue + (float)image[i+1][j+1].rgbtBlue + (float)image[i+1][j].rgbtBlue)/6.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i-1][j].rgbtGreen + (float)image[i-1][j+1].rgbtGreen + (float)image[i][j+1].rgbtGreen + (float)image[i+1][j+1].rgbtGreen + (float)image[i+1][j].rgbtGreen)/6.0);
}
else if ( j == width - 1 )
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i-1][j].rgbtRed + (float)image[i-1][j-1].rgbtRed + (float)image[i][j-1].rgbtRed + (float)image[i+1][j-1].rgbtRed + (float)image[i+1][j].rgbtRed)/6.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i-1][j].rgbtBlue + (float)image[i-1][j-1].rgbtBlue + (float)image[i][j-1].rgbtBlue + (float)image[i+1][j-1].rgbtBlue + (float)image[i+1][j].rgbtBlue)/6.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i-1][j].rgbtGreen + (float)image[i-1][j-1].rgbtGreen + (float)image[i][j-1].rgbtGreen + (float)image[i+1][j-1].rgbtGreen + (float)image[i+1][j].rgbtGreen)/6.0);
}
else
{
average[i][j].rgbtRed = round(((float)image[i][j].rgbtRed + (float)image[i][j+1].rgbtRed + (float)image[i-1][j+1].rgbtRed + (float)image[i-1][j].rgbtRed + (float)image[i-1][j-1].rgbtRed + (float)image[i][j-1].rgbtRed + (float)image[i+1][j-1].rgbtRed + (float)image[i+1][j].rgbtRed + (float)image[i+1][j-1].rgbtRed)/9.0);
average[i][j].rgbtBlue = round(((float)image[i][j].rgbtBlue + (float)image[i][j+1].rgbtBlue + (float)image[i-1][j+1].rgbtBlue + (float)image[i-1][j].rgbtBlue + (float)image[i-1][j-1].rgbtBlue + (float)image[i][j-1].rgbtBlue + (float)image[i+1][j-1].rgbtBlue + (float)image[i+1][j].rgbtBlue + (float)image[i+1][j-1].rgbtBlue)/9.0);
average[i][j].rgbtGreen = round(((float)image[i][j].rgbtGreen + (float)image[i][j+1].rgbtGreen + (float)image[i-1][j+1].rgbtGreen + (float)image[i-1][j].rgbtGreen + (float)image[i-1][j-1].rgbtGreen + (float)image[i][j-1].rgbtGreen + (float)image[i+1][j-1].rgbtGreen + (float)image[i+1][j].rgbtGreen + (float)image[i+1][j-1].rgbtGreen)/9.0);
}
}
}
memcpy(image,average,sizeof(image));
}
这是定义RGBTRIPLE类的结构:
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
这些是我需要发展的要点:
:( blur correctly filters middle pixel
expected "127 140 149\n",not "120 140 150\n"
:) blur correctly filters pixel on edge
:) blur correctly filters pixel in corner
:( blur correctly filters 3x3 image
expected "70 85 95\n80 9...",not "70 85 95\n80 9..."
:( blur correctly filters 4x4 image
expected "70 85 95\n80 9...",not "70 85 95\n80 9..."
Link to checker is: https://submit.cs50.io/check50/4c25523bd0c350f307c8b7e47326b0f3e40c5b31
任何输入都会有所帮助!提前谢谢你
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。