資源簡介
基于直方圖的自適應二值化閾值,基于c#編寫。

代碼片段和文件信息
using?System;
using?System.Collections.Generic;
using?System.Windows.Forms;
public?static?class?Threshold
{
????///?
????///?基于灰度平均值的閾值
????///?
????///?灰度圖像的直方圖
????///?
????public?static?int?GetMeanThreshold(int[]?HistGram)
????{
????????int?Sum?=?0?Amount?=?0;
????????for?(int?Y?=?0;?Y?256;?Y++)
????????{
????????????Amount?+=?HistGram[Y];
????????????Sum?+=?Y?*?HistGram[Y];
????????}
????????return?Sum?/?Amount;
????}
????///?
????///?基于模糊集的黃式閾值算法
????///?http://www.ktl.elf.stuba.sk/study/vacso/Zadania-Cvicenia/Cvicenie_3/TimA2/Huang_E016529624.pdf
????///?
????///?灰度圖像的直方圖
????///?
????public?static?int?GetHuangFuzzyThreshold(int[]?HistGram)
????{
????????int?X?Y;
????????int?First?Last;
????????int?Threshold?=?-1;
????????double?BestEntropy?=?Double.MaxValue?Entropy;
????????//???找到第一個和最后一個非0的色階值
????????for?(First?=?0;?First?????????for?(Last?=?HistGram.Length?-?1;?Last?>?First?&&?HistGram[Last]?==?0;?Last--)?;
????????if?(First?==?Last)?return?First;????????????????//?圖像中只有一個顏色
????????if?(First?+?1?==?Last)?return?First;????????????//?圖像中只有二個顏色
????????//?計算累計直方圖以及對應的帶權重的累計直方圖
????????int[]?S?=?new?int[Last?+?1];
????????int[]?W?=?new?int[Last?+?1];????????????//?對于特大圖,此數組的保存數據可能會超出int的表示范圍,可以考慮用long類型來代替
????????S[0]?=?HistGram[0];
????????for?(Y?=?First?>?1???First?:?1;?Y?<=?Last;?Y++)
????????{
????????????S[Y]?=?S[Y?-?1]?+?HistGram[Y];
????????????W[Y]?=?W[Y?-?1]?+?Y?*?HistGram[Y];
????????}
????????//?建立公式(4)及(6)所用的查找表
????????double[]?Smu?=?new?double[Last?+?1?-?First];
????????for?(Y?=?1;?Y?????????{
????????????double?mu?=?1?/?(1?+?(double)Y?/?(Last?-?First));???????????????//?公式(4)
????????????Smu[Y]?=?-mu?*?Math.Log(mu)?-?(1?-?mu)?*?Math.Log(1?-?mu);??????//?公式(6)
????????}
????????//?迭代計算最佳閾值
????????for?(Y?=?First;?Y?<=?Last;?Y++)
????????{
????????????Entropy?=?0;
????????????int?mu?=?(int)Math.Round((double)W[Y]?/?S[Y]);?????????????//?公式17
????????????for?(X?=?First;?X?<=?Y;?X++)
????????????????Entropy?+=?Smu[Math.Abs(X?-?mu)]?*?HistGram[X];
????????????mu?=?(int)Math.Round((double)(W[Last]?-?W[Y])?/?(S[Last]?-?S[Y]));??//?公式18???????
????????????for?(X?=?Y?+?1;?X?<=?Last;?X++)
????????????????Entropy?+=?Smu[Math.Abs(X?-?mu)]?*?HistGram[X];???????//?公式8
????????????if?(BestEntropy?>?Entropy)
????????????{
????????????????BestEntropy?=?Entropy;??????//?取最小熵處為最佳閾值
????????????????Threshold?=?Y;
????????????}
????????}
????????return?Threshold;
????}
????///?
????///?基于谷底最小值的閾值
????///?此方法實用于具有明顯雙峰直方圖的圖像,其尋找雙峰的谷底作為閾值
????///?References:?
????///?J.?M.?S.?Prewitt?and?M.?L.?Mendelsohn?“The?analysis?of?cell?images“?in
????///?nnals?of?the?New?York?Academy?of?Sciences?vol.?128?pp.?1035-1053?1966.
????///?C.?A.?Gl
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????26822??2015-04-21?10:29??Threshold.cs
-----------?---------??----------?-----??----
????????????????26822????????????????????1
評論
共有 條評論