數(shù)字圖像處理:邊緣檢測(cè)
序言
在之前的文章中,我介紹了傅里葉變換,這次我將介紹另一種圖像處理方法,邊緣檢測(cè)。在openCV中,有很多函數(shù)可以讓我們找到圖像的邊緣,在這篇文章中,我將挑選出比較有代表性的Sobal算子和Laplacian算子進(jìn)行介紹。
邊緣檢測(cè)
既然我們要檢測(cè)邊緣,首先我們需要了解邊緣是什么。
最簡(jiǎn)單的邊緣
以上圖為例,我們可以看到黑白的分界線就是我們要找的邊緣,也就是像素之間的急劇變化。
拉普拉斯算子
原則拉普拉斯算子使用對(duì)圖像進(jìn)行微分的方法來(lái)提取邊緣。具體推導(dǎo)方法如下。
以與正面相似的圖片為例,取其中一條橫線,加以區(qū)分。
可以看出,在邊緣的交界處,經(jīng)過(guò)微分后,會(huì)出現(xiàn)一個(gè)明顯的峰值。我們可以設(shè)置一個(gè)閾值,這樣如果微分后的圖像超過(guò)這個(gè)閾值,就會(huì)判斷為邊緣,進(jìn)行后續(xù)處理。
但是這種方法不夠嚴(yán)謹(jǐn),所以也可以對(duì)圖像進(jìn)行兩次微分。而二階導(dǎo)數(shù)結(jié)果中的Z點(diǎn),也就是“過(guò)零”,就是我們要找的邊。
在了解了基本原理之后,我們需要從數(shù)學(xué)上推導(dǎo)出 Laplacian 所需的掩碼應(yīng)該是什么樣子。從上面的介紹可以看出,最重要的部分就是對(duì)圖像進(jìn)行區(qū)分,但其實(shí)這在圖像中并不難,只要從下一個(gè)網(wǎng)格的像素中減去上一個(gè)網(wǎng)格的像素,即可以得到斜率,它是一階導(dǎo)數(shù)。
數(shù)學(xué)表達(dá)式
在知道如何推導(dǎo)一階微分之后,同樣可以推導(dǎo)出二階微分。在這里,我們將跳過(guò)推導(dǎo)過(guò)程,直接查看結(jié)果。
二階微分的數(shù)學(xué)公式
至此,我們得到了我們需要的拉普拉斯掩碼。
拉普拉斯算子掩碼
實(shí)施
我們可以使用 openCV 中提供的拉普拉斯運(yùn)算函數(shù):
dst = cv2.Laplacian(src, ddepth, ksize)
src :要處理的圖像。
dst :輸出圖像。
ddepth :圖像的深度。有許多標(biāo)志可以使用。最常用的是cv2.CV_8U和cv2.CV_16S。
ksize :掩碼的大小。
import cv2
def main():
# read image
gray_img = cv2.imread("./lenna.jpg", 0)
cv2.imshow("img",gray_img)
# Try masks of different sizes
for n in range(1, 4):
# 使用拉普拉斯算子
kernel_size = 1+(n*2)
gray_lap = cv2.Laplacian(gray_img, cv2.CV_16S, ksizekernel_size)
# Convert image format to uint8
abs_lap = cv2.convertScaleAbs(gray_lap)
# display image
cv2.imshow(f"{1+n*2}_lap_img",abs_lap)
cv2.waitKey(0)
cv2.destroyAllWindows()
# save image
cv2.imwrite(f"./result/Laplacian/Laplacian_{1+n*2}.png",abs_lap)
if __name__ == "__main__":
main()
結(jié)果
Sobal 算子
原則
下圖是 Sobal 算子使用的掩碼。左邊是水平方向的邊緣檢測(cè),右邊是垂直方向的邊緣檢測(cè)。
然后使用這個(gè)掩碼對(duì)圖像進(jìn)行卷積得到邊緣圖像。
實(shí)施
就像拉普拉斯算子一樣,openCV 也提供了書面的 Sobal 函數(shù)。
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
src :要處理的圖像。
dst :輸出圖像。
ddepth :圖像的深度。有許多標(biāo)志可以使用。最常用的是cv2.CV_8U和cv2.CV_16S。
dx, dy :選擇要在水平或垂直方向進(jìn)行的操作,選擇1, 0/0, 1。
ksize :掩碼的大小。
在Sobal操作之后,convertScaleAbs通常會(huì)執(zhí)行一個(gè)操作,將圖像轉(zhuǎn)換回可以正常顯示的格式。
dst = cv2.convertScaleAbs(src)
示例程序
import cv2
def main():
# read image
gray_img = cv2.imread("./lenna.jpg", 0)
cv2.imshow("img",gray_img)
# Try masks of different sizes
for n in range(1, 4):
# 使用 sobel 算子
kernel_size = 1+(n*2)
x = cv2.Sobel(gray_img, cv2.CV_16S, 1, 0, ksize=kernel_size)
y = cv2.Sobel(gray_img, cv2.CV_16S, 0, 1, ksize=kernel_size)
# Convert image format to uint8
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
# Add the results from both directions to form a complete contour
dst = cv2.a(chǎn)ddWeighted(absX, 0.5, absY,0.5,0)
# display image
cv2.imshow(f"{1+n*2}_x",absX)
cv2.imshow(f"{1+n*2}_y",absY)
cv2.imshow(f"{1+n*2}_x+y",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
# save image
cv2.imwrite(f"./result/Sobal/Sobal_{1+n*2}_x.png",absX)
cv2.imwrite(f"./result/Sobal/Sobal_{1+n*2}_y.png",absY)
cv2.imwrite(f"./result/Sobal/Sobal_{1+n*2}_x+y.png",dst)
if __name__ == "__main__":
main()
輸入
結(jié)果(內(nèi)核大小 = 3)
結(jié)果(內(nèi)核大小 = 5)
結(jié)果(內(nèi)核大小 = 7)
參考
原文標(biāo)題 : 數(shù)字圖像處理:邊緣檢測(cè)
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-12.26立即報(bào)名>>> 【在線會(huì)議】村田用于AR/VR設(shè)計(jì)開發(fā)解決方案
-
1月8日火熱報(bào)名中>> Allegro助力汽車電氣化和底盤解決方案優(yōu)化在線研討會(huì)
-
即日-1.14火熱報(bào)名中>> OFweek2025中國(guó)智造CIO在線峰會(huì)
-
即日-1.24立即參與>>> 【限時(shí)免費(fèi)】安森美:Treo 平臺(tái)帶來(lái)出色的精密模擬
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
-
2
- 1 人形機(jī)器人核心零部件,誰(shuí)是盈利最強(qiáng)企業(yè)?
- 2 AI Agent現(xiàn)狀如何?聊聊近期國(guó)內(nèi)的智能體市場(chǎng)動(dòng)向
- 3 5nm重大突破,研祥智能助力半導(dǎo)體企業(yè)高效發(fā)展!
- 4 人形機(jī)器人引爆“PEEK材料”!概念股梳理(名單)
- 5 馬云沒回牌桌,但重注全壓在了
- 6 7 豆包AI登頂國(guó)內(nèi)第一!概念股梳理(名單)
- 8 押注AI王者歸來(lái),歌爾股份“智能體”在下一盤“大棋”
- 9 AI超級(jí)應(yīng)用什么時(shí)候才能出現(xiàn)?
- 10 英偉達(dá)迎來(lái)當(dāng)頭一棒
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容