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

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


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

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

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

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

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

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

運行結(jié)果如下:

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

