閾值分割 最大熵分割法

2021-07-04 01:22:04 字數 1600 閱讀 7316

最大熵分割法

現在主要用的熵演算法有 p 氏熵演算法,ksw 熵演算法、jm 熵演算法下面以經典的 ksw 熵演算法為例介紹其原理和計算過程。

ksw熵演算法

設分割閾值為設分割閾值為t,

t為的灰度分布,b為的灰度分布,則概率分布為:

定義函式φ(t)為h(t)和h(b)的和,則

求出φ(t)最大時的灰度級t即為所求的最佳閾值。

灰度直方圖的求法參見 

**如下:

#include #include #include using namespace cv;

float calc_entropy(cvhistogram *hist, int begin, int end)

float entropy = 0; // 熵

for(int i = begin; i < end; i++)

return entropy;

}int ksw_entropy(iplimage *img)

; float *ranges[1] = ;

int sizes = 256;

// 建立直方圖

cvhistogram *hist = cvcreatehist(1, &sizes, cv_hist_array, ranges, 1);

// 直方圖計算

cvcalchist(&img, hist, 0, 0);

// 直方圖歸一化

cvnormalizehist(hist, 1.0);

int threshold = 0;

float max_entropy = 0;

// 迴圈計算,得到做大熵以及分割閾值

for(int i = 0; i < sizes; i++) }

return threshold;

}int main(int argc, char **argv)

在學習獲取灰度直方圖的時候,有乙個函式讓我費解了半天,cvnormalizehist,灰度歸一化,剛開始就是搞不懂這個灰度歸一化是指的什麼,

opencv給出的函式解釋如下:

什麼叫the sum of the bins becomes equal to factor,好吧,後來明白了,其實意思就是說,把直方圖縱座標的值相加的和等於第二個引數,所以如果設為1的話,那縱座標的值就是該灰度級的概率了。

下面是實驗:

圖1  原圖                                          圖2   最大熵閾值分割後

效果很不理想吧,所以在做閾值分割前需要加入tophat,後面部落格會講到。

全文完。

閾值分割法

閾值分割法可以說是影象分割中的經典方法,它利用影象中要提取的目標與背景在灰度上的差異,通過設定閾值來把畫素級分成若干類,從而實現目標與背景的分離。一般流程 通過判斷影象中每乙個畫素點的特徵屬性是否滿足閾值的要求,來確定影象中的該畫素點是屬於目標區域還是背景區域,從而將一幅灰度影象轉換成二值影象。用數...

otsu閾值分割演算法原理 閾值分割 Otsu法

演算法實現 不呼叫函式 include include using namespace std using namespace cv 實現灰度直方圖的繪製 void drawpicture mat inpicture,mat outpicture ma hist const int bins 256...

二維最大熵閾值分割原理與opencv實現

近期在做影象處理灰階分割的研究,發現網上有很多將一維最大熵閾值分割的文章與程式 但是二維最大熵的資源相對較小。故本部落格的目的就在於此,在學習的過程中記錄相關筆記,以便幫助後面的研究者少走些彎路。希望與大家一起進步,共同提高。閾值化是影象分割中一種重要的技術。現有大多數方法都通過影象的一維灰度直方圖...