c#画像のボリュームとフィルタリングを実現——ガウス平滑化
4048 ワード
C#言語でガウススムージングを作成します.
一、線形フィルタリングとボリューム化の基本概念
2 Dボリュームは4つのネストされたループ4-double loopを必要とするので、小さなボリュームコアを使用しない限り、速くありません.ここでは一般的に3×3または5×5.また、フィルタについても、一定のルール要件があります.
1)フィルタの大きさは奇数であるべきで、このようにしてやっと1つの中心があって、例えば3×3,5×5または7×7.中心があって、半径の呼び方もあって、例えば5×5サイズの核の半径は2です.
2)フィルタマトリクスの全ての要素の和は1に等しくなければならない.これはフィルタ前後の画像の輝度を一定に保つためである.もちろん、これは無理な要求ではありません.
3)フィルタマトリクスの全要素の和が1より大きいと、フィルタ後の画像は元の画像よりも明るくなり、逆に1より小さいと、得られる画像は暗くなる.和が0の場合、画像は黒くなりませんが、非常に暗くなります.
4)フィルタリング後の構造では、負または255より大きい値が発生する場合があります.この場合、私たちは彼らを0と255の間に直接遮断すればいいです.負数の場合、絶対値をとることもできます.
二、ボリューム核
三、画像を畳み込む平滑化
参考文章:画像のボリュームとフィルタリングのいくつかの知識点-zouxy 09のコラム-ブログチャンネル-CSDN.NET作者:zouxy 09
一、線形フィルタリングとボリューム化の基本概念
2 Dボリュームは4つのネストされたループ4-double loopを必要とするので、小さなボリュームコアを使用しない限り、速くありません.ここでは一般的に3×3または5×5.また、フィルタについても、一定のルール要件があります.
1)フィルタの大きさは奇数であるべきで、このようにしてやっと1つの中心があって、例えば3×3,5×5または7×7.中心があって、半径の呼び方もあって、例えば5×5サイズの核の半径は2です.
2)フィルタマトリクスの全ての要素の和は1に等しくなければならない.これはフィルタ前後の画像の輝度を一定に保つためである.もちろん、これは無理な要求ではありません.
3)フィルタマトリクスの全要素の和が1より大きいと、フィルタ後の画像は元の画像よりも明るくなり、逆に1より小さいと、得られる画像は暗くなる.和が0の場合、画像は黒くなりませんが、非常に暗くなります.
4)フィルタリング後の構造では、負または255より大きい値が発生する場合があります.この場合、私たちは彼らを0と255の間に直接遮断すればいいです.負数の場合、絶対値をとることもできます.
二、ボリューム核
private double[,] GaussianBlur;//
///
/// (Convolution)
///
public Convolution()
{
//
int k=273;
GaussianBlur = new double[5, 5]{{(double)1/k,(double)4/k,(double)7/k,(double)4/k,(double)1/k},
{(double)4/k,(double)16/k,(double)26/k,(double)16/k,(double)4/k},
{(double)7/k,(double)26/k,(double)41/k,(double)26/k,(double)7/k},
{(double)4/k,(double)16/k,(double)26/k,(double)16/k,(double)4/k},
{(double)1/k,(double)4/k,(double)7/k,(double)4/k,(double)1/k}};
}
三、画像を畳み込む平滑化
///
/// ( Gaussian Blur)
///
///
///
public Bitmap Smooth(Bitmap bitmap)
{
int[, ,] InputPicture = new int[3, bitmap.Width, bitmap.Height];// GRB
Color color = new Color();//
// InputPicture RGB
for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
color = bitmap.GetPixel(i, j);
InputPicture[0, i, j] = color.R;
InputPicture[1, i, j] = color.G;
InputPicture[2, i, j] = color.B;
}
}
int[, ,] OutputPicture = new int[3, bitmap.Width, bitmap.Height];// GRB
Bitmap smooth = new Bitmap(bitmap.Width, bitmap.Height);//
// OutputPicture RGB
for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
int R=0;
int G=0;
int B=0;
//
for (int r = 0; r < 5; r++)//
{
for (int f = 0; f < 5; f++)//
{
//
int row = i - 2 + r;
int index = j - 2 + f;
// ,
row = row < 0 ? 0 : row;
index = index < 0 ? 0 : index;
row = row >= bitmap.Width ? bitmap.Width - 1 : row;
index = index >= bitmap.Height ? bitmap.Height - 1 : index;
// RGB
R += (int)(GaussianBlur[r, f] * InputPicture[0, row, index]);
G += (int)(GaussianBlur[r, f] * InputPicture[1, row, index]);
B += (int)(GaussianBlur[r, f] * InputPicture[2, row, index]);
}
}
color = Color.FromArgb(R,G,B);// RGB
smooth.SetPixel(i, j, color);//
}
}
return smooth;
}
参考文章:画像のボリュームとフィルタリングのいくつかの知識点-zouxy 09のコラム-ブログチャンネル-CSDN.NET作者:zouxy 09