画像を2値化する

画像の2値化とはある閾値をもとに 黒と白だけの2階調にすることです。画像の2値化処理も CvCppクラスではなく CvクラスのThresholdメソッドで行います。詳しくは ここを参照してください。

さてここまで進めて来て感じたことですが 当初あまりOpenCvSharpについて基礎知識がない段階で CvクラスのCvMatやIplImage で画像を扱うよりは OpenCv for Androidで少しは扱いなれた CvCppクラスのMatで画像を扱うほうが スンナリ入れるかなと思いCvCpp中心に実験を進めようとしました。しかし、進めて来ると画像処理で扱う多くのメソッドがCvクラス側に実装されていて CvCppクラス側には未実装のため画像処理の都度 MatとIplImageまたはCvMatへの変換が必要になりました。そこで今回から方針を変更し Cvクラス中心に実験を行うことにします。

画像の2値化は コンボボックスに 以下の文字列を格納し 各手法を選択する方法で実験しました。
“元画像”
“THRESH_BINARY”
“THRESH_BINARY_INV”
“THRESH_TRUNC”
“THRESH_TOZERO”
“THRESH_TOZERO_INV”,
“ADAPTIVE_THRESH_MEAN_C”
“ADAPTIVE_THRESH_GAUSSIAN_C”

 コーディング 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using OpenCvSharp;
namespace OpenCvShp
{
    public partial class Form1 : Form
    {
        private IplImage src;
        private IplImage dst;
        private Boolean flag = false;
        public Form1()
        {
            InitializeComponent();
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            src = new IplImage(@"C:OpenCvTestDatayuri.jpg", LoadMode.GrayScale);
            timer1.Enabled = false;
            cmbMethod.SelectedIndex = 0;
        }
        private void cmbMethod_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (cmbMethod.SelectedIndex)
            {
                case 0: // 元画像
                    dst = src.Clone();
                    break;
                case 1: // THRESH_BINARY
                    Cv.Threshold(src, dst, 0, 255, ThresholdType.Binary | ThresholdType.Otsu);
                    break;
                case 2: // THRESH_BINARY_INV
                    Cv.Threshold(src, dst, 0, 255, ThresholdType.BinaryInv | ThresholdType.Otsu);
                    break;
                case 3: // THRESH_TRUNC
                    Cv.Threshold(src, dst, 0, 255, ThresholdType.Truncate | ThresholdType.Otsu);
                    break;
                case 4: // THRESH_TOZERO
                    Cv.Threshold(src, dst, 0, 255, ThresholdType.ToZero | ThresholdType.Otsu);
                    break;
                case 5: // THRESH_TOZERO_INV
                    Cv.Threshold(src, dst, 0, 255, ThresholdType.ToZeroInv | ThresholdType.Otsu);
                    break;
                case 6: // ADAPTIVE_THRESH_MEAN_C
                    Cv.AdaptiveThreshold(src, dst, 255, AdaptiveThresholdType.MeanC, ThresholdType.Binary,7);
                    break;
                case 7: // ADAPTIVE_THRESH_GAUSSIAN_C
                    Cv.AdaptiveThreshold(src, dst, 255, AdaptiveThresholdType.GaussianC,ThresholdType.Binary,7,8);
                    break;
                default:
                    return;
            }
            flag = true;
            pictureBox1.Invalidate();
        }
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (flag)
            {
                Bitmap bmp = new Bitmap(dst.Width, dst.Height);
                bmp = dst.ToBitmap();
                e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);
                bmp.Dispose();
            }
        }
    }
}
 処理結果 
元の画像 BINARY
 
BINARY_INV TRUNC
 
TOZERO TOZERO_INV
 
ADAPTIVE_MEAN_C ADAPTIVE_GAUSSIAN_C
 

 Windows7 Vs2008 OpenCv2.4 And OpenCvSharp
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする