OpenCVを使用し画像処理を試しています。
二値化や白黒反転、膨張収縮などはできております。
一番最後のプロシージャにあるように、二値化画像の白い部分の面積をラベルに表示するということを行いたいです。
詳細
適当な画像を二値化するとに大小さまざまな白い輪郭が生まれるため、それらの輪郭を認識し1つずつの面積を測定。一番大きいものの面積を
ラベルに表示。
現在ラベルに1つずつの面積を表示することはできていますが、一番大きいものだけを表示することができていないため
どのように変更すれば希望の機能が満たせるでしょうか。ご教示ください。
該当のソースコード
//以下、OpenCvsharpの使用とMatの変換用として追加 using OpenCvSharp; using OpenCvSharp.Extensions; namespace OSS比較_OpenCV { public partial class Form1 : Form { Mat image; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; } private void BtnLoad_Click(object sender, EventArgs e) { var ofd = new OpenFileDialog(); //ファイルフィルタ ofd.Filter = "Image File(*.bmp,*.jpg,*.png,*.tif)|*.bmp;*.jpg;*.png;*.tif|Bitmap(*.bmp)|*.bmp|Jpeg(*.jpg)|*.jpg|PNG(*.png)|*.png"; //ダイアログの表示 if (ofd.ShowDialog() == DialogResult.OK) { string path = ofd.FileName; image = Cv2.ImRead(path); pictureBox1.Image = BitmapConverter.ToBitmap(image); } } private void BtnBin_Click(object sender, EventArgs e) { //グレー化 var grayImage =image.CvtColor(ColorConversionCodes.BGR2GRAY); //二値化 var thresholdImege = grayImage.Threshold(128, 255, ThresholdTypes.Binary); pictureBox1.Image = BitmapConverter.ToBitmap(thresholdImege); } private void BtnBin_Auto_Click(object sender, EventArgs e) { //グレー化 var grayImage = image.CvtColor(ColorConversionCodes.BGR2GRAY); //二値化(Otsu) var thresholdImege = grayImage.Threshold(0, 255, ThresholdTypes.Otsu); pictureBox1.Image = BitmapConverter.ToBitmap(thresholdImege); } private void BtnNega_Click(object sender, EventArgs e) { //グレー化 var grayImage = image.CvtColor(ColorConversionCodes.BGR2GRAY); //二値化 var thresholdImege = grayImage.Threshold(128, 255, ThresholdTypes.Binary); //Nega thresholdImege = 255 - thresholdImege; pictureBox1.Image = BitmapConverter.ToBitmap(thresholdImege); } private void BtnFilter_Click(object sender, EventArgs e) { //グレー化 var grayImage = image.CvtColor(ColorConversionCodes.BGR2GRAY); //二値化 var thresholdImege = grayImage.Threshold(128, 255, ThresholdTypes.Binary); //膨張収縮 var kernel = new Mat(new OpenCvSharp.Size(3, 3), MatType.CV_8UC1); var erodeMat = new Mat(); var dilateMat = new Mat(); //収縮処理 Cv2.Erode(thresholdImege, erodeMat, kernel); //膨張処理 Cv2.Dilate(erodeMat, dilateMat, kernel); pictureBox1.Image = BitmapConverter.ToBitmap(dilateMat); } private void BtnAreaBlob_Click(object sender, EventArgs e) { //グレー化 var grayImage = image.CvtColor(ColorConversionCodes.BGR2GRAY); //二値化 var thresholdImege = grayImage.Threshold(128, 255, ThresholdTypes.Binary); pictureBox1.Image = BitmapConverter.ToBitmap(thresholdImege); //ジャグ配列 OpenCvSharp.Point[][] contours; OpenCvSharp.HierarchyIndex[] hierarchyIndexes; //輪郭抽出 thresholdImege.FindContours(out contours, out hierarchyIndexes, RetrievalModes.External, ContourApproximationModes.ApproxSimple); string areas = null; var count = 1; foreach (var contour in contours) { //面積を算出 var area = Cv2.ContourArea(contour); if (count < contours.Count()) { areas = areas + area + " "; } else { areas = areas + area; } count++; } label5.Text = areas; } } }
補足情報(FW/ツールのバージョンなど)
バージョン
Microsoft Visual Studio Community 2022 Version 17.2.2
Windows フォームアプリをC# Framework 4.7.2で作成しています。
回答1件
あなたの回答
tips
プレビュー