opencv学习-形态学操作

腐蚀

erode函数

将各点像素值替换为对应邻域上的最小值,常用来去除图形的一些毛边

void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() )
  • InputArray src, 输入图形
  • OutputArray dst, (输出图像:size与type与原始图像相同)
  • InputArray kernel, (用于腐蚀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement来创建结构元素。)
  • Point anchor=Point(-1,-1), (结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心)
  • int iterations=1, (腐蚀操作被递归执行的次数)
  • int borderType=BORDER_CONSTANT, (推断边缘类型,可参考BorderTypes)
  • const Scalar& borderValue=morphologyDefaultBorderValue() (边缘值)

膨胀

dilate函数

膨胀操作是腐蚀操作的逆操作

void cv::dilate	(	InputArray 	src,
	OutputArray 	dst,
	InputArray 	kernel,
	Point 	anchor = Point(-1,-1),
	int 	iterations = 1,
	int 	borderType = BORDER_CONSTANT,
	const Scalar & 	borderValue = morphologyDefaultBorderValue() 
)	
  • InputArray src, 输入图形
  • OutputArray dst, (输出图像:size与type与原始图像相同)
  • InputArray kernel, (用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement来创建结构元素。)
  • Point anchor=Point(-1,-1), (结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心)
  • int iterations=1, (腐蚀操作被递归执行的次数)
  • int borderType=BORDER_CONSTANT, (推断边缘类型,可参考BorderTypes)
  • const Scalar& borderValue=morphologyDefaultBorderValue() (边缘值)

morphologyEx函数

常用操作
opencv学习-形态学操作_第1张图片

开操作

开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素
作用:主要是应用在二值图像分析中,灰度图像亦可;用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积.提取水平或竖直的线。

闭操作

闭操作 = 膨胀+腐蚀 ,输入图像 + 结构元素
作用:主要是应用在二值图像分析中,灰度图像亦可;用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。

void cv::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() 
)	

Mat dilate_kernal = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));  //膨胀核
cv::morphologyEx(fgmask, fgmask, cv::MORPH_OPEN, dilate_kernal);
  • InputArray src, 输入图形
  • OutputArray dst, (输出图像:size与type与原始图像相同)
  • int op, 参看MorphTypes枚举类型,开操作为cv::MORPH_OPEN,闭操作为cv::MORPH_CLOSE
  • InputArray kernel, (用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement来创建结构元素。)
  • Point anchor=Point(-1,-1), (结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心)
  • int iterations=1, (腐蚀操作被递归执行的次数)
  • int borderType=BORDER_CONSTANT, (推断边缘类型,可参考BorderTypes)
  • const Scalar& borderValue=morphologyDefaultBorderValue() (边缘值)

梯形运算

梯度运算等价于膨胀运算-腐蚀运算
对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓

void cv::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() 
)	
Mat gradient_kernal = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));  //膨胀核
cv::morphologyEx(fgmask, fgmask, cv::MORPH_GRADIENT, gradient_kernal );

op输入为MORPH_GRADIENT即为梯形运算

顶帽操作和黑帽操作

顶帽操作

顶帽操作是源图像与图像开运算结果之间的差,它把开运算“去掉”的细节显现出来。

我们回顾下开运算的作用:

  • 消除值高于邻近点的孤立点,达到去除图像中噪声的作用;
  • 消除较小的连通域,保留较大的连通域;
  • 断开较窄的狭颈,可以在两个物体纤细的连接处将它们分离;
  • 不明显改变较大连通域的面积的情况下平滑连通域的连界、轮廓;

那么顶帽运算的作用便是:

  • 把值高于邻近点的孤立点或斑块分离出来。
  • 把较小的连通域分离出来。
  • 把较窄的狭颈和两个物体的纤细连接处分离出来。

黑帽操作

黑帽操作是闭运算结果与原图像之间的差值,它把闭运算“增加”的细节显现出来。
我们回顾下闭运算的作用:

  • 消除值低于邻近点的孤立点,达到去除图像中噪声的作用;
  • 连接两个邻近的连通域;
  • 弥合较窄的间断和细长的沟壑;
  • 去除连通域内的小型空洞;
  • 和开运算一样也能够平滑物体的轮廓;

那么黑帽运算的作用便是:

  • 把值低于邻近点的孤立点或斑块分离出来。
  • 把较窄的间断和细长的沟壑显现出来;
  • 把连通域内的小型空洞显现出来
//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601

//OpenCV版本:3.0
//VS版本:2013

#include 
#include 
#include
#include 

using namespace cv;

int main()
{

	//载入原图   
	Mat image = imread("F:/material/images/P0049-Top-Hat-02.jpg", 0);

	//显示原图  
	imshow("顶帽-黑帽运算原图", image);

	//获取结构
	cv::Mat element1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(7, 7));

	Mat out1,out2;
	//进行形态学顶帽运算操作  
	morphologyEx(image, out1, MORPH_TOPHAT, element1);
	//进行形态学黑帽运算操作  
	morphologyEx(image, out2, MORPH_BLACKHAT, element1);

	//显示效果图  
	imshow("顶帽运算效果图", out1);
	imshow("黑帽运算效果图", out2);

	waitKey(0);

	return 0;
}


opencv学习-形态学操作_第2张图片

参考原文链接:https://blog.csdn.net/wenhao_ir/article/details/124841757

你可能感兴趣的:(opencv,c++,opencv,学习,计算机视觉)