8. OpenCvSharp画像のグレースケール処理(成分法、最大値法、平均法、加重平均法) - c#OpenCvSharp学習メモ

OpenCvSharp画像グレースケール処理(成分法、最大法、平均法、加重平均法)

ここに画像の説明を挿入

プロジェクト概要

このプロジェクトは、コンポーネント法、最大値法、平均法、加重平均法などのグレースケール処理手法の実現を含む、OpenCvSharp に基づいた画像のグレースケール処理を実現し、開いた画像を処理してローカル ディスクに保存できます。

ソースコードはこの記事の最後にあります

0. 原理と公式

コンポーネントメソッド:

つまり、各コンポーネント チャネルの輝度値を抽出し、対応するグレースケール値に従って表示します。たとえば、カラー画像 (3 チャネル、各チャネルの輝度値範囲: 0 ~ 255)、次のいずれかの輝度値が抽出されて白黒画像が形成されます (最も明るい部分は 255 で白を示し、最も暗い部分は 0 で黒を示します)。
ここに画像の説明を挿入
式中の GRAYk(i, j) (k=1~3) は、B チャンネル、G チャンネル、R チャンネルにそれぞれ対応する、画像 (i, j) 座標のピクセルの輝度値です。opencv は BGR チャネルであり、一般的に使用される RGB チャネルではないことに注意してください。

最大の方法:

各ピクセルのグレー値は、3 つのチャネルの輝度値の最大値から選択されます。
ここに画像の説明を挿入
式中の Max は最大値関数です。

平均法:

各ピクセルのグレー値は、3 つのチャネルの輝度値の平均値です。
ここに画像の説明を挿入

加重平均法:

各ピクセルのグレー値は、人間の目の緑に対する最高感度と青に対する最低感度に基づいて、さまざまなチャネルの重みを確立します。B チャネルの重み値は 0.114、G チャネルの重み値は 0.114 です。 0.578、R チャネルの重み値は 0.299 です。
ここに画像の説明を挿入

1 基本的な手順とインターフェイスの設計

1.1 引用

using OpenCvSharp;using OpenCvSharp.Extensions;

1.2 ピクチャーボックス、ラベル、ボタン、その他のコントロールのレイアウト、名前変更、形状とフォントの調整を行い、次のインターフェイスを形成します。

ここに画像の説明を挿入

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 最大値法、平均法、加重平均法

その他の等成分法: 2 つの 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