文章目录
一、定义结构元素
形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的getStructuringElement
函数,也可以直接使用NumPy的ndarray来定义一个结构元素。(形象图如下:)
如下代码:为上图的十字形结构
当然还可以定义椭圆/矩形等:
椭圆:cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
矩形:cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
二、腐蚀和膨胀
- 腐蚀:腐蚀会把物体的边界腐蚀掉,卷积核沿着图象滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。
- 膨胀:卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。一般在除噪是,先腐蚀再膨胀,因为腐蚀在去除白噪声的时候也会使图像缩小,所以我们之后要进行膨胀。当然也可以用来将两者物体分开。
三、开运算和闭运算
开运算和闭运算就是将腐蚀和膨胀按照一定的次序进行处理。
但这两者并不是可逆的,即先开后闭并不能得到原先的图像。
为了获取图像中的主要对象:对一副二值图连续使用闭运算和开运算,或者消除图像中的噪声,也可以对图像先用开运算后用闭运算,不过这样也会消除一些破碎的对象。
- 开运算:先腐蚀后膨胀,用于移除由图像噪音形成的斑点。
- 闭运算:先膨胀后腐蚀,用来连接被误分为许多小块的对象;
四、礼帽/顶帽,黑帽 算法
显然该算法可以图像识别的预处理,用于图像二值化后去除孤立点,如下图所示
显然噪点少了许多
五、形态学运算 检测边和 角点
形态学算子检测图像中的边缘和拐角(实际用:Canny或Harris等算法)
5.1 检测边缘
形态学检测边缘的原理很简单:在膨胀时,图像中的物体会想周围“扩张”;腐蚀时,图像中的物体会“收缩”。由于这两幅图像其变化的区域只发生在边缘。所以这时将两幅图像相减,得到的就是图像中物体的边缘。
5.2检测拐角
拐角的检测的过程稍稍有些复杂。原理:
先用十字形的结构元素膨胀像素,这种情况下只会在边缘处“扩张”,角点不发生变化。
接着用菱形的结构元素腐蚀原图像,导致只有在拐角处才会“收缩”,而直线边缘都未发生变化。
第二步是用X形膨胀原图像,角点膨胀的比边要多。这样第二次用方块腐蚀时,角点恢复原状,而边要腐蚀的更多。所以当两幅图像相减时,只保留了拐角处。