opencv入門12:梯度和邊緣檢測-GRADIENTS AND EDGE DETECTION

一枪蘑、圖像梯度:

  • 圖像梯度损谦,圖像邊界等
  • 使用到的函數(shù)有:cv2.Sobel(),cv2.Schar()岳颇,cv2.Laplacian() 等
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

梯度簡單來說就是求導(dǎo)照捡。
OpenCV 提供了三種不同的梯度濾波器,或者說高通濾波器:
Sobel话侧,Scharr 和Laplacian栗精。
下面會一一介紹他們。
Sobel,Scharr 其實就是求一階或二階導(dǎo)數(shù)悲立。Scharr 是對Sobel(使用
小的卷積核求解求解梯度角度時)的優(yōu)化鹿寨。Laplacian 是求二階導(dǎo)數(shù)。

1:laplacian and sobel

Laplacian 算子
圖·1
Sobel 算子和Scharr 算子
圖·2
import numpy as np 
import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required =True, help="Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("Original",image)

lap = cv2.Laplacian(image,cv2.CV_64F)
#cv2.CV_64F 輸出圖像的深度(數(shù)據(jù)類型)薪夕,可以使用-1, 與原圖像保持一致np.uint8
#當(dāng)我們可以通過參數(shù)-1 來設(shè)定輸出圖像的深度(數(shù)據(jù)類型)與原圖像保持一致脚草,但是我們在代碼中使用的卻是cv2.CV_64F。這是為什么呢 
# 原因涉及圖像中的黑色到白色和白色到黑色的轉(zhuǎn)變原献。
# 從黑色到白色的轉(zhuǎn)換被認(rèn)為是正斜率馏慨,而從白色到黑色的轉(zhuǎn)換是負(fù)斜率。如果您還記得我們在第6章中對圖像算術(shù)的討論姑隅,您將會知道一個8位無符號整數(shù)不代表負(fù)值写隶。如果您使用的是OpenCV,則它將被剪裁為零粤策,否則將使用NumPy執(zhí)行模數(shù)運算
#簡短答案是樟澜,如果在計算梯度幅度圖像時不使用浮點數(shù)據(jù)類型,則會錯過邊緣叮盘,特別是白色到黑色的過渡
lap = np.uint8(np.absolute(lap))
# 為了確保捕捉所有的邊緣秩贰,使用浮點數(shù)據(jù)類型,然后獲取梯度圖像的絕對值柔吼,并將其轉(zhuǎn)換回8位無符號整數(shù)
cv2.imshow("Laplacian",lap)

sobelX = cv2.Sobel(image, cv2.CV_64F,1,0)  #1,0表示x方向 
sobelY = cv2.Sobel(image, cv2.CV_64F,0,1)  #0,1表示y方向 

sobelX = np.uint8(np.absolute(sobelX))
sobelY = np.uint8(np.absolute(sobelY))

sobelCombined = cv2.bitwise_or(sobelX,sobelY)

cv2.imshow("sobel X ",sobelX)
cv2.imshow("sobel Y ",sobelY)
cv2.imshow("sobel Combined ",sobelCombined)
cv2.waitKey(0)
圖·3

二毒费、Canny 邊緣檢測:

Canny邊緣檢測器是一個多步驟的過程。它涉及模糊圖像以消除噪聲愈魏,在x和y方向上計算Sobel梯度圖像觅玻,抑制邊緣,最后是確定像素是否“邊緣狀”的滯后閾值階段培漏。

原理

Canny 邊緣檢測是一種非常流行的邊緣檢測算法溪厘,是John F.Canny 在1986 年提出的。它是一個有很多步構(gòu)成的算法牌柄,我們接下來會逐步介紹畸悬。

噪聲去除

由于邊緣檢測很容易受到噪聲影響,所以第一步是使用5x5 的高斯濾波器去除噪聲珊佣,這個前面我們已經(jīng)學(xué)過了蹋宦。

計算圖像梯度

對平滑后的圖像使用Sobel 算子計算水平方向和豎直方向的一階導(dǎo)數(shù)(圖像梯度)(Gx 和Gy)。根據(jù)得到的這兩幅梯度圖(Gx 和Gy)找到邊界的梯度和方向咒锻,公式如下:

圖·4

梯度的方向一般總是與邊界垂直冷冗。梯度方向被歸為四類:垂直,水平惑艇,和兩個對角線蒿辙。

非極大值抑制

在獲得梯度的方向和大小之后,應(yīng)該對整幅圖像做一個掃描,去除那些非
邊界上的點须板。對每一個像素進(jìn)行檢查碰镜,看這個點的梯度是不是周圍具有相同梯
度方向的點中最大的。如下圖所示:


圖·5

現(xiàn)在你得到的是一個包含“窄邊界”的二值圖像习瑰。

滯后閾值

現(xiàn)在要確定那些邊界才是真正的邊界。這時我們需要設(shè)置兩個閾值:
minVal 和maxVal秽荤。當(dāng)圖像的灰度梯度高于maxVal 時被認(rèn)為是真的邊界甜奄,
那些低于minVal 的邊界會被拋棄。如果介于兩者之間的話窃款,就要看這個點是
否與某個被確定為真正的邊界點相連课兄,如果是就認(rèn)為它也是邊界點,如果不是
就拋棄晨继。如下圖:

圖·6

A 高于閾值maxVal 所以是真正的邊界點烟阐,C 雖然低于maxVal 但高于
minVal 并且與A 相連,所以也被認(rèn)為是真正的邊界點紊扬。而B 就會被拋棄蜒茄,因
為他不僅低于maxVal 而且不與真正的邊界點相連。所以選擇合適的maxVal
和minVal 對于能否得到好的結(jié)果非常重要餐屎。
在這一步一些小的噪聲點也會被除去檀葛,因為我們假設(shè)邊界都是一些長的線
段。

OpenCV 中的Canny 邊界檢測

在OpenCV 中只需要一個函數(shù):cv2.Canny()腹缩,就可以完成以上幾步屿聋。
讓我們看如何使用這個函數(shù)。這個函數(shù)的第一個參數(shù)是輸入圖像藏鹊。第二和第三
個分別是minVal 和maxVal润讥。第三個參數(shù)設(shè)置用來計算圖像梯度的Sobel
卷積核的大小,默認(rèn)值為3盘寡。最后一個參數(shù)是L2gradient楚殿,它可以用來設(shè)定
求梯度大小的方程。如果設(shè)為True宴抚,就會使用我們上面提到過的方程勒魔,否則
使用方程:

[
圖·7

代替,默認(rèn)值為False菇曲。

import numpy as np
import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True,help = "Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.GaussianBlur(image, (5, 5), 0)
# 由于邊緣檢測很容易受到噪聲影響冠绢,所以第一步是使用5x5 的高斯濾波器
# 去除噪聲,通過在邊緣檢測之前應(yīng)用模糊,我們將幫助去除圖像中“我們不感興趣”的“嘈雜”邊緣
cv2.imshow("Blurred", image)

canny = cv2.Canny(image, 30, 150)
# cv2.Canny(image, minVal, maxVal)
# 當(dāng)圖像的灰度梯度高于maxVal 時被認(rèn)為是真的邊界常潮,
# 那些低于minVal 的邊界會被拋棄弟胀。如果介于兩者之間的話,就要看這個點是
# 否與某個被確定為真正的邊界點相連,如果是就認(rèn)為它也是邊界點孵户,如果不是
# 就拋棄萧朝。
cv2.imshow("Canny", canny)
cv2.waitKey(0)
圖·8

比智力更重要的往往是毅力。
更多文章請關(guān)注我的博客:https://harveyyeung.github.io

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夏哭,一起剝皮案震驚了整個濱河市检柬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竖配,老刑警劉巖何址,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機漏策,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偎血,“玉大人,你說我怎么就攤上這事盯漂∑溺瑁” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵宠能,是天一觀的道長亚隙。 經(jīng)常有香客問我,道長违崇,這世上最難降的妖魔是什么阿弃? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮羞延,結(jié)果婚禮上渣淳,老公的妹妹穿的比我還像新娘。我一直安慰自己伴箩,他們只是感情好入愧,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗤谚,像睡著了一般棺蛛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巩步,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天旁赊,我揣著相機與錄音,去河邊找鬼椅野。 笑死终畅,一個胖子當(dāng)著我的面吹牛籍胯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播离福,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼杖狼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妖爷?” 一聲冷哼從身側(cè)響起蝶涩,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎絮识,沒想到半個月后子寓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡笋除,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炸裆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垃它。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烹看,靈堂內(nèi)的尸體忽然破棺而出国拇,到底是詐尸還是另有隱情,我是刑警寧澤惯殊,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布酱吝,位于F島的核電站,受9級特大地震影響土思,放射性物質(zhì)發(fā)生泄漏务热。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一己儒、第九天 我趴在偏房一處隱蔽的房頂上張望崎岂。 院中可真熱鬧,春花似錦闪湾、人聲如沸冲甘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽江醇。三九已至,卻和暖如春何暇,著一層夾襖步出監(jiān)牢的瞬間陶夜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工赖晶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留律适,地道東北人辐烂。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像捂贿,于是被迫代替她去往敵國和親纠修。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 不同圖像灰度不同厂僧,邊界處一般會有明顯的邊緣扣草,利用此特征可以分割圖像。需要說明的是:邊緣和物體間的邊界并不等同颜屠,邊緣...
    大川無敵閱讀 13,868評論 0 29
  • 在圖像處理中經(jīng)常有一個需求就是要知道圖像中物體的邊緣辰妙,以此來做物體區(qū)分或作其他處理,有時還可實現(xiàn)某些濾鏡效果例如我...
    wosicuanqi閱讀 3,775評論 3 2
  • 前言 本文是關(guān)于OpenGL ES的系統(tǒng)性學(xué)習(xí)過程甫窟,記錄了自己在學(xué)習(xí)OpenGL ES時的收獲密浑。這篇文章的目標(biāo)是學(xué)...
    秦明Qinmin閱讀 3,918評論 1 13
  • 1、閾值分割 1.1 簡介 圖像閾值化分割是一種傳統(tǒng)的最常用的圖像分割方法粗井,因其實現(xiàn)簡單尔破、計算量小、性能較穩(wěn)定而成...
    木夜溯閱讀 22,594評論 9 15
  • 1 原理 Canny 邊緣檢測是一種非常流行的邊緣檢測算法浇衬,是 John F.Canny 在1986 年提出的懒构。它...
    Zoe_C閱讀 10,430評論 0 2