OpenCV Python 17 形態學轉換

2021-10-18 08:41:10 字數 3235 閱讀 2651

目標

• 學習不同的形態學操作,例如腐蝕,膨脹,開運算,閉運算等

• 我們要學習的函式有:cv2.erode(),cv2.dilate(),cv2.morphologyex()

原理

形態學操作是根據影象形狀進行的簡單操作。一般情況下對二值化影象進行的操作。需要輸入兩個引數,乙個是原始影象,第二個被稱為結構化元素或核,它是用來決定操作的性質的。兩個基本的形態學操作是腐蝕和膨脹。他們的變體構成了開運算,閉運算,梯度等。我們會以下圖為例逐一介紹它們。

就像土壤侵蝕一樣,這個操作會把前景物體的邊界腐蝕掉(但是前景仍然是白色)。這是怎麼做到的呢?卷積核沿著影象滑動,如果與卷積核對應的原影象的所有畫素值都是 1,那麼中心元素就保持原來的畫素值,否則就變為零。

這會產生什麼影響呢?根據卷積核的大小靠近前景的所有畫素都會被腐蝕掉(變為 0),所以前景物體會變小,整幅影象的白色區域會減少。這對於去除白雜訊很有用,也可以用來斷開兩個連在一塊的物體等。

這裡我們有乙個例子,使用乙個 5x5 的卷積核,其中所有的值都是以。讓我們看看他是如何工作的:

import cv2

import numpy as np

img = cv2.imread('j.png',0)

kernel = np.ones((5,5),np.uint8)

erosion = cv2.erode(img,kernel,iterations = 1)

結果:

與腐蝕相反,與卷積核對應的原影象的畫素值中只要有乙個是 1,中心元素的畫素值就是 1。所以這個操作會增加影象中的白色區域(前景)。一般在去雜訊時先用腐蝕再用膨脹。因為腐蝕在去掉白雜訊的同時,也會使前景物件變小。所以我們再對他進行膨脹。這時雜訊已經被去除了,不會再回來了,但是前景還在並會增加。膨脹也可以用來連線兩個分開的物體。

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

先進性腐蝕再進行膨脹就叫做開運算。就像我們上面介紹的那樣,它被用來去除雜訊。這裡我們用到的函式是 cv2.morphologyex()。

opening = cv2.morphologyex(img, cv2.morph_open, kernel)
結果:

先膨脹再腐蝕。它經常被用來填充前景物體中的小洞,或者前景物體上的小黑點。

closing = cv2.morphologyex(img, cv2.morph_close, kernel)
結果:

其實就是一幅影象膨脹與腐蝕的差別。

結果看上去就像前景物體的輪廓。

gradient = cv2.morphologyex(img, cv2.morph_gradient, kernel)
結果:

原始影象與進行開運算之後得到的影象的差。下面的例子是用乙個 9x9 的核進行禮帽操作的結果。

tophat = cv2.morphologyex(img, cv2.morph_tophat, kernel)
結果:

進行閉運算之後得到的影象與原始影象的差。

tophat = cv2.morphologyex(img, cv2.morph_tophat, kernel)
結果:

結構化元素

在前面的例子中我們使用 numpy 構建了結構化元素,它是正方形的。但有時我們需要構建乙個橢圓形/圓形的核。為了實現這種要求,提供了 opencv函式 cv2.getstructuringelement()。你只需要告訴他你需要的核的形狀和大小。

nefuoj 17 數字三角形

problem 17 time limit 1000ms memory limit 65536k 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。輸入...

17 數字三角形 初入dp

7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。輸入資料有多組,每組輸入的是一行是乙個整數n 1 n 100 給出三角形的行數。下面的n行給出數字三角...

第17周專案2 引用做形參

檔名稱 123.cpp 完成日期 2014年12月19日 版本號 v1.0 問題描述 設計乙個程式,輸入三個整數,將其從大到小得順序輸出,要求 1 排序功能通過函式實現,3個整數用三個變數,不必定義陣列 2 寫出兩個版本的函式,乙個採用傳遞直直的方法,另乙個採用引用型別做引數。輸入描述 輸入三個整數...