8.OpenCvSharp图像灰度处理(分量法、最大值法、平均法、加权平均法)——c#OpenCvSharp学习笔记

OpenCvSharp图像灰度处理(分量法、最大值法、平均法、加权平均法)

在这里插入图片描述

项目概述

项目实现了基于OpenCvSharp实现了图像灰度处理,包含了分量法、最大值法、平均法、加权平均法等灰度处理方法的实现,可将打开后的图片处理后并保存到本地磁盘。

源代码在本文底部

0.原理与公式

分量法:

即将各个分量通道的亮度值提取出来,并按照对应的灰度度值显示出来;例如一个彩色图像(有3个通道,每个通道的亮度值范围:0-255),将其中一个通道的亮度值提取出来,形成一幅黑白图像(最亮处为255,显示白色;最暗处为0,显示黑色)。
在这里插入图片描述
式中GRAYk(i,j)(k=1~3)为图像(i,j)坐标处像素的亮度值,分别对应着B通道、G通道、R通道。注意opencv是BGR通道,不是常用的RGB通道。

最大值法:

每个像素的灰度值选取3个通道的亮度值中的最大值。
在这里插入图片描述
式中Max为取最大值函数。

平均法:

每个像素的灰度值选取3个通道的亮度值中的平均值。
在这里插入图片描述

加权平均法:

每个像素的灰度值依据人眼对绿色的敏感最高,对蓝色敏感最低,来确立不同通道的权重,B通道权重值为0.114,G通道权重值为0.578,R通道权重值为0.299。
在这里插入图片描述

1基础步骤和界面设计

1.1引用

using OpenCvSharp;using OpenCvSharp.Extensions;

1.2将Picturebox、Label、Button等控件进行布局、改名、调整形状和字体,形成如下界面:

在这里插入图片描述

2功能实现

2.1初始化变量

        Mat Img1 = new Mat();//用 Mat类定义图片1
        Mat Img2 = new Mat();//用 Mat类定义图片2
        Mat  ImgCvt = new Mat();
        Bitmap bitmap;//Bitmap类定义picturebox2要显示的图片
        string pathname;//定义图片打开路径
        

2.2分量法

遍历srcImg的每个像素某一通道的亮度值,赋值给dstImg ,其中【】里的0、1、2分别对应着B、G、R通道。
在这里插入图片描述

 private void button2_Click_1(object sender, EventArgs e)
        {
    
    
            if (pictureBox1.Image == null)//判断图片是否已打开
            {
    
    
                MessageBox.Show("没有打开图片");
                return;
            }
            //   
            // Mat srcImg = Cv2.ImRead(pathname);//读取路径下的图片

            Mat srcImg = Cv2.ImRead(pathname);//读取路径下的图片
            Mat dstImg = new Mat(srcImg.Size(), MatType.CV_8U);
            //Cv2.Threshold(image, image, 45570, 65535, ThresholdTypes.Binary);
            int height = srcImg.Rows;
            int width = srcImg.Cols;
            for (int row = 0; row < height; row++)
            {
    
    
                for (int col = 0; col < width; col++)
                {
    
    
                    dstImg.At<byte>(row, col) = (byte)srcImg.At<Vec3b>(row, col)[2];


                }
            }
            bitmap = BitmapConverter.ToBitmap(dstImg); //把Mat格式的图片转换成Bitmap
            pictureBox2.Image = bitmap;


        }

2.3最大值法、平均法、加权平均法

其它同分量法:将两个for循环中的公式替换即可

 dstImg.At<byte>(row, col) = (byte)Math.Max(srcImg.At<Vec3b>(row, col)[0] , Math.Max(srcImg.At<Vec3b>(row, col)[1], srcImg.At<Vec3b>(row, col)[2]));//最大值法

 dstImg.At<byte>(row, col) = (byte)((srcImg.At<Vec3b>(row, col)[0]+ srcImg.At<Vec3b>(row, col)[1]+ srcImg.At<Vec3b>(row, col)[2])/3);//平均值法

dstImg.At<byte>(row, col) = (byte)(srcImg.At<Vec3b>(row, col)[0]*0.144 + srcImg.At<Vec3b>(row, col)[1]*0.578 + srcImg.At<Vec3b>(row, col)[2]*0.299);//加权平均法
                }

源代码:https://download.csdn.net/download/sunsoldeir1/87156764

猜你喜欢

转载自blog.csdn.net/sunsoldeir1/article/details/128043049
今日推荐