![aa28373235343225941b3ef13c2f0c25.png](https://i-blog.csdnimg.cn/blog_migrate/0b6e13c8914a0c26c218aea0d6379bfa.jpeg)
本文目的
目的:学习使用opencv的腐蚀和膨胀。不介绍算法,只以使用者的角度来理解
语言:java
版本:opencv-410
分解介绍
膨胀与腐蚀,关于算法方面的介绍不太懂,太复杂,只想从使用者的角度来理解下。
- 膨胀的作用:将白色区域变大,可以使相互分离的物体连接起来
- 腐蚀的作用:将黑色区域变大,可以断开两个连接在一起的物体
所以
使用膨胀时,图像会变的越来越亮,白色区域越来越多
使用腐蚀时,图像会变得越来越暗,黑色区域越来越多。
如官方文档的案例中:
原图:
![62603db7e43e02acb050b65cb3b868e2.png](https://i-blog.csdnimg.cn/blog_migrate/6526371a527734edb106a663b36d65ab.png)
膨胀后图片:可以看到白色区域变大了
![fd190e9a575538d48171f0282963b4d4.png](https://i-blog.csdnimg.cn/blog_migrate/e7b6178d3ff9e17768613a2f0a34a0cd.png)
腐蚀后图片:可以看到白色区域变小了
![8b4b28ddbfd312ec4d3bae11ecac421d.png](https://i-blog.csdnimg.cn/blog_migrate/5e1843b956c6224cd83c5e992519d13f.png)
膨胀函数
javadoc:
dilate(Mat src, Mat dst, Mat kernel)_dilate(Mat src, Mat dst, Mat kernel, Point anchor)
腐蚀函数
__javadoc:_
erode(Mat src, Mat dst, Mat kernel)
erode(Mat src, Mat dst, Mat kernel, Point anchor)
内核元素的构造
无论腐蚀还是膨胀都要先构造一个内核元素,也是一个Mat元素
对于自定义一个结构元素kernel,OpenCV提供了一个函数getStructuringElement,可以获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。
getStructuringElement的内部并没有什么优化实现,只是封装了一下功能。其原理同样是声明一个Mat,然后求形状,指定Mat的值。
总之:getStructuringElement是一种更加简便的方法实现一个kernel。
元素类型
结构性元素类型有三种:矩形,椭圆和十字
Imgproc.CV_SHAPE_RECT;
Imgproc.CV_SHAPE_CROSS;
Imgproc.CV_SHAPE_ELLIPSE;
三种类型元素,腐蚀时效果不一样,在下面的程序运行时拖动slider,可以看到。
代码
package
效果
原图:
![abec0b791c55a846884905ba619ebecc.png](https://i-blog.csdnimg.cn/blog_migrate/845297f1d2c2a62a15836de820102373.jpeg)
腐蚀效果:黑色区域变大,图片黑化
![d0a4958bd4845043df423ea81edf06a4.png](https://i-blog.csdnimg.cn/blog_migrate/0d05a17c43b968f09d2555f4d1e9cc19.jpeg)
膨胀效果:白色区域变大
![316e261a07eb90f7a0167b673377a705.png](https://i-blog.csdnimg.cn/blog_migrate/e956287ea40796b576e077a09254e583.jpeg)