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);//加权平均法
}