OpenCV4 (C++) - 形態学 (侵食、拡張)


1. 腐食(侵食)

OpenCV 4 は、画像侵食のための erode() 関数を提供します。

void cv::erode(src, dst, kernel, anchor, iterations, borderType, borderValue)

src:输入图像。
dst:输出图像,与输入图像具有相同的大小和类型。
kernel:腐蚀操作的结构元素。可以自己定义,也可以用getStructuringElement()函数生成。
anchor:结构元素的锚点位置,默认为 (-1, -1),表示位于结构元素的中心。
iterations:指定腐蚀操作的迭代次数,默认为 1。
borderType:图像边框的处理方式,默认为 BORDER_DEFAULT。
borderValue:默认使用边界不变外推法时的边界值。当边框类型为 BORDER_CONSTANT 时,指定边框的固定值,默认为 0。


cv::Mat cv::getStructuringElement(int  shape,
                              Size  ksize,  // 结构元素的尺寸大小
                              Point  anchor = Point(-1,-1)  // 中心点的位置,默认参数为结构元素的几何中心点
                              )
shape:结构元素的种类: 
	MORPH_RECT(简记:0) —— 矩形结构元素,所有元素都为1
	MORPH_CROSS(简记:1)—— 十字结构元素,中间的列和行元素为1
	MORPH_ELLIPSE(简记:2) —— 椭圆结构元素,矩形的椭圆内接元素为1

コードは次のとおりです(例)。

	//cv::Mat image = cv::imread("C:/Users/Opencv/temp/wz.png",cv::IMREAD_GRAYSCALE);
	cv::Mat image = cv::imread("C:/Users/Opencv/temp/black.png", cv::IMREAD_GRAYSCALE);
	cv::Mat erodeImage;

	cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
	cv::erode(image, erodeImage, kernel);

注: 侵食は文字通り輪郭を縮小することを意味しますが、侵食関数は画像内の 0 以外のピクセルのみを対象とします。したがって、画像が背景として 0 ピクセルに基づいている場合、腐食操作の後、画像内のコンテンツが薄くなることがわかります。画像が背景として 255 ピクセルに基づいている場合、浸食操作後は、画像内のコンテンツが薄くなっていることがわかります。

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

2.拡張する

画像拡張と画像収縮は逆の処理であり、OpenCV 4 では画像拡張用の dilate() 関数が用意されており、関数のプロトタイプは erode と同じです。
  また、画像が背景として 0 ピクセルに基づいている場合、拡張操作の後、画像内のコンテンツが厚くなることがわかります。画像の背景が 255 ピクセルである場合、拡張操作後には、画像内のコンテンツがより太くなり、より小さくなっていることがわかります。

  概要: 従来の概念における腐食と膨張は、0 ピクセル (黒) の背景にあります。

3. 形態素操作

エロージョンと膨張はどちらも画像形態演算の一種であり、さまざまな方法で組み合わせることができます。一般的なオープニング操作とクローズ操作など:

(1) 腐食により小さなノイズ領域が除去されますが、主画像領域の面積も減少するため、腐食操作後に拡大操作を実行して、発生したより大きな接続領域の面積減少を補うことができます。腐食による。この動作をオープニング動作といいます。

(2) 拡張により、各領域の面積を拡張し、より小さな穴を埋め、隣接する 2 つの接続されたドメインを接続できますが、ノイズの領域も増加するため、拡張操作のみを実行できます。腐食操作を実行すると、接続されたドメイン境界と領域の拡張によって発生する拡張操作によって発生するノイズを低減できます。この操作をクローズド操作と呼びます。

さらに、形態学的操作には、勾配 (ターゲットの境界を記述する)、トップハット操作 (元の画像とオープニング操作の結果との差。隣接するパッチよりも明るいパッチを分離するために使用されます)、およびブラック ハット操作が含まれます。 (元の画像とオープニング操作の結果の差)。クローズ操作の結果の差は、隣接する点より暗いパッチを分離するためによく使用されます) およびヒットミス変換 (まったく同じ構造を見つける)構造要素として)。


OpenCV 4 は、これらの形態学的操作をカバーする morphologyEx() 関数を提供します。
void cv::morphologyEx(InputArray  src, 
					OutputArray  dst,
					int  op,  // 形态学操作类型的标志
					InputArray  kernel,  // 结构元素,可以自己生成,也可以用getStructuringElement()函数生成
					anchor = Point(-1,-1),  // 中心点在结构元素中的位置,默认参数为结构元素的几何中心点
					int  iterations = 1,
					int  borderType = BORDER_CONSTANT,
					const Scalar &  borderValue = morphologyDefaultBorderValue() 

其中第三个参数形态学操作类型的标志:
标志参数	       简记	  作用
MORPH_ERODE  	0	图像腐蚀
MORPH_DILATE	1	图像膨胀
MORPH_OPEN	    2	开运算
MORPH_CLOSE	    3	闭运算
MORPH_GRADIENT	4	形态学梯度
MORPH_TOPHAT	5	顶帽运算
MORPH_BLACKHAT	6	黑帽运算
MORPH_HITMISS	7	击中击不中运算

4. まとめ

腐食と拡張は、実際には画像に対して 1 つ (複数の) 畳み込み演算を実行していると見なされます。実際の状況に基づいてどの形態学的操作を使用するかを選択する必要がありますが、一般的には、ノイズや無関係な小さな領域を除去し、主要な部分を保持できるため、オープニング操作 (最初に腐食、次に拡張) がより一般的に使用されます。エリア。(でもフィルターをかける感じです)

おすすめ

転載: blog.csdn.net/qq_43199575/article/details/133852776