Posted on

opencv圖像運算

理論

形態變換是一些基於圖像形狀的簡單操作。它通常在二進製圖像上執行。它需要兩個輸入,一個是我們的原始圖像,第二個稱為結構元素或內核,它決定了操作的性質。兩個基本的形態學算子是侵蝕和膨脹。然後它的變體形式如開、閉、梯度等也開始發揮作用。我們將在下圖的幫助下一一看到它們:

侵蝕cv2.erode

侵蝕的基本思想就像土壤侵蝕一樣,它侵蝕掉前景物體的邊界(總是盡量讓前景保持白色)。那它有什麼作用呢?內核在圖像中滑動(如在 2D 卷積中)。只有當內核下的所有像素都為 1 時,原始圖像中的像素(1 或 0)才會被認為是 1,否則它會被腐蝕(變為零)。

所以發生的事情是,根據內核的大小,邊界附近的所有像素都將被丟棄。因此,前景對象的厚度或大小會減少,或者圖像中的白色區域會減少。它對於去除小的白噪聲(正如我們在色彩空間章節中看到的)、分離兩個連接的對像等很有用。

在這裡,作為一個例子,我會使用一個 5×5 的內核。讓我們看看它是如何工作的:

import cv2 as cv
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

膨脹Dilation

它與侵蝕正好相反。這裡,如果內核下的至少一個像素為“1”,則像素元素為“1”。因此它增加了圖像中的白色區域或前景對象的大小增加。通常,在去除噪聲等情況下,腐蝕之後是膨脹。因為,腐蝕去除了白噪聲,但它也縮小了我們的對象。所以我們擴大它。由於噪音消失了,它們不會回來,但我們的對象區域增加了。它還可用於連接對象的損壞部分。

dilation = cv2.dilate(img,kernel,iterations = 1)

去噪cv2.MORPH_OPEN

在去除噪聲方面很有用。這裡我們使用函數cv2.morphologyEx()

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

關閉線條

對關閉前景對象內的小孔或對像上的小黑點很有用。這個我也有使用來把canny所找到的邊緣關起來

closing = cv2.morphologyEx (img, cv2.MORPH_CLOSE, kernel)

形態梯度

這是圖像膨脹和腐蝕之間的區別。結果將看起來像對象的輪廓。

gradient = cv2.morphologyEx (img, cv2.MORPH_GRADIENT, kernel)

Top Hat

使用cv2.MORPH_TOPHAT

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

Black Hat

使用cv2.MORPH_GRADIENT

gradient = cv2.morphologyEx (img, cv2.MORPH_GRADIENT, kernel)

更多資訊: https://homepages.inf.ed.ac.uk/rbf/HIPR2/morops.htm