OpenCV图像处理开发实战(8) -- 图像的形态学操作(腐蚀与膨胀)

1、前言

(1)腐蚀
消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点;
(2)膨胀
把与物体接触的所有背景点合并到物体中,使目标增大,可知添补目标中的空洞。
(3)开运算
先腐蚀后膨胀的过程,可以消除图像上道细小的噪声,并平滑物体边界。
(4)闭运算
先膨胀后腐蚀的过程,可以填充物体内细小的空洞,并平滑物容体边界。
(5)梯度运算
膨胀结果图像与腐蚀膨胀结果图像的差值图像
(6)顶帽运算
原图像与开运算结果图像的差值图像
(7)黑帽运算
闭运算结果图像与原图像的差值图像

2、相关的API函数

(1)膨胀
void dilate( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
(2)腐蚀
void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );
(3)取得结构元素
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
其中, int shape:
MORPH_RECT= 0, // 矩形结构元素
MORPH_CROSS= 1, // 十字结构元素
MORPH_ELLIPSE= 2 // 椭圆结构元素

(4)形态学组合操作
是膨胀和腐蚀运算的组合运算。

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() );
其中,int op =
CV_MOP_ERODE =0 // 腐蚀
CV_MOP_DILATE =1 // 膨胀
CV_MOP_OPEN =2// 开运算
CV_MOP_CLOSE =3//闭运算
CV_MOP_GRADIENT =4// 梯度
CV_MOP_TOPHAT =5 // 顶帽运算
CV_MOP_BLACKHAT =6 // 黑帽运算

3、相关功能的源代码

腐蚀运算

void Erosion_Image(int, void*)
{
	int erosion_type;
	int typex[] = { MORPH_RECT ,MORPH_CROSS,  MORPH_ELLIPSE };
	erosion_type = typex[erosion_index];


	Mat element = getStructuringElement(erosion_type,
		Size(2 * erosion_size + 1, 2 * erosion_size + 1),
		Point(erosion_size, erosion_size));


	Mat erodeMatx = getStructuringElement(erosion_type, Size(3, 3));
	erode(srcImg1, erodeMat, element);// 腐蚀操作
	
	imshow("Erosion", erodeMat);
}

在这里插入图片描述

膨胀运算

void Dilation_Image(int, void*)
{
	int dilation_type;
	int typex[] = { MORPH_RECT ,MORPH_CROSS,  MORPH_ELLIPSE };
	dilation_type = typex[dilation_index];
	Mat element = getStructuringElement(dilation_type,
		Size(2 * dilation_size + 1, 2 * dilation_size + 1),
		Point(dilation_size, dilation_size));

	///膨胀操作
	dilate(srcImg1, dilateMat, element);
	imshow("Dilation", dilateMat);
}

在这里插入图片描述
形态学组合运算

void Morphology_Image(int, void*)
{

	int op;
	int ops[] = {  CV_MOP_ERODE ,
					CV_MOP_DILATE,  
					CV_MOP_OPEN, 
					CV_MOP_CLOSE, 
					CV_MOP_GRADIENT,
					CV_MOP_TOPHAT, 
					CV_MOP_BLACKHAT };

	op = ops[moph_op_index];

	Mat element = getStructuringElement(MORPH_RECT,
		Size(2 * 1 + 1, 2 * 1 + 1));


	morphologyEx(srcImg1, morphMat, op, element);
	imshow("Moph", morphMat);
}

在这里插入图片描述

4、形态学操作应用

使用函数morphologyEx()作直线的提取。

void Morphology_Extract_HLine()
{
	Mat kernel = getStructuringElement(MORPH_RECT,
		Size(srcImg1.cols / 10, 1));
	Mat grayMat;
	Mat binMat;
	cvtColor(srcImg1, grayMat, CV_BGR2GRAY);
	adaptiveThreshold(grayMat, binMat, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
	morphologyEx(binMat, hLineMat, CV_MOP_OPEN, kernel);
	imshow("H Line", hLineMat);
}

在这里插入图片描述

5、工程源代码下载

本文件源程序在Debug–x64下编译运行通过。
Zip包中包含开发环境,解压后可直接编译

下载源程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值