系列文章目錄
文章目錄
- 系列文章目錄
- 前言
- 形态學操作
-
- 1. 理論
- 2. 腐蝕
- 3. 膨脹
- 4. 開操作
- 5. 閉操作
- 6. 形态學梯度
- 7. 頂帽
- 8. 黑帽
- 9. 結構體元素
- 10. 擴充資料
前言
本節将介紹形态學操作
形态學操作
形态學操作:如腐蝕,膨脹,打開,關閉等。
函數如下: cv.erode(), cv.dilate(), cv.morphologyEx() 等.
1. 理論
形态變換是一些基于圖像形狀的簡單操作。它通常在二值圖像上執行。它需要兩個輸入,一個是我們的原始圖像,另一個是決定操作性質的結構元素或核心。兩個基本的形态學算子是腐蝕和膨脹。然後它的變體形式,如開,閉,梯度等也發揮作用。我們将通過以下圖檔逐一了解它們:
2. 腐蝕
腐蝕的基本思想就像土壤腐蝕一樣,它腐蝕了前景對象的邊界(總是嘗試保持前景為白色)。那麼它是做什麼的呢?核心在圖像中滑動(就像在2D卷積中一樣)。隻有當核下的所有像素都為1時,原始圖像中的一個像素(1或0)才會被認為是1,否則就會被腐蝕(使其為0)。
是以,根據kernel的大小,邊界附近的所有像素都将被丢棄。是以前景物體的厚度或大小減少了,或者隻是圖像中的白色區域減少了。它對去除小的白噪聲(如我們在顔色空間章節中看到的),分離兩個連接配接的物體等都很有用。
在這裡,作為一個示例,我将使用一個充滿1的5x5核心。讓我們看看它是如何工作的:
import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(img,kernel,iterations = 1)
3. 膨脹
它正好與腐蝕相反。在這裡,如果核心下隻要有一個像素是“1”,那麼像素元素就是“1”。是以它增加了圖像中的白色區域或者前景物體的大小增加了。通常情況下,在去除噪音的情況下,腐蝕緊随其後的是膨脹。因為腐蝕去除了白噪聲,但它也縮小了我們的對象。是以我們把它放大。因為噪音消失了,它們不會再回來,但是我們的物體面積增加了。它在連接配接一個物體的破碎部分時也很有用。
4. 開操作
開操作為腐蝕+膨脹。正如我們上面所解釋的,它在消除噪聲方面是有用的。這裡我們使用函數**cv.morphologyEx()**
5. 閉操作
閉操作和開操作相反,為膨脹+腐蝕。它在關閉前景物體内部的小孔或物體上的小黑點時很有用。
6. 形态學梯度
形态學梯度為膨脹-腐蝕。
結果将看起來像對象的輪廓。
7. 頂帽
原圖-開操作
8. 黑帽
閉操作後的圖檔 - 原圖
9. 結構體元素
在前面的例子中,我們在Numpy的幫助下手動建立了一個結構化元素。它是矩形的。但在某些情況下,你可能需要橢圓形或圓形的kernels。是以,為了達到這個目的,OpenCV有一個函數,cv.getStructuringElement()。隻要傳遞出kernels的形狀和大小,就能得到想要的kernels。
# Rectangular Kernel
>>> cv.getStructuringElement(cv.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=uint8)
# Elliptical Kernel
>>> cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype=uint8)
# Cross-shaped Kernel
>>> cv.getStructuringElement(cv.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]], dtype=uint8)
10. 擴充資料
- Morphological Operations at HIPR2