OpenCV学习:基础图像操作 (六):形态学操作

基础概念

腐蚀

腐蚀可以理解为B的中心(锚点)沿着A的内边界走了一圈。腐蚀也是对高亮部分而言A区域之外的部分 < A的高亮像素,所里里面被外面取代。

膨胀

膨胀可以理解为B的中心(锚点)沿着A的外边界走了一圈。膨胀是对高亮部分而言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