c#画像のボリュームとフィルタリングを実現——ガウス平滑化


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の間に直接遮断すればいいです.負数の場合、絶対値をとることもできます.
二、ボリューム核
        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