前回実験した 膨張と収縮はそれぞれ単独で利用することは少なく それぞれを組み合わせることで様々な画像処理を行います。この画像処理を『モルフォロジー演算』と呼び、2値化した画像 または グレースケール画像から 画像の特徴抽出・ノイズ除去・平滑化などに用いられます。OpenCvSharpではMorphologyExメソッドにより以下の5つの処理が可能です。
- オープニング処理 収縮した結果に対して同じ回数だけ膨張する処理
- クロージング処理 膨張した結果に対して同じ回数だけ収縮する処理
- グラジエント処理 膨張した結果から収縮した結果を差し引く処理
(エッジ検出) - トップハット処理 元画像からオープニングした画像を差し引く処理
- ブラックハット処理 クロージングした画像から元画像を差し引く処理
Android版では さらに 膨張処理・収縮処理も可能でしたが OpenCvSharpでは MorphologyExメソッドで対応可能な処理は上記5種類になります。
メソッドの呼び出しは、以下の形式になります。
MorphologyEx(CvArr src, CvArr dst, CvArr tmp,
IplConvKernal element, MorphologyOperation op, int iterations)
CvArr src : 変換元画像
CvArr dst : 変換先画像 変換元画像と同じサイズ・形式を確保してください
(変換元画像領域を指定しても問題ありません)
CvArr tmp : 作業用領域 変換元画像と同じサイズ・形式を確保してください
IplConvKernal element : 変換処理に用いる構造要素
膨張・収縮処理ではNullを指定するとDefaultの3*3の矩形で
処理できましたが、MorphologyExメソッドでは エラーになります。
明示的に指定してください。
MorphologyOperation op : 処理方式
MorphologyOperation列挙型定数から選択してください
Open Close Gradient Tohat Blackhat
int iterations : 処理回数 省略してもコンパイルエラーにはなりませんが
実行時 無限Loopエラーになります。明示的に指定してください。
実験は 前回と同じカメラで撮影した画像を グレースケール化し 透視変換した データを使います。
フォームに Open・Close・Gradient・Tohat・Blackhatの5つのボタンを配置し それぞれ対応する処理を一回実行するようにしました。
コーディング |
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 tmp; private IplImage dst; private Boolean flg = false; private IplConvKernel element = Cv.CreateStructuringElementEx(3, 3, 1, 1, ElementShape.Rect, null); public Form1() { InitializeComponent(); } //初期処理(画像データ読み込み・表示) private void timer1_Tick(object sender, EventArgs e) { timer1.Enabled = false; src = new IplImage(@”C:\OpenCvTest\Data\a320_240.jpg”, LoadMode.GrayScale); //—–透視変換処理 (中略) —-// flg = true; tmp = src.Clone(); dst = src.Clone(); pictureBox1.Invalidate(); } private void btnOpen_Click(object sender, EventArgs e) { Cv.MorphologyEx(src, dst, tmp, element, MorphologyOperation.Open, 1); pictureBox1.Invalidate(); } private void btnClose_Click(object sender, EventArgs e) { Cv.MorphologyEx(src, dst, tmp, element, MorphologyOperation.Close, 1); pictureBox1.Invalidate(); } private void btnGradient_Click(object sender, EventArgs e) { Cv.MorphologyEx(src, dst, tmp, element, MorphologyOperation.Gradient, 1); pictureBox1.Invalidate(); } private void btnTopHat_Click(object sender, EventArgs e) { Cv.MorphologyEx((src, dst, tmp, element, MorphologyOperation.TopHat, 1); pictureBox1.Invalidate(); } private void btnBlackHat_Click(object sender, EventArgs e) { Cv.MorphologyEx(src, dst, tmp, element, MorphologyOperation.BlackHat, 1); pictureBox1.Invalidate(); } //描画処理 private void pictureBox1_Paint(object sender, PaintEventArgs e) { if (flg) { Bitmap bmp = new Bitmap(dst.Width, dst.Height); bmp = dst.ToBitmap(); e.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height); bmp.Dispose(); } } } }
処理結果 |
1) 元の画像 | 2) オープニング処理した画像 |
3) クロージング処理した画像 | 4) グラジエント処理した画像 |
5) トップハット処理した画像 | 6) ブラックハット処理した画像 |
Windows7 Vs2008 OpenCv2.4 And OpenCvSharp |