形态学运算

有时,在对图像进行阈值处理后,二进制图像中会出现不必要的噪点。形态学操作可以帮助去除图像中的噪点。

核心

核心是简单的形状,其中原点叠加在二进制图像值1的每个像素上。 OpenCV将内核限制为NxN矩阵,其中N为奇数。内核的起源是中心。一个常见的内核是

\[\begin{split}kernel= \ begin {pmatrix} 1&1&1 \\ 1&1&1 \\ 1&1&1 \ end {pmatrix}\end{split}\]

不同的核心可以对图像产生不同的影响,例如仅侵蚀或垂直扩展。

作为参考,这是我们创建的二进制映像:

Original binary image.

侵蚀

计算机视觉中的侵蚀类似于土壤上的侵蚀。它消除了前景对象的边界。此过程可以消除背景噪音。

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.erode(binary_img, kernel, iterations = 1)
Image after erosion.  Little spots have gone away and large spots reduced in size.

在腐蚀过程中,如果二进制图像的像素没有完全包含叠加的内核像素,则将其叠加的像素删除。

扩张

扩张与侵蚀相反。它没有远离边界,反而增加了边界。此过程可以去除较大区域内的小孔。

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.dilate(binary_img, kernel, iterations = 1)
Image after Dilation.  All of the spots have grown larger.

在扩张过程中,每个叠加核的每个像素都包含在扩张中。

开放

开放是侵蚀,然后是扩张。此过程可消除噪声,而不会影响较大特征的形状。

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)
Image after Opening.  It has removed most of the small artifacts but still keeps the large size of the larger elements.

备注

在这种特定情况下,为了消除右上角的像素,应该进行更多次开放迭代。

关闭

关闭是扩张,然后是侵蚀。此过程可去除小孔或裂口,而不会影响较大特征的形状。

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel)
Little holes around the image have been removed but overall size of each object stayed roughly the same.