二值化圖像

二值化圖像就是將256個亮度等級的灰度圖像通過適當的閾值選取而獲得仍然可以反映圖像整體和局部特徵。

概述

將256個亮度等級的灰度圖像通過適當的閾值選取而獲得仍然可以反映圖像整體和局部特徵的二值化圖像。在數字圖像處理中,二值圖像占有非常重要的地位,首先,圖像的二值化有利於圖像的進一步處理,使圖像變得簡單,而且數據量減小,能凸顯出感興趣的目標的輪廓。其次,要進行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像。

所有灰度大於或等於閾值的像素被判定為屬於特定物體,其灰度值為255表示,否則這些像素點被排除在物體區域以外,灰度值為0,表示背景或者例外的物體區域。

原理

圖像的二值化處理就是將圖像上的點的灰度置為0或255,也就是將整個圖像呈現出明顯的黑白效果。即將256個亮度等級的灰度圖像通過適當的閾值選取而獲得仍然可以反映圖像整體和局部特徵的二值化圖像。在數字圖像處理中,二值圖像占有非常重要的地位,特別是在實用的圖像處理中,以二值圖像處理實現而構成的系統是很多的,要進行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像,這樣子有利於在對圖像做進一步處理時,圖像的集合性質只與像素值為0或255的點的位置有關,不再涉及像素的多級值,使處理變得簡單,而且數據的處理和壓縮量小。為了得到理想的二值圖像,一般採用封閉、連通的邊界定義不交疊的區域。所有灰度大於或等於閾值的像素被判定為屬於特定物體,其灰度值為255表示,否則這些像素點被排除在物體區域以外,灰度值為0,表示背景或者例外的物體區域。如果某特定物體在內部有均勻一致的灰度值,並且其處在一個具有其他等級灰度值的均勻背景下,使用閾值法就可以得到比較的分割效果。如果物體同背景的差別表現不在灰度值上(比如紋理不同),可以將這個差別特徵轉換為灰度的差別,然後利用閾值選取技術來分割該圖像。動態調節閾值實現圖像的二值化可動態觀察其分割圖像的具體結果。

形成方法

像素值法

該方法非常簡單,對RGB彩色圖像灰度化以後,掃描圖像的每個像素值,值小於127的將像素值設為0(黑色),值大於等於127的像素值設為255(白色)。該方法的好處是計算量少速度快。缺點更多首先閾值為127沒有任何理由可以解釋,其次完全不考慮圖像的像素分布情況與像素值特徵。可以說該方法是史最弱智的二值處理方法一點也不為過。

平均值法

最常見的二值處理方法是計算像素的平均值K,掃描圖像的每個像素值如像素值大於K像素值設為255(白色),值小於等於K像素值設為0(黑色)。該方法相比方法一,閾值的選取稍微有點智商,可以解釋。但是使用平均值作為二值化閾值同樣有個致命的缺點,可能導致部分對象像素或者背景像素丟失。二值化結果不能真實反映源圖像信息。

直方圖法

使用直方圖方法來尋找二值化閾值,直方圖是圖像的重要特質,直方圖方法選擇二值化閾值主要是發現圖像的兩個最高的峰,然後在閾值取值在兩個峰之間的峰谷最低處。該方法相對前面兩種方法而言稍微精準一點點。結果也更讓人可以接受。

實驗效果:

二值化圖像 二值化圖像
二值化圖像 二值化圖像

Means方法

使用近似一維Means方法尋找二值化閾值,該方法的大致步驟如下:

1.一個初始化閾值T,可以自己設定或者根據隨機方法生成。

2.根據閾值圖每個像素數據P(n,m)分為對象像素數據G1與背景像素數據G2。(n為行,m為列)

3.G1的平均值是m1, G2的平均值是m2

4.一個新的閾值T’ = (m1 + m2)/2

5.回到第二步,用新的閾值繼續分像素數據為對象與北京像素數據,繼續2~4步,直到計算出來的新閾值等於上一次閾值。

實驗效果:

二值化圖像 二值化圖像

OpenCV

OpenCV中有兩個函式可以實現圖片的二值化:

(1)cvThreshold( dst, dst,230 , 255, CV_THRESH_BINARY_INV);

(2)cvAdaptiveThreshold( dst, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY, 9, -10);

方法(1)是手動指定一個閾值,以此閾值來進行二值化處理。其中的第四個參數決定了該方法的結果:

threshold_type=CV_THRESH_BINARY:

dst(x,y) = max_value, if src(x,y)>threshold 0, otherwise.

threshold_type=CV_THRESH_BINARY_INV:

dst(x,y) = 0, if src(x,y)>threshold; dst(x,y) = max_value, otherwise.

threshold_type=CV_THRESH_TRUNC:

dst(x,y) = threshold, if src(x,y)>threshold; dst(x,y) = src(x,y), otherwise.

threshold_type=CV_THRESH_TOZERO:

dst(x,y) = src(x,y), if (x,y)>threshold ; dst(x,y) = 0, otherwise.

threshold_type=CV_THRESH_TOZERO_INV:

dst(x,y) = 0, if src(x,y)>threshold ; dst(x,y) = src(x,y), otherwise.

值得一說的是threshold_type可以使用CV_THRESH_OTSU類型,這樣該函式就會使用大律法OTSU得到的全局自適應閾值來進行二值化圖片,而參數中的threshold不再起 作用。比如:cvThreshold( dst, dst,300 , 255, CV_THRESH_OTSU | CV_THRESH_BINARY_INV);這種方法對於灰度直方圖呈現二峰特徵的圖片處理起來效果很好。

方法(2)是一個自適應閾值二值化方法,通過設定最後兩個參數來調整效果.

相關詞條

熱門詞條

聯絡我們