画像の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 |
![](http://blogimg.goo.ne.jp/user_image/18/57/352646cc5b6cd1dbc3293d64a04a3af9.png) |
![](http://blogimg.goo.ne.jp/user_image/26/ca/d758ebc1a55a29166c03cbcf51b7c5f1.jpg) |
BINARY_INV |
TRUNC |
![](http://blogimg.goo.ne.jp/user_image/59/37/0569feedb8e7dab1086bc8c5af9c4d4e.jpg) |
![](http://blogimg.goo.ne.jp/user_image/0d/ee/642c8627ddafdb7a28688f9b5805ee81.png) |
TOZERO |
TOZERO_INV |
![](http://blogimg.goo.ne.jp/user_image/64/9f/8befc2e3c6e721055cbcf6b9fadc291d.png) |
![](http://blogimg.goo.ne.jp/user_image/09/c3/fc70134e7e1cbab2cfcb66aa5d730919.png) |
ADAPTIVE_MEAN_C |
ADAPTIVE_GAUSSIAN_C |
![](http://blogimg.goo.ne.jp/user_image/4d/a6/bc7512e970a6a538c7734ba4a1c6e00f.png) |
![](http://blogimg.goo.ne.jp/user_image/18/ad/f1a946512a261ded802fa508dddb5ac4.png) |
Windows7 Vs2008 OpenCv2.4 And OpenCvSharp |