溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python常用圖像形態(tài)學操作實例分析

發(fā)布時間:2022-08-17 16:10:45 來源:億速云 閱讀:151 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下Python常用圖像形態(tài)學操作實例分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

腐蝕

在一些圖像中,會有一些異常的部分,比如這樣的毛刺:

Python常用圖像形態(tài)學操作實例分析

對于這樣的情況,我們就可以應用復式操作了。需要注意的是,腐蝕操作只能處理二值圖像,即像素矩陣的值只有0(黑色)和255(白色)。我們先看看代碼和效果:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
# 腐蝕的代碼
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用圖像形態(tài)學操作實例分析

這張圖片已經(jīng)幾乎看不到毛刺了,但與此同時,三個文字也小了一點,這就是腐蝕操作。所謂腐蝕操作,就是我們設置一個n×n的矩陣,這個矩陣可以視為一個卷積核,在原圖上進移動。矩陣覆蓋住的像素點中,如果有0(黑色),那么該卷積核的中心位置置零,反之,如果該卷積核內全都是255,則不做操作:

Python常用圖像形態(tài)學操作實例分析

注意:我們可以理解成腐蝕操作是完全根據(jù)原圖生成的新圖,而不是在原土上的修改。

接下來我們再看看腐蝕的代碼:

kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

首先,我們要利用numpy庫生成一個n×n大小的全1矩陣kernel作為卷積核,并且需要指定數(shù)據(jù)類型為無符號8位整數(shù)。然后使用erode()函數(shù),其接收的參數(shù)分別為圖像矩陣,kernel矩陣,以及迭代次數(shù)。迭代次數(shù)就是腐蝕操作的次數(shù)。下面我們用一個圓來查看一下不同迭代次數(shù)的腐蝕效果:

import cv2
import numpy as np
kernel = np.ones((30,30),np.uint8)
pie = cv2.imread('pie.png')
# 觀察不同的迭代次數(shù)
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用圖像形態(tài)學操作實例分析

膨脹

腐蝕操作可以腐蝕掉二值圖像的邊緣,因此可以消除掉一些圖片上的毛刺,但是損失一些原圖相中有效的部分也是在所難免的。膨脹其實就是腐蝕操作的反面?!熬矸e核”包裹住的像素中有255,則這個卷積核中心位置會置為255,否則不變。因此,膨脹操作會把原本的圖像范圍進行擴大:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')

kernel = np.ones((3,3),np.uint8)
# 膨脹操作
dige_dilate = cv2.dilate(img,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)

cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用圖像形態(tài)學操作實例分析

可以看到,膨脹操作后,圖像的范圍變大了一圈,就連毛刺也都擴大了。膨脹操作通常會配合腐蝕操作一起使用的,先腐蝕在膨脹,可以在保持圖片中有效內容大小大體不變的情況下去除掉毛刺:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 腐蝕
erosion = cv2.erode(img,kernel,iterations = 1) # 對原圖像進行腐蝕
# 膨脹
dige_dilate = cv2.dilate(erosion,kernel,iterations = 1) # 對腐蝕后圖像進行膨脹
cv2.imshow('dilate', dige_dilate)

cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用圖像形態(tài)學操作實例分析

開運算與閉運算

開運算與閉運算都是應用腐蝕與膨脹操作來處理原圖像的。區(qū)別在于開運算是先腐蝕在膨脹,閉運算是先膨脹再腐蝕。這兩個操作需要用到的函數(shù)都是morphologyEx(),只需要調整參數(shù)即可完成兩種不同的操作。

開運算

執(zhí)行開運算的函數(shù)是:

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

kernel依然是n×n的矩陣,cv2.MORPH_OPEN指定了執(zhí)行運算為開運算:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果為:

Python常用圖像形態(tài)學操作實例分析

閉運算

和開運算基本相同,只需要把morphologyEx()函數(shù)的第二個參數(shù)改為cv2.MORPH_CLOSE即可:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用圖像形態(tài)學操作實例分析

很明顯,先膨脹再腐蝕和原圖并沒有什么區(qū)別,僅僅是比原圖大了一圈,因此閉運算也沒有開運算應用廣泛。

梯度運算

梯度運算本質是膨脹-腐蝕。從這個定義中不難發(fā)現(xiàn),梯度就是原圖的邊緣部分。獲取梯度依然要用到morphologyEx()函數(shù),將第二個參數(shù)改為cv2.MORPH_GRADIENT即可:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 先用開運算把毛刺去掉:
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

得到的結果就是下面這樣:

Python常用圖像形態(tài)學操作實例分析

禮帽與黑帽

禮帽和黑帽都是翻譯的結果,因此我們不能望文生義。禮貌操作就是原始圖像-開運算結果,黑帽操作是閉運算-原始輸入。依然是用morphologyEx()函數(shù),通過修改第二個參數(shù)完成。

禮帽

禮帽操作需要用到的參數(shù)是cv2.MORPH_TOPHAT。由禮帽操作的定義可以直到,禮帽操作可以得到圖片中的“毛刺”部分:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 禮帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

得到的結果為:

Python常用圖像形態(tài)學操作實例分析

黑帽

黑帽操作需要用到的參數(shù)是cv2.MORPH_BLACKHAT,黑帽運算會輸出執(zhí)行閉運算后的圖像比原圖大出的一小圈輪廓:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((5,5),np.uint8) # kernel矩陣維度大一些會讓黑帽操作的結果更明顯
# 黑帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python常用圖像形態(tài)學操作實例分析

以上就是“Python常用圖像形態(tài)學操作實例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI