C#-OpenCvSharp开运算与闭运算
本文链接:https://blog.csdn.net/keith_bb/article/details/54578186
本文链接:https://blog.csdn.net/qq_48705696/article/details/109922557
我们通过腐蚀和膨胀两种基本的形态学操作实现开运算、闭运算、形态梯度、顶帽、黑帽五种形态学操作
//MorphologyEx参数
//op;形态学运算的类型
//MORPH_OPEN: 开运算
//MORPH_CLOSE :闭运算
//MORPH_GRADIENT: 形态学梯度
//MORPH_TOPHAT:顶帽运算
//MORPH_BLACKHAT: 黑帽运算
//MORPH_ERODE :腐蚀运算
//MORPH_DILATE :膨胀运算
//MORPH_HITMISS: 击中击不中运算(只支持CV_8UC1类型的二值图像)
//InputArray kernel: 形态学运算的内核,如果是Mat()则表示的是参考点位于内核中心3x3的核
//Point anchor=Point(-1, -1): 锚点位置
//int iterations=1: 迭代使用函数的次数,默认值为1
//int borderType=BORDER_CONSTANT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_CONSTANT
//1.开运算
//先腐蚀后膨胀,可以去掉小的对象。
//定义结构元素
InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3), new Point(-1, -1));
//开操作,也可省落变量前缀名
Cv2.MorphologyEx(srcImg, srcImg, MorphTypes.Open, kernel, new Point(-1, -1), 1, BorderTypes.Constant, Scalar.Gold);
//2.闭运算
//先膨胀后腐蚀,可以填充图像的噪点。
//能够排除小型黑洞(黑色区域),能够平滑对象的轮廓,但是与开运算不同的是闭运算一般会将狭窄的缺口连接起来形成细长的弯口,并填充比结构元素小的洞。
//定义结构元素
InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3), new Point(-1, -1));
//闭操作,也可省落变量前缀名
Cv2.MorphologyEx(srcImg, srcImg, MorphTypes.Close, kernel, new Point(-1, -1), 1, BorderTypes.Constant, Scalar.Gold);
//3.形态梯度
//膨胀减去腐蚀,又称基本梯度(还包括:内部梯度,方向梯度)
//形态梯度是膨胀图与腐蚀图之差,能够保留物体的边缘轮廓
//定义结构元素
InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3), new Point(-1, -1));
//形态学梯度操作,也可省落变量前缀名
Cv2.MorphologyEx(srcImg, srcImg, MorphTypes.Gradient, kernel, new Point(-1, -1), 1, BorderTypes.Constant, Scalar.Gold);
//4.顶帽
//是原图像与开运算之间的差值操作
//开运算的结果是放大了裂缝或局部降低亮度的区域,因此从原图中减去开运算后的图得到的效果图能够突出比原图轮廓周围的区域更明亮的区域,且这一操作与选择的核的大小有关。
//顶帽操作往往用来分离比邻近点亮一些的板块,在一幅图像具有大幅背景而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取
//定义结构元素
InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3), new Point(-1, -1));
//开操作,也可省落变量前缀名
Cv2.MorphologyEx(srcImg, srcImg, MorphTypes.TopHat, kernel, new Point(-1, -1), 1, BorderTypes.Constant, Scalar.Gold);
//5.黑帽
//闭运算图像与原图像的差值图像
//黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,这一操作也与选择的核尺寸有关。所以黑帽运算用来分离比邻近点暗一些的斑块,效果图有着非常完美的轮廓。
//定义结构元素
InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3), new Point(-1, -1));
//开操作,也可省落变量前缀名
Cv2.MorphologyEx(srcImg, srcImg, MorphTypes.BlackHat, kernel, new Point(-1, -1), 1, BorderTypes.Constant, Scalar.Gold);