問(wèn)題:我在提取圖像邊緣的時(shí)候蠢涝,首先對(duì)圖像進(jìn)行灰度變換派阱,之后進(jìn)行二值處理,最后進(jìn)行邊緣檢測(cè)得到邊緣圖像揩环。
但是在查閱資料的過(guò)程中我經(jīng)常發(fā)現(xiàn)很多人忽略二值化的步驟搔弄,直接進(jìn)行邊緣檢測(cè);還有很多人在實(shí)現(xiàn)某些功能的時(shí)候先進(jìn)行邊緣檢測(cè)之后再閾值分割丰滑,讓我感到非常迷惑顾犹,這篇文章旨在探求二者的關(guān)系。
首先要知道圖像二值化和邊緣檢測(cè)的目的褒墨。
圖像二值化
圖像的閾值處理一般使得圖像的像素值更單一炫刷、圖像更簡(jiǎn)單。閾值可以分為全局閾值和局部閾值郁妈,可以是單閾值也可以是多閾值浑玛。
圖像二值化是設(shè)置單閾值,為了將圖像中感興趣的像素分離出來(lái)作為前景像素噩咪,不感興趣的部分作為背景像素顾彰。
最簡(jiǎn)單的二值化操作是使用以下函數(shù):(這是全局化的閾值)
retval, dst = cv2.threshold(src, thresh, maxval, type)
- src:表示的是圖片源
- thresh:表示的是閾值(起始值)
- maxval:表示的是最大值
-
type:表示的是這里劃分的時(shí)候使用的是什么類型的算法
??cv2.THRESH_BINARY(黑白二值)
??cv2.THRESH_BINARY_INV(黑白二值反轉(zhuǎn))
??cv2.THRESH_TRUNC (得到的圖像為多像素值)
??cv2.THRESH_TOZERO
??cv2.THRESH_TOZERO_INV
上述的二值化處理是設(shè)置一個(gè)全局閾值,讓所有像素值與該閾值比較胃碾,下面還可以通過(guò)自適應(yīng)閾值實(shí)現(xiàn)圖像的二值化處理涨享。
自適應(yīng)閾值不需要確定一個(gè)固定的閾值,根據(jù)其對(duì)應(yīng)的自適應(yīng)方法仆百,通過(guò)圖像的局部特征自適應(yīng)的設(shè)定閾值厕隧,做出二值化處理。
自適應(yīng)閾值是一種局部閾值,要在圖像中確定一個(gè)區(qū)域吁讨,求出該區(qū)域內(nèi)的像素平均值帖族,再與閾值比較
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
adaptiveMethod - 指定計(jì)算閾值的方法。
??cv2.ADPTIVE_THRESH_MEAN_C:閾值取相鄰區(qū)域的平均值
??cv2.ADPTIVE_THRESH_GAUSSIAN_C:閾值取相鄰區(qū)域的加權(quán)和挡爵,權(quán)重為一個(gè)高斯窗口。
thresholdType - 和上面一樣
blockSize - 鄰域大猩蹩选(用來(lái)計(jì)算閾值的區(qū)域大胁杈椤),計(jì)算圖像的像素區(qū)域一般取3×3艰亮、5×5闭翩、7×7.....
C - 常數(shù),閾值等于平均值或者加權(quán)平均值減去這個(gè)常數(shù)迄埃。該參數(shù)用于微調(diào)閾值疗韵,可以為負(fù)數(shù)
還有一種非常多人提及的方法——Otsu’s 二值化,這種方法下次再記錄侄非。
邊緣檢測(cè)
要對(duì)圖像進(jìn)行邊緣檢測(cè)蕉汪,首先對(duì)圖像進(jìn)行灰度變換,使圖像只包含一個(gè)通道的信息逞怨,然后比較各相鄰像素間的亮度差別者疤,亮度產(chǎn)生突變的地方就是邊緣像素,將這些邊緣像素點(diǎn)連接到一起就形成了邊緣圖像叠赦。
那么首先要知道如何檢測(cè)出邊緣:
邊緣有方向和幅值兩個(gè)要素驹马,通常對(duì)圖像相鄰域像素求取梯度來(lái)描述和檢測(cè)邊緣。
為何要求梯度除秀?
圖像梯度是對(duì)多個(gè)方向分別求偏導(dǎo)得到的導(dǎo)數(shù)組糯累。比如下圖是亮度在x方向上變化,在y方向上沒有變化册踩,所以此時(shí)只需對(duì)x求偏導(dǎo)泳姐,該處關(guān)于y的偏導(dǎo)為0。
同樣圖像的亮度在y軸變化時(shí)棍好,x方向的偏導(dǎo)為0仗岸。
一般圖像的亮度不會(huì)只在一個(gè)方向變化,尤其是出現(xiàn)邊緣信息的時(shí)候借笙。這時(shí)對(duì)x方向和y方向分別求偏導(dǎo)就可以得到圖像的梯度信息扒怖。
我們知道,當(dāng)一個(gè)函數(shù)在某處變化大的時(shí)候业稼,它的導(dǎo)數(shù)在該處得到極值盗痒。
可以看到,圖像由亮變暗時(shí)函數(shù)陡然下降,導(dǎo)數(shù)得到極小值俯邓,由暗變亮?xí)r函數(shù)又陡然上升骡楼,導(dǎo)數(shù)得到極大值,接下來(lái)只要找到導(dǎo)數(shù)的峰值就行稽鞭。
這里主要了解Canny邊緣檢測(cè)算法鸟整。
Canny算子首先對(duì)圖像進(jìn)行平滑濾波,濾除圖像的噪聲以減少噪聲對(duì)圖像邊緣檢測(cè)的干擾朦蕴。
下面這兩篇文章對(duì)Canny算子的介紹非常清晰篮条,在此附上鏈接以供學(xué)習(xí)。
https://www.cnblogs.com/techyan1990/p/7291771.html
https://www.cnblogs.com/wjy-lulu/p/6672871.html?utm_source=itdadao&utm_medium=referral
在進(jìn)行邊緣檢測(cè)之前至少要將圖像灰度化吩抓,因?yàn)樘荻冗\(yùn)算并不能反映色彩的變化差異涉茧,所以轉(zhuǎn)換成只有一種顏色通道的灰度圖像能夠更好地進(jìn)行邊緣檢測(cè)。
深入了解過(guò)圖像二值化和邊緣檢測(cè)之后疹娶,我認(rèn)為既可以直接使用灰度圖像進(jìn)行邊緣檢測(cè)伴栓,也可以二值化之后再進(jìn)行邊緣檢測(cè),二值化的目的是進(jìn)一步簡(jiǎn)化灰度圖像雨饺,使圖像中的信息更加純粹钳垮,邊緣亮度變化更加明顯。如果閾值選的較好還可以濾除不需要的弱邊緣沛膳,使邊緣處理后的圖像輪廓更加清晰扔枫。
還有一種方法是先進(jìn)行邊緣檢測(cè),再二值化锹安,這種情況一般適用于:
想得到二值化圖像短荐,但由于原圖出現(xiàn)光照不均、前景和背景灰度差別很小等情況叹哭,我們不能直接得到完整的目標(biāo)忍宋,這時(shí)就可以利用邊緣檢測(cè)對(duì)光線變化的不敏感性,先對(duì)圖像作邊緣檢測(cè)风罩,檢測(cè)出我們想要進(jìn)一步研究的目標(biāo)輪廓糠排,然后再根據(jù)只有邊緣的圖像,求出原圖像所有邊緣點(diǎn)的像素平均值超升,將該值作為閾值對(duì)原圖像進(jìn)行二值處理入宦,就能很好得獲得目標(biāo)區(qū)域,并且目標(biāo)區(qū)域的連通性也很好室琢。
筆者剛剛開始學(xué)習(xí)圖像處理與計(jì)算機(jī)視覺乾闰,可能會(huì)出現(xiàn)許多錯(cuò)誤,歡迎各位提出改進(jìn)意見盈滴!