OpenCV学習:基本的な画像操作(6):形態学的操作

基本コンセプト

腐食

腐食は Aの内側の境界に沿って円を描くように歩くBの中心(アンカーポイント)として理解できます腐食にも一部を強調表示し領域以外の部分A <ハイライト画素Aの外側に置換されています、。

うねり

拡張は Aの外側の境界に沿って円を描くように歩くBの中心(アンカーポイント)として理解できます拡張のためのハイライト部であり領域以外の部分A <ハイライト画素Aの外側に置換されています、。

オープンオペレーション

最初のために腐蚀動作し、膨胀動作が得られます。我々は、小さなオブジェクトを除去する際に非常に有用に使用され、(オブジェクトが明るい前景の色が黒であると仮定して)、背景より明るい消去ノイズ

クローズドオペレーション

闭运算開放動作の逆の動作、特に、あるべき膨胀次いで腐蚀操作バックグラウンドノイズより消去暗くするために使用されます

形態学的勾配

拡張した画像から腐食した画像を差し引くと、画像のエッジを抽出できます。

トップハットアルゴリズム

元の画像とオープニング操作後の画像の差を使用して、明るい小さなターゲットの前景を抽出します。

ブラックハットアルゴリズム

元の画像と操作後の画像の差、およびハイライトされていない小さなターゲットの前景が取り出されます。

APIの紹介

膨張と腐食

//获取,卷积核
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//指定                                       卷积核形状     大小      锚点位置(-1为中心)      


dilate(src, dst, structureElement, Point(-1, -1), 1);
//    源图  结果   卷积核             锚点      迭代次数

erode(src, dst, structureElement);
//默认 锚点为中心点  迭代次数为 1

その他の形態学的操作

//同样先获得,卷积核:
// MORPH_RECT  矩形    MORPH_CROSS  十字形    MORPH_ELLIPSE   椭圆形
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));

//调用morphologyEx
morphologyEx(src, dst, MORPH_BLACKHAT, structureElement);
//          原图,结果,运算类型         运算核 


/*******************************************************************************

MORPH_CLOSE  闭
MORPH_OPEN   开
MORPH_GRADIENT   梯度
MORPH_TOPHAT      顶帽
MORPH_BLACKHAT    黑帽
MORPH_DILATE      膨胀
MORPH_ERODE       腐蚀
*********************************************************************************/      

コードの練習

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;
Mat src,dst;
int element_size = 3;
int max_size = 25;
char OUTPUT[] = "OUTPUT_WINDOS";

void CallBack_Demo(int, void*)
{
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	//膨胀与腐蚀
	//dilate(src, dst, structureElement, Point(-1, -1), 1);
	//erode(src, dst, structureElement);

	//闭
	//morphologyEx(src,dst,MORPH_CLOSE,structureElement);
        //开
	//morphologyEx(src, dst, MORPH_OPEN, structureElement);
	//梯度
	//morphologyEx(src, dst, MORPH_GRADIENT, structureElement);
	//顶帽
	//morphologyEx(src, dst,MORPH_TOPHAT , structureElement);
	//黑帽
	morphologyEx(src, dst, MORPH_BLACKHAT, structureElement);
	imshow(OUTPUT, dst);
	return;
}


int main(int argc, char* argv[])
{
	//src = imread("src.jpg");
	src = imread("1.PNG");
	if (!src.data)
	{
		cout << "cannot open image" << endl;
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image",src);
	namedWindow(OUTPUT,WINDOW_AUTOSIZE);
	createTrackbar("Element Size:", OUTPUT, &element_size, max_size, CallBack_Demo);
	CallBack_Demo(0, 0);
	waitKey(0);
	return 0;
}

 

 

おすすめ

転載: blog.csdn.net/fan1102958151/article/details/106996717