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