【OpenCV3经典编程100例】(13)形态学滤波:对二值图像进行开运算与闭运算、morphologyEx()函数

形态学滤波:对二值图像进行开运算与闭运算。

morphologyEx()函数可以实现形态学处理的很多运算,慢慢来~

API函数:

CV_EXPORTS_W 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());//默认值

一、c++示例代码

//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分

//主函数
int main()
{
	//【1】载入图像,灰度化
	Mat image = imread("F:\\opencvtest\\testImage\\faceBinary.png", 0);//灰度原图
	//【2】检查是否载入成功
	if (image.empty())
	{
		printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
		return 0;
	}
	//【3】获取结构元素
	Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
	//【4】闭运算
	Mat closedImage;
	morphologyEx(image, closedImage, MORPH_CLOSE, element);
	//【5】开运算
	Mat openedImage;
	morphologyEx(image, openedImage, MORPH_OPEN, element);
	//【6】显示图像
	imshow("13-二值图像", image);
	imshow("13-闭运算", closedImage);
	imshow("13-开运算", openedImage);
	//【7】保持窗口显示
	waitKey(0);
	return 0;
}

二、运行截图

1.二值图像原图


2.闭运算


3.开运算


三、数字图像处理知识

1.对二值图像运算

定义:先腐蚀再膨胀,相当于先用结构元素B对A腐蚀,再对腐蚀结果用同样的结构元进行膨胀操作。

等幂性:对同样的A,做多次开运算的结果与做一次是一样的。

结果:开运算的边界是由这样一些点组成的,就是当B沿A的内部边界滚动时,B中所能达到的A的内部边界的最远的点。


2.对二值图像运算

定义:先膨胀再腐蚀,相当于先用结构元B对A进行膨胀,再对膨胀结果用同样的结构元进行腐蚀操作,过程与开运算正好相反。

等幂性:对同样的A,做多次闭运算的结果与做一次是一样的。

就像腐蚀和膨胀的关系一样,开和闭也是关于集合补和反转的对偶。


3.对二值图像开、闭运算的基本作用

    从开、闭运算的基本定义和运行过程可以看出,这两种集合操作的所能导致的大致效果如下:

    开运算通常对图像轮廓进行平滑,使狭窄的“地峡”形状断开,去掉细的突起

    闭运算也是趋向于平滑图像的轮廓,但于开运算相反,它一般使窄的断开部位和细长的沟熔合,填补轮廓上的间隙

    可以这样想,对一副二值图像进行开运算,结果是对图像白色部分去掉细的突起,相当于对图像黑色部分填补轮廓上的间隙。对一副二值图像进行闭运算,结果是对图像白色部分填补轮廓上的间隙,相当于对图像黑色部分去掉细的突起。二值图像,非黑即白,你把黑白转换一下,更容易明白开闭运算!



猜你喜欢

转载自blog.csdn.net/misterjiajia/article/details/80320093