OpenCvSharpで2値化してみる。(大津の二値化)

コンピュータ

OpenCvSharpで大津の二値化で2値化してみました。

スポンサーリンク

ソース

// 
// 大津の二値化
// 
using System;
using System.Windows.Forms;
using System.Drawing;

using OpenCvSharp;
using OpenCvSharp.Extensions;

// コンパイル
// csc /t:winexe /r:OpenCvSharp.dll /r:OpenCvSharp.Extensions.dll ToThresholdOtsu.cs

class Form1 : Form {
    // スプリットコンテナ
    SplitContainer splitContainer = new SplitContainer {
        Dock = DockStyle.Fill,
        Orientation = Orientation.Horizontal,   // 上下
        Panel1MinSize = 100,
    };
    // ラジオボタン(フィルター)
    RadioButton filterButton = new RadioButton {
        Text = "大津の二値化",
        Appearance = Appearance.Button,
        AutoCheck = false,
        Location = new System.Drawing.Point(10, 10),
        Enabled = false,
    };
    // ピクチャボックス
    PictureBox picbox = new PictureBox {
        Dock = DockStyle.Fill,
        AllowDrop = true,
        SizeMode = PictureBoxSizeMode.Zoom,
    };
    // ビットマップ
    Bitmap bmp;
    // Mat
    Mat mat;

    // フィルター(グレースケール)
    void filter() {
        mat = BitmapConverter.ToMat(bmp);
        Cv2.CvtColor(mat, mat, ColorConversionCodes.BGRA2GRAY);
        Cv2.Threshold(mat, mat, 0, 255, ThresholdTypes.Otsu);
        picbox.Image = BitmapConverter.ToBitmap(mat);
    }

    // panel2上のコントロールのEnableをセット
    void setEnabled(bool flag) {
        filterButton.Enabled = flag;
    }

    // フィルタースイッチ
    void filterSwitch() {
        setEnabled(false);
        filterButton.Checked = !filterButton.Checked;

        if (!filterButton.Checked) {
            // フィルターOFF
            picbox.Image = (Bitmap)bmp.Clone();
            filterButton.Enabled = true;
            return;
        }
        
        // フィルターON
        filter();

        setEnabled(true);
    }

    // コンストラクタ
    Form1() {
        // イベント
        picbox.DragEnter += (o, e) => {
            if(!e.Data.GetDataPresent(DataFormats.FileDrop)) return;
            e.Effect = DragDropEffects.Copy;
        };
        picbox.DragDrop += (sender, e) => {
            // ファイルドロップ
            if(!e.Data.GetDataPresent(DataFormats.FileDrop)) return;
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            if (files.Length < 1) return;

            // 読み込み
            bmp = new Bitmap(files[0]);
            mat = null;
            picbox.Image = (Bitmap)bmp.Clone();
            filterButton.Checked = false;
            setEnabled(true);
        };

        filterButton.Click += (o, e) => filterSwitch();

        // コントロールの登録
        splitContainer.Panel1.Controls.Add(picbox);
        splitContainer.Panel2.Controls.Add(filterButton);
        Controls.Add(splitContainer);

        Size = new System.Drawing.Size(800,600);
    }
    // エントリーポイント
    [STAThread]
    static void Main() {
        Application.Run(new Form1());
    }
}

結果

元画像

大津の二値化

閾値を自動的に設定されています。

コメント