基於Python的Opencv學習

基於Python的Opencv學習第八天

各位小夥伴大家好,今天我們來學習一下opencv中的形態學操作的相關內容,一起來看一下吧!

一.圖像腐蝕

1.圖像腐蝕的概念
說到圖像腐蝕,見字之意,即將一個大的部分腐蝕成一個小的部分,看一下下面的圖片就可以瞭解清楚在這裏插入圖片描述
這裏右側白的小圓部分就是經過大圓的腐蝕而成的,即丟失了他的邊緣,從而變小。

來看官網裏面介紹腐蝕的例子:
在這裏插入圖片描述
這裏我們可以看到這個原始圖像經過腐蝕之後他的邊緣變得更細了。
來認識一下腐蝕:

1.腐蝕屬於形態學轉換,主要針對的是二值圖像
2.有兩個輸入對象:
對象1:二值圖像(0代表黑色,1代表白色)
對象2:卷積核

在進行腐蝕的時候,我們使用卷積核,卷積核是一個類似N*N的矩陣,我們在腐蝕過程中是利用卷積核的中心點逐個像素掃描原始圖像在這裏插入圖片描述
在這裏插入圖片描述
如圖,黑白色區域就是我們需要腐蝕的圖像,而紅色區域就是我們的卷積核(真實中爲黑色,黃色點爲卷積核的中心),我們就是通過黃色點來進行像素的比較,被掃描到的原始圖像中的像素點,只有當卷積覈對應的元素值均爲1時,這個像素值保留爲1,當卷積覈對應元素既含1又含0時,則將像素值置爲0(即由白變黑)。

2.圖像腐蝕的函數erode()
在圖像腐蝕中使用的函數是erode(),具體語法如下:

dst=cv2.erode(src,kernel,iterations)

dst:處理結果
相應參數:
src:原圖像
kernel:卷積核
iterations:迭代次數

對於卷積核我們是需要生成一個NN的矩陣,需要用**np.ones((N,N),np.uint8)**這裏的NN是生成矩陣的大小,至於那個np.uint8是生成矩陣的類型。

這裏卷積核已經介紹了,至於這個迭代次數就是指我們需要進行腐蝕的次數,如果進行多次腐蝕就需要將這個參數填寫相應的數字。默認情況下不寫爲迭代一次。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
k=np.ones((5,5),np.uint8)
b=cv2.erode(a,k)
cv2.imshow("a",a)
cv2.imshow("b",b)

在這裏插入圖片描述
這裏我們看到腐蝕的結果,由於是腐蝕一次,導致結果不是很明顯,來看一下多次腐蝕的結果:
在這裏插入圖片描述
這是腐蝕了10次的結果這時候圖片已經不成個樣子了(笑哭)

二.圖像膨脹

1.圖像膨脹的概念
現在我們介紹一下圖像膨脹,圖像膨脹和圖像腐蝕互爲逆操作選取黑色爲背景色,白色爲前景色,膨脹就是給前景色邊緣變大(如果黑色爲前景色,則又不同,黑色的前景色邊緣會變小)在這裏插入圖片描述
在這裏插入圖片描述
這兩幅圖都是由原始圖像經過膨脹操作後得到的圖像,可以清楚的看到圖像的邊緣變粗。

膨脹操作的作用:我們一般利用膨脹操作來進行去噪,在剛剛講圖像腐蝕的時候可以看到,圖像經過了腐蝕操作後,去除了噪聲,但是會壓縮圖像,如果我們再對腐蝕過的圖像進行膨脹處理,可以去除噪聲,並保持原有的形狀。在這裏插入圖片描述
這幅三幅圖像我們可以看到,周圍的毛刺已經被去除,但是那個字母“J”經過除噪之後在經過膨脹得到了原圖像相同的大小,這個過程也被稱爲“開運算”。

和腐蝕一樣,我們來認識一下膨脹:

①膨脹操作的形態學轉換主要針對的是二值圖像
②由兩個輸入對象:
對象1:二值圖像
對象2:卷積核

膨脹操作中的卷積核和腐蝕操作中的作用原理和效果均相同(通過卷積核的中心點逐個像素掃描原始圖像)在這裏插入圖片描述
如左圖,如果卷積核裏面既含有1,又含有0,則該卷積核中心點的像素值置爲1,如果兩者均爲0(或1),則像素值保留爲0(或1)。

2.圖像膨脹的函數dilate()

dst=cv2.dilate(src,kernel,iterations)

dst:處理結果
相關參數:
src:原圖像
kernel:卷積核(需要調用np.ones()函數)
iterations:迭代次數

這些在腐蝕操作裏面已經詳細講述,就不再贅述。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
k=np.ones((5,5),np.uint8)
b=cv2.erode(a,k,iterations=5)
c=cv2.dilate(b,k,iterations=10)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)

在這裏插入圖片描述
這裏圖像經歷了腐蝕操作後再次經歷了膨脹操作,腐蝕迭代次數爲5次,膨脹迭代次數是10次,得到如下效果圖。

二.開運算

1.開運算的概念
一個原圖像經過腐蝕處理再經過膨脹處理後就是開運算。

如果我們通過上述調用腐蝕和膨脹兩次函數可以實現類似開運算的效果,但是在opencv中開運算有其自己的函數和相應的作用:

開運算(image)=膨脹(腐蝕(image))
在這裏插入圖片描述
這是官網提供的開運算的例子,即去噪處理。

2.開運算的函數 morphologyEx()

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

opening:開運算結果
具體參數含義:
img:原圖像
cv2.MORPH_OPEN:開運算(這個參數是固定的,是一個常量)
kernel:卷積核(同上述腐蝕膨脹)

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
k=np.ones((5,5),np.uint8)
b=cv2.morphologyEx(a,cv2.MORPH_OPEN,k)
cv2.imshow("a",a)
cv2.imshow("b",b)

在這裏插入圖片描述
這裏看出我的原圖片沒有噪聲需要去除,所以結果發現沒有改變,接下來我們看另一個經過開運算的結果比較直觀。在這裏插入圖片描述

四.閉運算

1.閉運算的概念
與腐蝕,膨脹的關係一樣,閉運算是開運算的逆運算

閉運算是先膨脹,後腐蝕,從而得到閉運算的結果。
閉運算有助於關閉前景物體內部的小孔,或物體上的小黑點,從而達到類似去噪的處理。
在這裏插入圖片描述
在這裏插入圖片描述
這個可以看到已經去除了圖像內部的小黑點。
閉運算(image)=腐蝕(膨脹(image))
在這裏插入圖片描述
這是官網上的例子,可以看到原圖像裏面的小黑點已經被去除。

2.閉運算函數morphologyEx()

closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

這裏的函數不再解釋含義。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
k=np.ones((5,5),np.uint8)
b=cv2.morphologyEx(a,cv2.MORPH_CLOSE,k)
cv2.imshow("a",a)
cv2.imshow("b",b)

在這裏插入圖片描述
這裏是經過閉運算的結果,可以看出有一點點的變化。
在這裏插入圖片描述
這裏可以直觀看出閉運算的結果。

今天給大家介紹了四種形態學操作,分別是腐蝕,膨脹,開運算,閉運算,具體解釋已經寫的很詳細了,只要弄懂卷積核的知識就可以明白這四種形態學操作,函數很簡單,參數只要正確填寫即可。

OK,今天就到這裏,我們下一篇博客見(轉載註明出處)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章