本帖最后由 qingshanlushui 于 2019-9-2 20:11 编辑
lesson06----膨胀与腐蚀
接下来....文字/线条的提取......指定形状的提取.....直方图(待定)
在膨胀与腐蚀的基础上,有形态学开操作:先腐蚀后膨胀(可以去掉图像中小的对象)形态学闭操作:先膨胀后腐蚀(可以填充图像小的‘洞’,纯色如果包含小的污渍可以去掉污渍)
形态学梯度:膨胀减去腐蚀
形态学顶帽:是原图像与开操作之间的差值图像
形态学黑帽:闭操作图像与源图像的差值图像
本套学习心得,虽不是什么高瞻远瞩,但依旧禁止任何形式的转载or复制(含非商业),如需任何形式的转载or复制,还请论坛留言通知我一下下....
一/基本概念
- ⑴ 图像形态学处理的概念
- 数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域形状有用处的图像分量,比如边界、骨架以及凸壳,还包括用于预处理或后处理的形态学过滤、细化和修剪等。图像形态学处理中我们感兴趣的主要是二值图像。
- 在二值图像中,所有黑色像素的集合是图像完整的形态学描述,二值图像的各个分量是Z2的元素。假定二值图像A和形态学处理的结构元素B是定义在笛卡儿网格上的集合,网格中值为1的点是集合的元素,当结构元素的原点移到点(x,y)时,记为Sxy,为简单起见,结构元素为3x3,且全都为1,在这种限制下,决定输出结果的是逻辑运算。
- ⑵ 二值图像的逻辑运算
- 逻辑运算尽管本质上很简单,但对于实现以形态学为基础额图像处理算法是一种有力的补充手段。在图像处理中用到的主要逻辑运算是:与、或和非(求补),它们可以互相组合形成其他逻辑运算。
- ⑶ 膨胀和腐蚀
- 膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学算法都是以这两种运算为基础的。
- ① 膨胀
- 是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。A被B膨胀是所有位移z的集合,这样, 和A至少有一个元素是重叠的。我们可以把上式改写为:
- 结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。
- ⑴ 用结构元素B,扫描图像A的每一个像素
- ⑵ 用结构元素与其覆盖的二值图像做“与”操作
- ⑶ 如果都为0,结果图像的该像素为0。否则为1
- ② 腐蚀
- 对Z中的集合A和B,B对A进行腐蚀的整个过程如下:
- ⑴ 用结构元素B,扫描图像A的每一个像素
- ⑵ 用结构元素与其覆盖的二值图像做“与”操作
- ⑶ 如果都为1,结果图像的该像素为1。否则为0
- 腐蚀处理的结果是使原来的二值图像减小一圈。
复制代码
参考文档:https://wenku.baidu.com/view/1923d18fcc22bcd126ff0ccc.html
二/基本膨胀与腐蚀
- static Mat zx61;
- /// <summary>
- /// 图像膨胀与腐蚀
- /// 腐蚀就是变粗,膨胀是变细
- /// </summary>
- public static void ExpansionAndCorrosion(string path)
- {
- int elementSize = 0;//初始化
- int maxSize = 21; //滑动效果最大值
- using (zx61 = new Mat(path, ImreadModes.AnyColor ))
- using (Mat zx6161 = new Mat(zx61.Size(), zx61.Type()))
- {
- //CvTrackbarCallback2 :窗口动态调整
- CvTrackbarCallback2 cvCallback = new CvTrackbarCallback2(CallBackDome);
- Cv2.ImShow("zx61", zx61);
- zx61.CopyTo(zx6161);
- Cv2.ImShow("zx6161", zx6161);
- //滑动条
- CvTrackbar cvt = new CvTrackbar("Bar :", "zx6161", elementSize, maxSize, cvCallback, zx6161);
- Cv2.WaitKey();
- }
- }
- private static void CallBackDome(int size, object userdate)
- {
- //不用using 释放掉就不能处理了
- Mat zx616 = (Mat)userdate;
- size = size * 2 + 1; //要为奇数
- Mat zx61616 = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(size, size), new Point(-1, -1));
- //膨胀
- Cv2.Dilate(zx61, zx616, zx61616, new Point(-1, -1), 1);
- //腐蚀
- //Cv2.Erode(zx61, zx616, zx61616, new Point(-1, -1), 1);
- //Cv2.ImShow("zx6161", zx616);
- new Window("zx6161", WindowMode.AutoSize, zx616);
- }
复制代码
腐蚀就是变粗,膨胀是变细
三/形态学黑帽
- /// <summary>
- /// 形态学黑帽:闭操作图像与源图像的差值图像
- /// </summary>
- public static void MorphologyBlackHAT(string path)
- {
- using (Mat zx61 = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
- using (Mat zx6161 = new Mat())
- {
- //:定义结构元素
- InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(15, 15), new Point(-1, -1));
- //顶帽操作,也可省略变量前缀名
- Cv2.MorphologyEx( zx61, zx6161, op: MorphTypes.BlackHat, element: kernel, anchor: new Point(-1, -1));
- using (new Window("zx61", WindowMode.AutoSize, zx61))
- using (new Window("zx6161", WindowMode.AutoSize, zx6161))
- {
- Cv2.WaitKey();
- }
- }
- }
复制代码
四/形态学顶帽
- /// <summary>
- /// 形态学顶帽:是原图像与开操作之间的差值图像
- /// </summary>
- public static void MorphologyTopHAT(string path)
- {
- using (Mat zx61 = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
- using (Mat zx6161 = new Mat())
- {
- //:定义结构元素
- InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(25, 25), new Point(-1, -1));
- //顶帽操作,也可省略变量前缀名
- Cv2.MorphologyEx( zx61, zx6161, op: MorphTypes.TopHat, element: kernel, anchor: new Point(-1, -1));
- using (new Window("zx61", WindowMode.AutoSize, zx61))
- using (new Window("zx6161", WindowMode.AutoSize, zx6161))
- {
- Cv2.WaitKey();
- }
- }
- }
复制代码
五/其余api
//:定义结构元素
InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(15, 15), new Point(-1, -1));
//形态学梯度操作,也可省略变量前缀名
Cv2.MorphologyEx( zx61, zx6161, op: MorphTypes.Gradient, element: kernel, anchor: new Point(-1, -1));
//闭操作,也可省略变量前缀名
Cv2.MorphologyEx(zx61, zx6161, op: MorphTypes.Close, element: kernel, anchor: new Point(-1, -1));
//开操作,也可省略变量前缀名
Cv2.MorphologyEx(zx61,zx6161, op: MorphTypes.Open, element: kernel, anchor: new Point(-1, -1));
本套学习心得,虽不是什么高瞻远瞩,但依旧禁止任何形式的转载or复制(含非商业),如需任何形式的转载or复制,还请论坛留言通知我一下下....
|