python opencv入門-形態學轉換


目標:

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

  我們要學習的函數有 cv2.erode(),cv2.dilate(),cv2.morphologyEx() 等。

原理 :
一般對二值化圖像進行形態學轉換操作。輸入的第一個參數為原始圖像;第二個參數為結構化元素(核),該參數決定操作性質。兩個基本形態學操作是腐蝕膨脹,衍生出了開運算、閉運算、梯度運算等等

腐蝕 :
腐蝕操作會把前景物體的邊緣腐蝕掉。原理是卷積核沿着圖像滑動,如果與卷積核對應的原圖像像素值都是1,那么中心元素保持原值,否則為0. 
效果,靠近前景的像素被腐蝕為0,前景物體變小,圖像白色區域減少,對於去除白噪聲很有用,可以斷開兩個連接在一起的物體。 
(圖像當中的白噪聲大概意思就是隨機噪聲)

如下5*5的卷積核

 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('9.jpg',0)
 5 kernel = np.ones((5,5),np.uint8)
 6 erosion = cv2.erode(img,kernel,iterations = 2)
 7 
 8 cv2.imshow('img',img)
 9 cv2.imshow('ero',erosion)
10 
11 cv2.waitKey(0)

 

這里寫圖片描述

左側為腐蝕后的圖像,iterations為迭代運算次數

膨脹 :
與腐蝕相反,卷積核當中只要有一個值是1,中心元素值就是1。此操作會增加前景中的白色區域,一般在去噪聲的時候都是先腐蝕再膨脹,腐蝕的過程會使得前景變小,使用膨脹操作使前景變換回來。膨脹也可以使相互分離的物體連接。

 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('9.jpg',0)
 5 kernel = np.ones((5,5),np.uint8)
 6 dilation = cv2.dilate(img,kernel,iterations = 1)
 7 
 8 cv2.imshow('img',img)
 9 cv2.imshow('dil',dilation)
10 
11 cv2.waitKey(0)

 

這里寫圖片描述

左邊為膨脹

開運算 :
就是先腐蝕再膨脹,一般用來去除噪聲

函數是 cv2.morphologyEx()

 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('9.jpg',0)
 5 kernel = np.ones((5,5),np.uint8)
 6 
 7 opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
 8 
 9 cv2.imshow('img',img)
10 cv2.imshow('opening',opening)
11 
12 cv2.waitKey(0)

 

結果略

閉運算:

先膨脹再腐蝕,一般用來填充黑色的小像素點

 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('9.jpg',0)
 5 kernel = np.ones((5,5),np.uint8)
 6 closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
 7 
 8 cv2.imshow('img',img)
 9 cv2.imshow('closing',closing)
10 
11 cv2.waitKey(0)

 

形態學梯度

此為膨脹和腐蝕的差別,結果為前景輪廓

這里寫圖片描述

 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('9.jpg',0)
 5 kernel = np.ones((5,5),np.uint8)
 6 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
 7 
 8 cv2.imshow('img',img)
 9 cv2.imshow('gradient',gradient)
10 
11 cv2.waitKey(0)

 

禮帽:

原始圖像與開運算圖像的差 
這里寫圖片描述

 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('9.jpg',0)
 5 kernel = np.ones((5,5),np.uint8)
 6 tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
 7 
 8 cv2.imshow('img',img)
 9 cv2.imshow('tophat',tophat)
10 
11 cv2.waitKey(0)

 

黑帽:

閉運算與原始圖像的差(注意是閉運算減去原始圖像,與禮帽不相反)

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
  • 1

結構化元素 
前面使用numpy構建結構化元素,都是正方形的核。如果要構建圓形或者橢圓形的核,可以使用 cv2.getStructuringElement()函數。 
參數填入形狀和大小

 1 # 矩形核
 2 >>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
 3 array([[1, 1, 1, 1, 1],
 4        [1, 1, 1, 1, 1],
 5        [1, 1, 1, 1, 1],
 6        [1, 1, 1, 1, 1],
 7        [1, 1, 1, 1, 1]], dtype=uint8)
 8 
 9 # 橢圓形核
10 >>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
11 array([[0, 0, 1, 0, 0],
12        [1, 1, 1, 1, 1],
13        [1, 1, 1, 1, 1],
14        [1, 1, 1, 1, 1],
15        [0, 0, 1, 0, 0]], dtype=uint8)
16 
17 # 十字形核
18 >>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
19 array([[0, 0, 1, 0, 0],
20        [0, 0, 1, 0, 0],
21        [1, 1, 1, 1, 1],
22        [0, 0, 1, 0, 0],
23        [0, 0, 1, 0, 0]], dtype=uint8)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM