個人網(wǎng)站論文摘要網(wǎng)頁設計與制作期末作品
文章目錄
- 1.腐蝕操作
- 2.膨脹操作
- 3.開運算和閉運算
- 4.禮帽與黑帽
- 5.梯度運算
1.腐蝕操作
腐蝕操作是圖像處理中常用的一種形態(tài)學操作,我們通常用于去除圖像中的噪聲、分割連通區(qū)域、減小目標物體的尺寸等。腐蝕操作的原理是,在給定的結(jié)構元素下,遍歷圖像的每個像素,并將其值替換為該像素周圍鄰域內(nèi)像素的最小值。結(jié)構元素控制了腐蝕的鄰域范圍和形狀。鄰域內(nèi)的任何一個像素為黑色(0),則中心像素也將被置為黑色(0)。這樣可以縮小或消除二值圖像中的前景目標。在OpenCV
中,我們可以使用cv2.erode()
來實現(xiàn)腐蝕操作
語法如下:
cv2.erode(src, kernel, iterations)
參數(shù)說明:
src
:輸入的二值圖像,通常為單通道灰度圖像。kernel
:腐蝕操作的結(jié)構元素,用于定義腐蝕的鄰域大小和形狀??梢允褂?cv2.getStructuringElement()
函數(shù)創(chuàng)建不同形狀的結(jié)構元素。iterations
:腐蝕操作的迭代次數(shù),表示應用腐蝕的重復次數(shù)。
接下來我們先來看一張圖:
img = cv2.imread('JOJO.png')cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
大家可以看到,除了JOJO
之外,它的周圍還有很多斜線,我們可以利用腐蝕操作來消除。
# 創(chuàng)建結(jié)構元素 (3x3 方框形)
kernel = np.ones((3, 3), dtype=np.uint8)# 執(zhí)行腐蝕操作
eroded = cv2.erode(img, kernel, iterations=1)# 顯示結(jié)果
cv2.imshow('Eroded Image', eroded)
cv2.waitKey(0)
cv2.destroyAllWindows()
可以看到,這些斜線變得很淺,因為被他周圍的黑色所影響,并且原始圖像的字母也變得更小了,因為腐蝕操作減少了一部分信息。
我們可以更改iterations
的值,來增加迭代次數(shù),迭代的次數(shù)越多,則腐蝕的越嚴重,具體結(jié)果如下
erosion_1 = cv2.erode(img,kernel,iterations = 1)#1次迭代
erosion_2 = cv2.erode(img,kernel,iterations = 2)#2次迭代
erosion_3 = cv2.erode(img,kernel,iterations = 3)#3次迭代
res = np.hstack((erosion_1,erosion_2,erosion_3))#水平堆砌
# 顯示結(jié)果
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
腐蝕操作和膨脹(Dilation)操作相對應,二者經(jīng)常組合使用以實現(xiàn)更復雜的形態(tài)學圖像處理任務,接下來我們來看看膨脹操作。
2.膨脹操作
說完了腐蝕操作之后,我們再來看一下它的逆操作,膨脹操作。我們在上面的腐蝕操作中,在消除噪聲的同時,把有價值的信息也減少了。因此我們希望將這些有價值的信息增大,這樣就要利用到膨脹操作。
在 OpenCV 中,膨脹操作是通過 cv2.dilate()
函數(shù)實現(xiàn)的。該函數(shù)接受三個參數(shù):輸入圖像、結(jié)構元素和迭代次數(shù)。
結(jié)構元素可以通過 cv2.getStructuringElement()
函數(shù)創(chuàng)建,它定義了膨脹操作的鄰域大小和形狀。常見的結(jié)構元素形狀包括矩形、橢圓和十字形
。
我們還是用剛剛的例子
# 原始圖像
img = cv2.imread('JOJO.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
接下來我們使用腐蝕操作消除細線
# 腐蝕操作
kernel = np.ones((5,5),np.uint8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
我們可以看見其中字母也變小了,我們想恢復其原始信息。
# 膨脹操作
kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨脹操作的效果取決于結(jié)構元素的形狀和大小,以及迭代次數(shù)。增加迭代次數(shù)會使目標物體區(qū)域更大,邊界更粗糙。通常情況下,一個或兩個迭代次數(shù)就足夠了。
膨脹操作通常與腐蝕操作結(jié)合使用,以在圖像中執(zhí)行形態(tài)學處理。這種組合的方法稱為開運算(Opening)和閉運算(Closing),接下來我們來看看如何實現(xiàn)
3.開運算和閉運算
開運算是先進行腐蝕操作,再進行膨脹操作。它主要用于去除圖像中的噪點、小的干擾物或者分離連通的對象。
閉運算是先進行膨脹操作,再進行腐蝕操作。它主要用于填充圖像中的小洞孔或者連接分離的對象。
開運算:
在opencv
中,通過調(diào)用cv2.morphologyEx()
函數(shù),并指定操作類型為cv2.MORPH_OPEN
,實現(xiàn)開運算
# 開:先腐蝕,再膨脹
img = cv2.imread('dige.png')kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
可以看到開運算可以讓我們先去除邊緣細線,然后再增加信息恢復到原始結(jié)果。
閉運算:
在opencv
中,通過調(diào)用cv2.morphologyEx()
函數(shù),并指定操作類型為cv2.MORPH_CLOSE
,實現(xiàn)閉運算
# 閉:先膨脹,再腐蝕
img = cv2.imread('JOJO.png')kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
在閉運算中,由于一開始我們加粗了邊緣細線,導致后續(xù)我們即使做了腐蝕操作也不能完全去除。
這兩種方法可以用來改善圖像的質(zhì)量、去除噪聲或者填充空洞,具體根據(jù)我們的需求進行更改。
4.禮帽與黑帽
- 禮帽 = 原始輸入-開運算結(jié)果
- 黑帽 = 閉運算-原始輸入
通過使用禮帽和黑帽操作,可以突出圖像中細微的亮或暗結(jié)構,或者檢測背景中的亮或暗區(qū)域。
禮帽操作
在opencv
中,我們通過調(diào)用 cv2.morphologyEx()
函數(shù),并指定操作類型為 cv2.MORPH_TOPHAT
,執(zhí)行禮帽操作
#禮帽
img = cv2.imread('JOJO.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
黑帽操作:
黑帽操作是禮帽操作的相反過程,用于突出圖像中微小結(jié)構或背景中的暗區(qū)域。在Opencv中,通過調(diào)用 cv2.morphologyEx()
函數(shù),并指定操作類型為cv2.MORPH_BLACKHAT
,執(zhí)行黑帽操作。
#黑帽
img = cv2.imread('JOJO.png')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()
5.梯度運算
- 梯度 = 膨脹-腐蝕
首先,我們分別實現(xiàn)膨脹和腐蝕操作。
# 梯度=膨脹-腐蝕
img = cv2.imread('JOJO.png')
kernel = np.ones((5,5),np.uint8)
dilate = cv2.dilate(img,kernel,iterations = 1)
erosion = cv2.erode(img,kernel,iterations = 1)res = np.hstack((dilate,erosion))cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
接下來我們實現(xiàn)梯度運算
# 梯度運算
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
大家可以看出這個圖片就是用膨脹操作-腐蝕操作的結(jié)果。
🔎本章的介紹到此介紹,如果文章對你有幫助,請多多點贊、收藏、評論、訂閱支持!!《Opencv入門到項目實戰(zhàn)》