c#中byte数组0x_C# 中值滤波

理解定义

中值滤波_百度百科​baike.baidu.com
c#中byte数组0x_C# 中值滤波_第1张图片
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。
关于中值滤波算法,以及C语言实现​www.360doc.com
c#中byte数组0x_C# 中值滤波_第2张图片

c#中byte数组0x_C# 中值滤波_第3张图片
“中值滤波”图解原理

代码实现

Step1:首先参考我之前的文章,将图像与二维数组互转

tsiensun:C# 图像与二维数组 互转​zhuanlan.zhihu.com

Step2:中值滤波C#函数

b1b1c5f158757b9d0f68d3a96458778a.png
“中值滤波” 公式
         private void button1_Click(object sender, EventArgs e)
        {
            byte[,] data;//[mH,mW]
            Bitmap bmp = new Bitmap(@"F:MyDoC#测试用IMGA盐椒噪音.jpg");
            pictureBox1.BackgroundImage = bmp;
            data = Image_2_Arry2D(bmp);//参照 Step1

            data = sf_medianFilter(data);

            Bitmap img = Arry2D_2_Image(data);//参照 Step1
            pictureBox2.BackgroundImage = img;



        }

         public static byte[,] sf_medianFilter(byte[,] sMat)
        {
            int mH = sMat.GetLength(0);
            int mW = sMat.GetLength(1);
            byte[,] Mat = new byte[mH, mW];
            byte[] block = new byte[9];
            for(int y=1;yMat[j])
                    {
                        temp = Mat[i];
                        Mat[i] = Mat[j];
                        Mat[j] = temp;
                    }
                }
            }
        }

Step3:运行效果

c#中byte数组0x_C# 中值滤波_第4张图片
中值滤波(忽略边缘像素)

扩展:

与中值滤波算法很类似的有:

最大值滤波,最小值滤波,均值滤波。

最大值滤波器,发现图像中最亮点非常有用;对于椒噪声具有良好效果。
最小值滤波器,发现图像中最暗点非常有用;对于盐噪声具有良好效果。
均值滤波主要还是平滑图像的用处,有的图像的锐度很高,用这样的均值算法,可以把锐度降低。使得图像看上去更加自然。

最大值滤波C#函数

7d4fa8684e044861cacefe23b8f0e748.png
“最大值滤波”公式
public static byte[,] sf_minvalFilter(byte[,] sMat)
        {
            int mH = sMat.GetLength(0);
            int mW = sMat.GetLength(1);
            byte[,] Mat = new byte[mH, mW];
            byte temp = 0;
            for (int y = 1; y < mH - 1; y++)
            {
                for (int x = 1; x < mW - 1; x++)
                {
                    temp = sMat[y, x];
                    temp = temp < sMat[y + 1, x] ? temp : sMat[y + 1, x];
                    temp = temp < sMat[y - 1, x] ? temp : sMat[y - 1, x];

                    temp = temp < sMat[y, x - 1] ? temp : sMat[y, x - 1];
                    temp = temp < sMat[y + 1, x - 1] ? temp : sMat[y + 1, x - 1];
                    temp = temp < sMat[y - 1, x - 1] ? temp : sMat[y - 1, x - 1];

                    temp = temp < sMat[y, x + 1] ? temp : sMat[y, x + 1];
                    temp = temp < sMat[y + 1, x + 1] ? temp : sMat[y + 1, x + 1];
                    temp = temp < sMat[y - 1, x + 1] ? temp : sMat[y - 1, x + 1];

                    Mat[y, x] = temp;
                }
            }
            return Mat;
        }

效果:

c#中byte数组0x_C# 中值滤波_第5张图片
“最大值滤波 ”白底 椒噪去除

最小值滤波C#函数

d04dac8dad025a78437faf2426b3393b.png
“最小值滤波”公式
public static byte[,] sf_minvalFilter(byte[,] sMat)
        {
            int mH = sMat.GetLength(0);
            int mW = sMat.GetLength(1);
            byte[,] Mat = new byte[mH, mW];
            byte temp = 0;
            for (int y = 1; y < mH - 1; y++)
            {
                for (int x = 1; x < mW - 1; x++)
                {
                    temp = sMat[y, x];
                    temp = temp < sMat[y + 1, x] ? temp : sMat[y + 1, x];
                    temp = temp < sMat[y - 1, x] ? temp : sMat[y - 1, x];

                    temp = temp < sMat[y, x - 1] ? temp : sMat[y, x - 1];
                    temp = temp < sMat[y + 1, x - 1] ? temp : sMat[y + 1, x - 1];
                    temp = temp < sMat[y - 1, x - 1] ? temp : sMat[y - 1, x - 1];

                    temp = temp < sMat[y, x + 1] ? temp : sMat[y, x + 1];
                    temp = temp < sMat[y + 1, x + 1] ? temp : sMat[y + 1, x + 1];
                    temp = temp < sMat[y - 1, x + 1] ? temp : sMat[y - 1, x + 1];

                    Mat[y, x] = temp;
                }
            }
            return Mat;
        }

效果:

c#中byte数组0x_C# 中值滤波_第6张图片
“最小值滤波” 文字 盐噪去除

均值滤波C#函数

9ed983f4a2e1549c1002798611398020.png
均值滤波 公式
public static byte[,] sf_meanFilter(byte[,] sMat)
        {
            int mH = sMat.GetLength(0);
            int mW = sMat.GetLength(1);
            byte[,] Mat = new byte[mH, mW];
            int temp = 0;
            for (int y = 1; y < mH - 1; y++)
            {
                for (int x = 1; x < mW - 1; x++)
                {
                    temp = sMat[y - 1, x + 1];
                    temp += sMat[y - 1, x];
                    temp += sMat[y - 1, x - 1];

                    temp += sMat[y, x + 1];
                    temp += sMat[y, x];
                    temp += sMat[y, x - 1];

                    temp += sMat[y + 1, x + 1];
                    temp += sMat[y + 1, x];
                    temp += sMat[y + 1, x - 1];

                    Mat[y, x] = (byte)(temp/9);
                }
            }
            return Mat;
        }

效果:

c#中byte数组0x_C# 中值滤波_第7张图片
“均值滤波” 盐椒噪 均淡化

c#中byte数组0x_C# 中值滤波_第8张图片
“均值滤波” 效果

你可能感兴趣的:(c#中byte数组0x)