前回実験した 膨張と収縮はそれぞれ単独で利用することは少なく それぞれを組み合わせることで様々な画像処理を行います。この画像処理を『モルフォロジー演算』と呼び、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 |





