目標
• 學習不同的形態學操作,例如腐蝕,膨脹,開運算,閉運算等
• 我們要學習的函式有: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 寫出兩個版本的函式,乙個採用傳遞直直的方法,另乙個採用引用型別做引數。輸入描述 輸入三個整數...