opencv-モルフォロジー操作(オープンおよびクローズ操作、モルフォロジーグラデーション、シルクハットおよびブラックハット)

形態学的操作

(1)オープン操作:最初に腐食してから膨張し、小さな物体を取り除くことができます。

(2)閉じる操作:最初に展開してから腐食し、小さなオブジェクトを埋めることができます。

(3)形態勾配:膨張から腐食を差し引いたもの。

(4)シルクハット:シルクハットは、元の画像とオープン操作画像の差分画像です。

(5)ブラックハット:ブラックハットは、クローズドオペレーション画像と元の画像の差分画像です。

これらの形態学的操作は、腐食と膨張に基づいています

  • 腐食:アンカーポイントは最小値に置き換えられます。黒は増加し、白は減少します。
  • 膨張:アンカーポイントが最大値に置き換えられます。白が増加し、黒が減少します。

オープンオペレーション

       開封操作とは、最初に腐食、次に膨張を意味します。
       説明する例として、単一チャネルの白黒画像を取り上げます。つまり、最初に腐食操作によって黒の領域腐食および拡張し、次に拡張操作によって白の領域拡張および拡張します。
       小さな白い斑点がある場合は、最初に腐食操作を行い、周囲の黒で覆われ、次に拡張操作を実行します。小さな白い斑点がなくなったため、拡張操作は周囲の黒に影響を与えません。だから、開く操作で、白い点を取り除くことができます。
       つまり、適切な開く操作で小さなオブジェクト削除できます

       バイナリグラフでは、小さな白い点を削除するか、黒い点を埋めるように表示されます

ここに画像の説明を挿入します
ここに画像の説明を挿入します

クローズ操作

       閉鎖操作とは、最初に膨張し、次に腐食することを意味します。
       例として、単一チャネルの白黒画像を取り上げます。つまり、最初に拡張操作によって白い領域を拡張および拡張し、次に腐食操作によって黒い領域を腐食および拡張します。
       小さな黒い斑点がある場合は、最初に膨張操作、次に腐食操作によって周囲の白に覆われます。小さな黒い斑点がなくなったため、腐食操作は周囲の白に影響を与えないため、閉じる操作小さな黒い点を取り除くことができます。
つまり、適切なクローズ操作で小さなオブジェクト削除できます

       バイナリグラフでは、小さな黒い点を削除するか、白い点を埋めるように表示されます

ここに画像の説明を挿入します
ここに画像の説明を挿入します

形態学的勾配

形態学的勾配は、膨張から腐食を差し引いたものです。
説明する例として、2次元配列を取り上げましょう。左下の画像は

膨張後の操作の結果は次のとおりです
ここに画像の説明を挿入します
が、腐食操作は次のとおりです。
ここに画像の説明を挿入します
形態学的勾配は、次のように膨張から腐食を引いたものです。
ここに画像の説明を挿入します

トップハット

       シルクハットは、元の画像とオープン操作の画像の違いの画像です。
       開いた操作で小さな白いオブジェクトを削除しましたが、他の場所で変化はありません。
       差が生じた後、0、つまり黒になります。差が生じた後、除去された白い領域が得られます。次に、元の画像が白で、対応する値が255であり、開封操作後の対応する値が0であり、差が255のままであるため、この領域の色は何色であるかを考慮する必要があります。まだ白、つまり元の色です。
       したがって、シルクハット操作では、削除される小さな白いオブジェクトだけが表示されます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

黒い帽子

       黒い帽子は、元の画像と閉じた操作の画像の違いの画像です。
       クロージング操作では、小さな黒いオブジェクトを塗りつぶしましたが、他の場所では変化はありません。違いが生じた後、255、つまり黒になり
       ます。他の場所で違い生じた後、次のようになります。黒く塗りつぶされた領域を検討する必要があります。この領域の色は何色ですか。元の画像は黒なので、対応する値は0です。閉じる操作後は白になります。対応する値は255です。差は255、白になります。つまり、シルクハットの操作で得られるのは、削除された小さな白いオブジェクトです。

ここに画像の説明を挿入します

シルクハットブラックハット結論

  • シルクハットでもブラックハットでも、元の画像と開閉操作の違いの画像が得られます。違いは白で、残りは黒です。

opencvでの形態学的操作

原子力発電API

モルフォロジーでは、地域のピクセル操作が含まれるため、カーネル内のピクセルを操作するカーネルを設計する必要があります。したがって、コアを作成する必要があります。ここでは、新しいAPIを使用します:
getStructuringElement()

Mat getStructuringElement(
    int shape, 
    Size ksize, 
    Point anchor = Point(-1,-1)
    );
  • (1)Int型の形状、要素の形状は、cv :: MorphShapesのいずれかになります。

  • (2)Sizeタイプのksize、構造化要素のサイズ。

  • (3)ポイントタイプのアンカー(デフォルト値(-1、-1))は、アンカーが中央に配置されていることを意味します。十字型要素の形状のみがアンカー位置に依存することに注意してください。その他の場合、アンカーは形態学的操作から生じる動きの量を調整するだけです。

ここでは主に最初のパラメーターについて説明します。パラメーターには主に次のオプションがあります。

-(1)MORPH_RECT:長方形の構造領域。

-(2)MORPH_CROSS、十字型の構造領域。

-(3)MORPH_ELLIPSE、楕円構造領域、長方形Rect(0、0、esize.width、0。esize.height)に内接する塗りつぶされた楕円。

形態学的操作

API

void morphologyEx(
    InputArray src,
    OutputArray dst, 
    int op,
    InputArray kernel,
    Point anchor = Point(-1,-1),
    int iterations = 1,
    int borderType = BORDER_CONSTANT,
    const Scalar& borderValue = morphologyDefaultBorderValue()
);
  • (1)InputArrayタイプのsrc、入力画像。チャネル数は任意ですが、深さはCV_8U、CV_16U、CV_16S、CV_32F、またはCV_64Fのいずれかである必要があります。

  • (2)OutputArrayタイプのdst、つまりターゲットイメージは、入力イメージと同じサイズとタイプを持ちます。

  • (3)Intタイプop、モルフォロジー演算のタイプ。cv:: MorphTypesを参照してください。

  • (4)InputArrayタイプのカーネルは、構造要素を展開するために使用されます。elemenat= Mat()の場合、3 x3の長方形の構造要素を使用します。getStructuringElementを使用してカーネルを作成できます。

  • (5)ポイントタイプアンカー:要素内のアンカー位置。デフォルト値(-1、-1)は、要素の中心にあるアンカーを意味します。

  • (6)int型の反復:展開が適用される回数。

  • (7)int型のBorderType:ピクセル外挿法。cv:: BorderTypesを参照してください。

  • (8)スカラータイプのBorderValue:境界が一定の場合の境界値。

膨張や腐食と比較して、3番目のパラメーターのみが追加されます。他のパラメーターは完全に同じです。3番目のパラメーターは操作、つまりすべての形態学的操作です。がある:

enum MorphTypes{
    
    
    MORPH_ERODE    = 0,  //腐蚀
    MORPH_DILATE   = 1,  //膨胀
    MORPH_OPEN     = 2,  //开操作
    MORPH_CLOSE    = 3,  //闭操作
    MORPH_GRADIENT = 4,  //梯度操作
    MORPH_TOPHAT   = 5,  //顶帽操作
    MORPH_BLACKHAT = 6,  //黑帽操作
};

最初の2つは、前に説明した膨張と腐食であり、残りは、今日説明した5つの形態学的操作です。

APIの場合、一般的に言えば、最初の4つのパラメーターを設定するだけでよく、後者のパラメーターはデフォルトで設定できます。

コード

#include<opencv2\opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

int main()
{
    
    
	Mat src, dst;
	src = imread("ur path of pic");
	if (!src.data)
	{
    
    
		cout << "could not load image !";
		return -1;
	}

	imshow("src", src);

	Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
	//开操作
	morphologyEx(src, dst, CV_MOP_OPEN, kernel);
	imshow("open-src", dst);
	//闭操作
	morphologyEx(src, dst, CV_MOP_CLOSE, kernel);
	imshow("close-src", dst);
	//形态学梯度
	morphologyEx(src, dst, CV_MOP_GRADIENT, kernel);
	imshow("gradient-src", dst);
	//顶帽
	morphologyEx(src, dst, CV_MOP_TOPHAT, kernel);
	imshow("tophat-src", dst);
	//黑帽
	morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);
	imshow("blackhat-src", dst);

	waitKey(0);
	return 0;
}

効果

元の画像
ここに画像の説明を挿入します
開く操作
ここに画像の説明を挿入します
閉じる操作
ここに画像の説明を挿入します
形態勾配
ここに画像の説明を挿入します
トップハット
ここに画像の説明を挿入します
ブラックハット
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_28258885/article/details/112705626