图像处理的三个基本操作——灰度化、锐化、平滑

什么是图像处理?

我的理解是,图像处理即就是对图像的各个像素点进行处理。

一、灰度化

灰度化,也就是黑白化,就是将图像进行黑白处理,使其失去色彩。而从像素点出发,就是使各个像素点的三种颜色分量R、G、B的值相同。

常用的黑白化的方法有三种:

  • 第一种是最大值法(Maximum):

                   R=G=B=Max(R,G,B),这种方法处理后灰度图象的亮度会偏高,不建议采用。

  • 第二种就是平均值法(Average):

                   R=G=B=(R+G+B)/3,这种方法处理后灰度图象的亮度较柔和,本人就是采用的这种方法。

  • 第三种是加权平均值法(Weighted Average):

                   R=G=B=wr*R+wg*G+wb*B,wr、wg、wb分别为R、G、B的权值。

鉴于本人只使用了第二种,所以就先贴上第二种的代码:

        public Bitmap bmp1;
        public Bitmap bmp2;
        //黑白化
        //平均值法: 使用每个像素点的 R,G,B值等于原像素点的RGB值的平均值
        //效率略低,暂未查明具体原因,需3秒等待
        public Image BlackANDWhite(PictureBox pic)
        {
            bmp1 = new Bitmap(pic.Image);
            int width = bmp1.Width;
            int height = bmp1.Height;
            bmp2 = new Bitmap(width, height);

            Color c;
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    c = bmp1.GetPixel(x, y);//获取像素
                    int value = (c.R + c.G + c.B) / 3;
                    bmp2.SetPixel(x, y, Color.FromArgb(value, value, value));//设置像素
                }
            }
            return bmp2;
        }

以下是代码的相关结果展示:

图像处理的三个基本操作——灰度化、锐化、平滑_第1张图片            图像处理的三个基本操作——灰度化、锐化、平滑_第2张图片

(未处理的图片来自百度)

二、锐化

锐化就是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波。锐化处理在增强图象边缘的同时增加了图象的噪声。

常用的锐化模板是拉普拉斯(Laplacian)模板,而本人也是采用的拉普拉斯模板进行的锐化处理。

                                                     图像处理的三个基本操作——灰度化、锐化、平滑_第3张图片

下面是拉普拉斯模板的锐化处理的相关代码:

        //锐化
        //突出显示颜色值大(即形成形体边缘)的像素点
        public Image Sharpen(PictureBox pic)
        {
            bmp1 = new Bitmap(pic.Image);
            int width = bmp1.Width;
            int height = bmp1.Height;
            bmp2 = new Bitmap(width, height);

            Color c;
            int[] Laplacian = { -1, -1, -1, -1, 9, -1, -1, -1, -1 };//拉普拉斯锐化模板
            for (int x = 1; x < width - 1; x++)
            {
                for (int y = 1; y < height - 1; y++)
                {
                    int r = 0, g = 0, b = 0;
                    int Index = 0;
                    //两个for循环刚好将拉普拉斯锐化模板数组完全遍历
                    for (int col = -1; col <= 1; col++)
                        for (int row = -1; row <= 1; row++)
                        {
                            //获取bmp1的各个点的像素值     
                            c = bmp1.GetPixel(x + row, y + col);
                            r += c.R * Laplacian[Index];
                            g += c.G * Laplacian[Index];
                            b += c.B * Laplacian[Index];
                            Index++;
                        }
                    //要注意的是,运算后如果出现了大于255或者小于0的点,称为溢出,
                    //溢出点的处理通常是截断,即大于255时,令其等于255;小于0时,取其绝对值。
                    
                    //处理颜色值溢出
                    r = r > 255 ? 255 : r;
                    r = r < 0 ? 0 : r;
                    g = g > 255 ? 255 : g;
                    g = g < 0 ? 0 : g;
                    b = b > 255 ? 255 : b;
                    b = b < 0 ? 0 : b;
                    //将bmp2的各个像素点进行赋值
                    bmp2.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));
                }
            }
            return bmp2;
        }

 

三、平滑

平滑与锐化相反,就是滤掉高频分量,从而达到减少图象噪声,使图片变得有些模糊。

常用的平滑处理方法有三种:

  • Box模板去噪平滑处理,也就是均一化处理。

                     Box模板是{1,1,1,1,1,1,1,1,1}

  • 高斯模板去噪平滑处理,就是在Box模板的基础上加入了加权系数,考虑了距离某点位置越近影响越大的因素。相比Box模板,较为清晰一些。

                     高斯模板是{1,2,1,2,4,2,1,2,1}

  • 中值滤波去噪平滑处理,就是将该点左右邻近的两个点的rgb值与该点自身进行比较,选择其中最中间的值赋给该点。

下面是平滑处理的相关代码:

        //Box模板去噪平滑处理
        public void Box_Smooth(PictureBox pic)
        {
            bmp1 = new Bitmap(pic.Image);
            int width = bmp1.Width;
            int height = bmp1.Height;
            bmp2 = new Bitmap(width, height);

            Color c;
            int[] Box = { 1, 1, 1, 1, 1, 1, 1, 1, 1 };//Box模板

            for (int x = 1; x < width - 1; x++)
            {
                for (int y = 1; y < height - 1; y++)
                {
                    int r = 0, g = 0, b = 0;
                    int Index = 0;

                    for (int col = -1; col <= 1; col++)
                        for (int row = -1; row <= 1; row++)
                        {
                            c = bmp1.GetPixel(x + row, y + col);
                            r += c.R * Box[Index];
                            g += c.G * Box[Index];
                            b += c.B * Box[Index];
                            Index++;
                        }
                    r = r / 9;
                    g = g / 9;
                    b = b / 9;

                    //处理颜色值溢出
                    r = r > 255 ? 255 : r;
                    r = r < 0 ? 0 : r;
                    g = g > 255 ? 255 : g;
                    g = g < 0 ? 0 : g;
                    b = b > 255 ? 255 : b;
                    b = b < 0 ? 0 : b;

                    bmp2.SetPixel(x, y, Color.FromArgb(r, g, b));
                }
            }
        }

        //高斯模板去噪平滑处理  
        public void Gauss_Smooth(PictureBox pic)
        {
            bmp1 = new Bitmap(pic.Image);
            int width = bmp1.Width;
            int height = bmp1.Height;
            bmp2 = new Bitmap(width, height);

            Color c;
            int[] Guass = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };//Gauss模板

            for (int x = 1; x < width - 1; x++)
            {
                for (int y = 1; y < height - 1; y++)
                {
                    int r = 0, g = 0, b = 0;
                    int Index = 0;

                    for (int col = -1; col <= 1; col++)
                        for (int row = -1; row <= 1; row++)
                        {
                            c = bmp1.GetPixel(x + row, y + col);
                            r += c.R * Guass[Index];
                            g += c.G * Guass[Index];
                            b += c.B * Guass[Index];
                            Index++;
                        }
                    r = r / 16;
                    g = g / 16;
                    b = b / 16;

                    //处理颜色值溢出
                    r = r > 255 ? 255 : r;
                    r = r < 0 ? 0 : r;
                    g = g > 255 ? 255 : g;
                    g = g < 0 ? 0 : g;
                    b = b > 255 ? 255 : b;
                    b = b < 0 ? 0 : b;

                    bmp2.SetPixel(x, y, Color.FromArgb(r, g, b));
                }
             } 
        }

        //中值滤波去噪平滑处理
        public void MiddleValue_Smooth(PictureBox pic)
        {
            bmp1 = new Bitmap(pic.Image);
            int width = bmp1.Width;
            int height = bmp1.Height;
            bmp2 = new Bitmap(width, height);

            //分别建立r,g,b数组
            int[] r = new int[3];
            int[] g = new int[3];
            int[] b = new int[3];

            for (int x = 1; x < width - 1; x++)
            {
                for (int y = 1; y < height - 1; y++)
                {
                    int Index = 0;
                    for (int row = -1; row <= 1; row++)
                    {
                        Color c = bmp1.GetPixel(x + row, y);//获取像素值
                        //分别给r,g,b数组赋值
                        r[Index]= c.R ;
                        g[Index]= c.G ;
                        b[Index]= c.B ;
                        Index++;
                    }

                    //排序
                    Array.Sort(r);
                    Array.Sort(g);
                    Array.Sort(b);

                    //处理颜色值溢出
                    r[1] = r[1] > 255 ? 255 : r[1];
                    r[1] = r[1] < 0 ? 0 : r[1];
                    g[1] = g[1] > 255 ? 255 : g[1];
                    g[1] = g[1] < 0 ? 0 : g[1];
                    b[1] = b[1] > 255 ? 255 : b[1];
                    b[1] = b[1] < 0 ? 0 : b[1];

                    bmp2.SetPixel(x - 1, y - 1, Color.FromArgb(r[1], g[1], b[1]));

                }
            }

        }


下面是是那种平滑处理所得的效果图与原图的对比展示:

原图:

图像处理的三个基本操作——灰度化、锐化、平滑_第4张图片

Box模板:     

图像处理的三个基本操作——灰度化、锐化、平滑_第5张图片                                                              

Guass模板:  

图像处理的三个基本操作——灰度化、锐化、平滑_第6张图片                                                          

中值滤波:

图像处理的三个基本操作——灰度化、锐化、平滑_第7张图片

PS:源码在我的资源下载里,点击这里可以下载

你可能感兴趣的:(图像处理)