二值化算法OTSU源碼解析
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
本文中小編將會(huì)跟大家分享一下OpenCV3.1.0中圖像二值化算法OTSU的基本原理與源代碼解析,最終還通過幾行代碼演示了一下如何使用OTSU算法API實(shí)現(xiàn)圖像二值化。
該方法是圖像二值化處理常見方法之一,在Matlab與OpenCV中均有實(shí)現(xiàn)。OTSU閾值方法是一種基于尋找合適閾值實(shí)現(xiàn)二值化的方法,其最重要的部分是尋找圖像二值化閾值,然后根據(jù)閾值將圖像分為前景(白色)或者背景(黑色)。假設(shè)有6x6的灰度圖像,其像素?cái)?shù)據(jù)及其對(duì)應(yīng)的直方圖如下圖:

閾值尋找方法首先假設(shè)是為T=3,則背景像素的比重、均值、方差的計(jì)算結(jié)果如下:


然后使用上述計(jì)算結(jié)果,計(jì)算類內(nèi)方差:

上述整個(gè)計(jì)算步驟與結(jié)果是假設(shè)閾值T=3時(shí)候的結(jié)果,同樣計(jì)算假設(shè)閾值為T=0、T=1、T=2、T=4、T=5的類內(nèi)方差,比較類內(nèi)方差之間的值,最小類內(nèi)方差使用的閾值T即為圖像二值化的閾值。
????? 上述是假設(shè)圖像灰度值級(jí)別為0~5六個(gè)值,實(shí)際中圖像灰度值取值范圍為0~255之間,所以要循環(huán)計(jì)算使用每個(gè)灰度值作為閾值,得到類內(nèi)方差,最終取最小類內(nèi)方差對(duì)應(yīng)的灰度值作為閾值實(shí)現(xiàn)圖像二值化即可。
OTSU的源代碼可以參見-modules/imgproc/src/thresh.cpp源文件接口,下面對(duì)其中關(guān)鍵部分做出說明如下:
首先建立直方圖的代碼如下:

尋找內(nèi)方差最小的閾值T的代碼實(shí)現(xiàn)如下

上述代碼主要功能是實(shí)現(xiàn)閾值尋找,多數(shù)人看到OpenCV源代碼都會(huì)對(duì)OTSU的原理產(chǎn)生懷疑,明明是尋找最大值啊,原因是這樣,最小的內(nèi)方差值還等價(jià)于兩類數(shù)據(jù)的最大方差,公式如下:

代碼計(jì)算總像素個(gè)數(shù)實(shí)現(xiàn)如下

這樣對(duì)照一下公式立刻就會(huì)讀懂OpenCV中的源代碼了。
使用OTSU算法實(shí)現(xiàn)圖像二值化,首先要把圖像從彩色圖像轉(zhuǎn)換為灰度圖像然后通過threshold函數(shù)指定二值化方法為THRESH_OTSU。具體的代碼調(diào)用演示如下:

運(yùn)行結(jié)果如下:

上圖左邊輸入RGB圖像,右邊是基于OTSU產(chǎn)生的二值圖像。從OpenCV圖像二值化方法OTSU代碼實(shí)現(xiàn)我們可以看出OpenCV在算法編碼實(shí)現(xiàn)環(huán)節(jié)都是從簡潔計(jì)算入手,考慮效率優(yōu)先。非常值得我們學(xué)習(xí)。
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

