【opencv图像处理中的形态学操作】

腐蚀膨胀都是用一个卷积核对图像进行卷积处理,并取出结果中的极大/小值作为结果,腐蚀是图片中黑的区域增加,膨胀是图片中高亮区域增加(消除这些小的黑斑)。

API:Mat getStructuringElement(int 内核形状,Size 内核尺寸,Point 锚点位置)

 注:内核形状可以取方形MORPH_RECT,十字形MORPH_CROSS,椭圆形MORPH_ELLIPSE

锚点位置默认值Point(-1,-1),取形状的中心

通过该API就可以获得相应的计算核,接下来计算膨胀的函数为

 API:void dilate(源图像,目标图像,膨胀核,锚点,int 迭代次数,int边界模式,int 边界为常数时边界值)


开运算与闭运算的结合经常用于二值图像的后处理阶段,整个过程消除了二值图像中的孤立目标,并且填补了目标区域的内部孔洞。但是这两种运算会破坏目标原本轮廓和形状,特别是对于小尺寸目标会变得十分明显。

开运算:开运算是一个先腐蚀,后膨胀的过程,用于在图像中消除小的物体,在纤细点处分离物体,在平滑化较大的物体的边界的同时不明显改变物体的体积.

闭运算:先膨胀后腐蚀的过程,能够用于消除物体中的小型黑洞

API:void morpholgyEx(源,目标,int 形态学操作标志,mat 形态学操作内核,Point 锚点,int 迭代次数,int 边界模式,int 边界为常数时的边界值).

注:形态学操作标志的取值如下:MORPH_OPEN开运算  MORPH_CLOSE 闭运算 MORPH_GRENIENT 形态学梯度 MORPH_TOPHAT顶帽 MORPH_BLACKHAT黑帽 MORPH_ERODE腐蚀 MORPH_DILATE 膨胀

形态学操作内核就是前面膨胀腐蚀使用的内核


使用滑动条迭代一次进行处理:

#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;

Mat srcImage;
//开
const int g_openCoreMax = 100;
int g_nopenCoreValue=5;
void onopenCoreSizeTrackBar(int , void* );

//闭

const int g_closeCoreMax = 100;
int g_ncloseCoreValue=5;

void oncloseCoreSizeTrackBar(int, void* );



int main(int argc, char* argv[])
{
	srcImage = imread("123.jpg");
	namedWindow("src image", WINDOW_AUTOSIZE);
	
	
	namedWindow("open image", WINDOW_AUTOSIZE);
	createTrackbar("core size", "open image", &g_nopenCoreValue, g_openCoreMax, onopenCoreSizeTrackBar, 0);
	onopenCoreSizeTrackBar(0, 0);
   
	
	namedWindow("close image", WINDOW_AUTOSIZE);
	createTrackbar("core size", "close image", &g_ncloseCoreValue, g_closeCoreMax, oncloseCoreSizeTrackBar, 0);
	oncloseCoreSizeTrackBar(0, 0);

	imshow("src image", srcImage);

	
	
	
	waitKey(0);
	return 0;
}

void onopenCoreSizeTrackBar(int , void* )
{
	Mat openImage;
	if (g_nopenCoreValue == 0 )
	{
		imshow("open image", srcImage);
	}
	else
	{
		if (g_nopenCoreValue % 2 == 0)
			g_nopenCoreValue++;
		Mat core = getStructuringElement(MORPH_RECT, Size(g_nopenCoreValue, g_nopenCoreValue));
		morphologyEx(srcImage, openImage, MORPH_OPEN, core, Point(-1, -1), 1);
		imshow("open image", openImage);
	}
}

void oncloseCoreSizeTrackBar(int, void*)
{
	Mat closeImage;
	if (g_ncloseCoreValue ==  0)
	{
		imshow("close image", srcImage);
	}
	else
	{
		if (g_ncloseCoreValue % 2 == 0)
			g_ncloseCoreValue++;
		Mat core = getStructuringElement(MORPH_RECT, Size(g_ncloseCoreValue, g_ncloseCoreValue));
		morphologyEx(srcImage, closeImage, MORPH_CLOSE, core, Point(-1, -1),1);
		imshow("close image", closeImage);
	}
}

运行输出:

【opencv图像处理中的形态学操作】

【opencv图像处理中的形态学操作】【opencv图像处理中的形态学操作】