昨天要做乙個最優二值化,原qr圖如下:
對其做最優二值化,即在其直方圖兩個灰度波峰之間的的波谷用來做二值化的閾值。也就是下圖中所示的小紅點。
在連續變數中可以用求導的方式來獲得波峰和波谷的位置,但是對於離散變數,要如何求這個小紅點的位置捏?
方法一:
可以設計這樣乙個檢測結構
用這個結構對直方圖上的灰度1~255進行檢測,如果左側的灰度值高於檢測點的灰度值,且右側的灰度值也高於檢測點的灰度值。那麼就說明檢測點所處的位置就是某乙個波谷了。
但是,這樣又出現了另乙個問題,直方圖波形中的毛刺會導致很多「虛波谷」的出現。
所以,在使用上述結構檢測之前,要先對直方圖波形進行平滑處理。
直方圖的平滑處理可以考慮這兩種方法。
在例子中,使用的是插值的方法。
插值以後,根據上面的檢測結構檢測波峰和波谷:
原圖:
紅色代表檢測到的波峰,綠色代表檢測到的波谷。
測試另一張圖:
測試標準qr圖 :
測試增加了灰度漸變的標準qr圖:
可以看出用這種方法找到的波峰波谷還是太多,不好尋找我們所希望的閾值t。
方法二:
求導。在已經平滑處理的直方圖上,進行求導處理。
定義直方圖的某點x的導數為:
由此,可以求得某一直方圖的導數圖,如圖:
可以觀察到,在導數圖中,兩個灰度聚集區中間會有一段導數值為0的較長區域。尋找閾值t將從此處入手。
統計導數圖(不包括首尾兩端導數值為0的區域)中,0區域的長度,選擇其中最長的一段的中點作為閾值的取值點。
效果如下圖所示:
但是,在測試這張圖的時候閾值的取值出現了很大偏差:
問題出在進行直方圖平滑處理時,把右半邊的直方圖內容給處理掉了。
區域性二值化 Sauvola二值化演算法
借鑑 原理 分塊處理,根據當前塊內的均值,方差等資訊得出區域性閾值 但擔心有突變,分塊不好怎麼辦呢?sauvola是一種考慮區域性均值亮度的影象二值化方法,以區域性均值為基準在根據標準差做些微調.演算法實現上一般用積分圖方法來實現的.步驟1 計算區域畫素積分和和積分平方和 步驟2 計算標準差,標準差...
OpenCV全域性二值化和區域性二值化原理
thresh otsu最適用於雙波峰。thresh 最適用於單個波峰。它是計算乙個閾值 臨界值 的演算法。先計算影象的灰度直方圖,假設灰度值的均值是130,稱這個均值為m,現在任意選取乙個灰度值t,則可以將直方圖分成前後倆部分,稱這倆部分分別為a和b,這倆部分各自的平均值成為ma和mb。a部分裡的畫...
二值化 二值化演算法之宇智波鼬
數字影象個人學習筆記 簡單二值化,純粹個人理解,或者論述如有錯誤請幫我指出!影象的深度如果是8bit,也就是能儲存0 255種不同數值,這就是常見的jpg格式的位數,也就是灰度級別。0表示黑色,255表示白色,值越大越亮。影象有rgb三個通道,rgb三個通道的取值都在0 255之間,根據色彩原理可以...