圖片處理-opencv-5.圖像形態(tài)學(xué)(腐蝕,膨脹,開(kāi)運(yùn)算,閉運(yùn)算,梯度運(yùn)算,頂帽運(yùn)算,黑帽運(yùn)算)

圖像腐蝕與圖像膨脹

圖像的膨脹(Dilation)和腐蝕(Erosion)是兩種基本的形態(tài)學(xué)運(yùn)算哮肚,主要用來(lái)尋找圖像中的極大區(qū)域和極小區(qū)域秫舌。

?

圖像腐蝕

image.png

該公式表示圖像A用卷積模板B來(lái)進(jìn)行腐蝕處理凰兑,通過(guò)模板B與圖像A進(jìn)行卷積計(jì)算谣辞,得出B覆蓋區(qū)域的像素點(diǎn)最小值甸私,并用這個(gè)最小值來(lái)替代參考點(diǎn)的像素值欧芽。如圖所示,將左邊的原始圖像A腐蝕處理為右邊的效果圖A-B朴摊。


image.png

形態(tài)學(xué)轉(zhuǎn)換主要針對(duì)的是二值圖像(0或1)默垄。圖像腐蝕類(lèi)似于“領(lǐng)域被蠶食”,將圖像中的高亮區(qū)域或白色部分進(jìn)行縮減細(xì)化甚纲,其運(yùn)行結(jié)果圖比原圖的高亮區(qū)域更小口锭。

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

  • dst表示處理的結(jié)果
  • src表示原圖像
  • kernel表示卷積核
  • iterations表示迭代次數(shù),迭代次數(shù)默認(rèn)是1,表示進(jìn)行一次腐蝕,也可以根據(jù)需要進(jìn)行多次迭代鹃操,進(jìn)行多次腐蝕
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))

#讀取圖片
src = cv2.imread('data/test4.jpg', cv2.IMREAD_UNCHANGED)

#設(shè)置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像腐蝕處理
erosion = cv2.erode(src, kernel)

#顯示結(jié)果
titles = ['src', 'erosion']
images = [src, erosion]
for i in range(2):
    plt.subplot(1, 2, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

圖像膨脹

image.png

該公式表示用B來(lái)對(duì)圖像A進(jìn)行膨脹處理韭寸,其中B是一個(gè)卷積模板或卷積核,其形狀可以為正方形或圓形荆隘,通過(guò)模板B與圖像A進(jìn)行卷積計(jì)算恩伺,掃描圖像中的每一個(gè)像素點(diǎn),用模板元素與二值圖像元素做“與”運(yùn)算椰拒,如果都為0晶渠,那么目標(biāo)像素點(diǎn)為0,否則為1燃观。從而計(jì)算B覆蓋區(qū)域的像素點(diǎn)最大值褒脯,并用該值替換參考點(diǎn)的像素值實(shí)現(xiàn)膨脹。下圖是將左邊的原始圖像A膨脹處理為右邊的效果圖A⊕B缆毁。
image.png

圖像膨脹是腐蝕操作的逆操作番川,類(lèi)似于“領(lǐng)域擴(kuò)張”,將圖像中的高亮區(qū)域或白色部分進(jìn)行擴(kuò)張脊框,其運(yùn)行結(jié)果圖比原圖的高亮區(qū)域更大爽彤,線條變粗了,主要用于去噪缚陷。
(1) 圖像被腐蝕后适篙,去除了噪聲,但是會(huì)壓縮圖像箫爷。
(2) 對(duì)腐蝕過(guò)的圖像嚷节,進(jìn)行膨脹處理,可以去除噪聲虎锚,并且保持原有形狀硫痰。

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

  • dst表示處理的結(jié)果
  • src表示原圖像
  • kernel表示卷積核
  • iterations表示迭代次數(shù)
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))

#讀取圖片
src = cv2.imread('data/test4.jpg', cv2.IMREAD_UNCHANGED)

#設(shè)置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像膨脹處理
dilate = cv2.dilate(src, kernel)

#顯示結(jié)果
titles = ['src', 'dilate']
images = [src, dilate]
for i in range(2):
    plt.subplot(1, 2, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png
# 依次進(jìn)行腐蝕、膨脹處理
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))


#讀取圖片
src = cv2.imread('data/test5.jpg', cv2.IMREAD_UNCHANGED)

#設(shè)置卷積核
kernel1 = np.ones((9,9), np.uint8)
#圖像腐蝕處理
result1 = cv2.erode(src, kernel1)

#設(shè)置卷積核
kernel2 = np.ones((9,9), np.uint8)
#圖像膨脹處理
result2 = cv2.dilate(result1, kernel2)

#顯示結(jié)果
titles = ['Image', 'erode', 'dilate']
images = [src, result1, result2]
for i in range(3):
    plt.subplot(1, 3, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

圖像開(kāi)運(yùn)算窜护、閉運(yùn)算效斑、梯度運(yùn)算、頂帽運(yùn)算柱徙、黑帽運(yùn)算

?

圖像開(kāi)運(yùn)算

圖像開(kāi)運(yùn)算是圖像依次經(jīng)過(guò)腐蝕缓屠、膨脹處理后的過(guò)程。圖像被腐蝕后护侮,去除了噪聲敌完,但是也壓縮了圖像;接著對(duì)腐蝕過(guò)的圖像進(jìn)行膨脹處理羊初,可以去除噪聲滨溉,并保留原有圖像。

dst = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

  • dst表示處理的結(jié)果
  • src表示原圖像
  • cv2.MORPH_OPEN表示開(kāi)運(yùn)算
  • kernel表示卷積核
import cv2  
import numpy as np  
import matplotlib.pyplot as plt


#讀取圖片
src = cv2.imread('data/test6.jpg', cv2.IMREAD_UNCHANGED)

#設(shè)置卷積核
kernel = np.ones((12,12), np.uint8)

#圖像開(kāi)運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

#顯示結(jié)果
titles = ['src', 'result']
images = [src, result]
plt.figure(figsize=(10, 4))
for i in range(2):
    plt.subplot(1, 2, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

圖像閉運(yùn)算

圖像閉運(yùn)算是圖像依次經(jīng)過(guò)膨脹、腐蝕處理后的過(guò)程晦攒。圖像先膨脹闽撤,后腐蝕,它有助于關(guān)閉前景物體內(nèi)部的小孔脯颜,或物體上的小黑點(diǎn)哟旗。

dst = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

  • dst表示處理的結(jié)果
  • src表示原圖像
  • cv2.MORPH_CLOSE
  • kernel表示卷積核
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取圖片
src = cv2.imread('data/test7.jpg', cv2.IMREAD_UNCHANGED)

#設(shè)置卷積核
kernel = np.ones((10,10), np.uint8)

#圖像閉運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

#顯示結(jié)果
titles = ['src', 'result']
images = [src, result]
plt.figure(figsize=(10, 4))
for i in range(2):
    plt.subplot(1, 2, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

圖像梯度運(yùn)算

圖像梯度運(yùn)算是膨脹圖像減去腐蝕圖像的結(jié)果,得到圖像的輪廓伐脖,其中二值圖像1表示白色點(diǎn),0表示黑色點(diǎn)乐设。

dst = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)

  • dst表示處理的結(jié)果
  • src表示原圖像
  • cv2.MORPH_GRADIENT表示梯度運(yùn)算
  • kernel表示卷積核
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取圖片
src = cv2.imread('data/test8.jpg', cv2.IMREAD_UNCHANGED)

#設(shè)置卷積核
kernel = np.ones((10,10), np.uint8)

#圖像閉運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)

#顯示結(jié)果
titles = ['src', 'result']
images = [src, result]
plt.figure(figsize=(10, 4))
for i in range(2):
    plt.subplot(1, 2, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

頂帽運(yùn)算

圖像頂帽(或圖像禮帽)運(yùn)算是原始圖像減去圖像開(kāi)運(yùn)算的結(jié)果讼庇,得到圖像的噪聲。常用于解決由于光照不均勻圖像分割出錯(cuò)的問(wèn)題近尚。

dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

  • dst表示處理的結(jié)果
  • src表示原圖像
  • cv2.MORPH_TOPHAT表示頂帽運(yùn)算
  • kernel表示卷積核
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取圖片
src = cv2.imread('data/test5.jpg', cv2.IMREAD_UNCHANGED)

#設(shè)置卷積核
kernel = np.ones((9,9), np.uint8)

#圖像頂帽運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

#顯示結(jié)果
titles = ['src', 'result']
images = [src, result]
plt.figure(figsize=(10, 4))
for i in range(2):
    plt.subplot(1, 2, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

黑帽運(yùn)算

圖像黑帽運(yùn)算是圖像閉運(yùn)算操作減去原始圖像的結(jié)果蠕啄,得到圖像內(nèi)部的小孔,或者前景色中的小黑點(diǎn)戈锻。也常用于解決由于光照不均勻圖像分割出錯(cuò)的問(wèn)題歼跟。

dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

  • dst表示處理的結(jié)果
  • src表示原圖像
  • cv2.MORPH_BLACKHAT表示頂帽運(yùn)算
  • kernel表示卷積核
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取圖片
src = cv2.imread('data/test7.jpg', cv2.IMREAD_UNCHANGED)

#設(shè)置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像黑帽運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

#顯示結(jié)果
titles = ['src', 'result']
images = [src, result]
plt.figure(figsize=(10, 4))
for i in range(2):
    plt.subplot(1, 2, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png
# 基于灰度三維圖的頂帽黑帽運(yùn)算
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

#讀取圖像
img = cv.imread("data/test5.jpg")
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
imgd = np.array(img)      #image類(lèi)轉(zhuǎn)numpy

#準(zhǔn)備數(shù)據(jù)
sp = img.shape
h = int(sp[0])        #圖像高度(rows)
w = int(sp[1])       #圖像寬度(colums) of image

#繪圖初始處理
fig = plt.figure(figsize=(16,12))
ax = fig.gca(projection="3d")

x = np.arange(0, w, 1)
y = np.arange(0, h, 1)
x, y = np.meshgrid(x,y)
z = imgd
surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)  

#自定義z軸
ax.set_zlim(-10, 255)
ax.zaxis.set_major_locator(LinearLocator(10))   #設(shè)置z軸網(wǎng)格線的疏密
#將z的value字符串轉(zhuǎn)為float并保留2位小數(shù)
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) 

# 設(shè)置坐標(biāo)軸的label和標(biāo)題
ax.set_xlabel('x', size=15)
ax.set_ylabel('y', size=15)
ax.set_zlabel('z', size=15)
ax.set_title("surface plot", weight='bold', size=20)

#添加右側(cè)的色卡條
fig.colorbar(surf, shrink=0.6, aspect=8)  
plt.show()
image.png
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

#讀取圖像
img = cv.imread("data/test5.jpg")
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

#圖像黑帽運(yùn)算
kernel = np.ones((10,10), np.uint8)
result = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)

#image類(lèi)轉(zhuǎn)numpy
imgd = np.array(result)     

#準(zhǔn)備數(shù)據(jù)
sp = result.shape
h = int(sp[0])        #圖像高度(rows)
w = int(sp[1])       #圖像寬度(colums) of image

#繪圖初始處理
fig = plt.figure(figsize=(16,12))
ax = fig.gca(projection="3d")

x = np.arange(0, w, 1)
y = np.arange(0, h, 1)
x, y = np.meshgrid(x,y)
z = imgd
surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)  

#自定義z軸
ax.set_zlim(-10, 255)
ax.zaxis.set_major_locator(LinearLocator(10))   #設(shè)置z軸網(wǎng)格線的疏密
#將z的value字符串轉(zhuǎn)為float并保留2位小數(shù)
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) 

# 設(shè)置坐標(biāo)軸的label和標(biāo)題
ax.set_xlabel('x', size=15)
ax.set_ylabel('y', size=15)
ax.set_zlabel('z', size=15)
ax.set_title("surface plot", weight='bold', size=20)

#添加右側(cè)的色卡條
fig.colorbar(surf, shrink=0.6, aspect=8)  
plt.show()
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市格遭,隨后出現(xiàn)的幾起案子哈街,更是在濱河造成了極大的恐慌,老刑警劉巖拒迅,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骚秦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡璧微,警方通過(guò)查閱死者的電腦和手機(jī)作箍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)前硫,“玉大人胞得,你說(shuō)我怎么就攤上這事∫俚纾” “怎么了阶剑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)危号。 經(jīng)常有香客問(wèn)我个扰,道長(zhǎng),這世上最難降的妖魔是什么葱色? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任递宅,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘办龄。我一直安慰自己烘绽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布俐填。 她就那樣靜靜地躺著安接,像睡著了一般。 火紅的嫁衣襯著肌膚如雪英融。 梳的紋絲不亂的頭發(fā)上盏檐,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音驶悟,去河邊找鬼胡野。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痕鳍,可吹牛的內(nèi)容都是我干的硫豆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼笼呆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼熊响!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诗赌,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤汗茄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后铭若,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體剔难,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年奥喻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偶宫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡环鲤,死狀恐怖纯趋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冷离,我是刑警寧澤吵冒,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站西剥,受9級(jí)特大地震影響痹栖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞭空,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一揪阿、第九天 我趴在偏房一處隱蔽的房頂上張望疗我。 院中可真熱鬧,春花似錦南捂、人聲如沸吴裤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)麦牺。三九已至,卻和暖如春鞭缭,著一層夾襖步出監(jiān)牢的瞬間剖膳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工岭辣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吱晒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓易结,卻偏偏與公主長(zhǎng)得像枕荞,于是被迫代替她去往敵國(guó)和親柜候。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搞动,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348