画像の膨張・収縮処理を行う(モルフォロジー演算)

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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする