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 ToThreshold.cs

class Form1 : Form {
    // スプリットコンテナ
    SplitContainer splitContainer = new SplitContainer {
        Dock = DockStyle.Fill,
        Orientation = Orientation.Horizontal,   // 上下
        Panel1MinSize = 100,
    };
    // ラジオボタン(フィルター)
    RadioButton filterButton = new RadioButton {
        Text = "2値化",
        Appearance = Appearance.Button,
        AutoCheck = false,
        Location = new System.Drawing.Point(10, 10),
        Enabled = false,
    };
    // ラベル1(パラメーター)
    Label param1Label = new Label {
        Text = "閾値:",
        Location = new System.Drawing.Point(160, 10),
        Size = new System.Drawing.Size(40, 20),
    };
    // 値ラベル1(パラメーター)
    Label param1ValueLabel = new Label {
        Text = "80",
        Location = new System.Drawing.Point(200, 10),
        Size = new System.Drawing.Size(40, 20),
    };
    // トラックバー1(パラメーター)
    TrackBar param1Trackbar = new TrackBar {
        Location = new System.Drawing.Point(160, 40),
        AutoSize = true,
        Minimum = 0,
        Maximum = 255,
        Value = 80,
        TickFrequency = 10,
        SmallChange = 1,
        LargeChange = 10,
        Enabled = false,
    };

    // ピクチャボックス
    PictureBox picbox = new PictureBox {
        Dock = DockStyle.Fill,
        AllowDrop = true,
        SizeMode = PictureBoxSizeMode.Zoom,
    };
    // ビットマップ
    Bitmap bmp;
    // Mat
    Mat mat;

    // フィルター(2値化)
    void filter() {
        mat = BitmapConverter.ToMat(bmp);
        Cv2.CvtColor(mat, mat, ColorConversionCodes.BGRA2GRAY);
        Cv2.Threshold(mat, mat, param1Trackbar.Value, 255, ThresholdTypes.Binary);
        picbox.Image = BitmapConverter.ToBitmap(mat);
    }

    // panel2上のコントロールのEnableをセット
    void setEnabled(bool flag) {
        filterButton.Enabled = flag;
        param1Trackbar.Enabled = flag;
    }
    
    // パラメータ1の値が変化
    void param1Trackbar_ValueChanged(Object o, EventArgs e) {

        
        param1ValueLabel.Text = param1Trackbar.Value.ToString();
        
        if (!filterButton.Checked) return;

        // フィルターON
        filter();
    }

    // フィルタースイッチ
    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;

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

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

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

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

実行

元画像

閾値:80

閾値:100

閾値:120

コメント