學習DIP第52天
轉載請標明本文出處:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的勞動,轉載請標明出處!文章代碼已托管,歡迎共同開發(fā):https://github.com/Tony-Tan/DIPpro
好久沒寫博客了,已然不熟練了,過完年全部人都不好了,哈哈,到剛才為止算是把圖象分割學習了1下,這兩天把學習結果和代碼簡單總結1下。
前面已介紹了邊沿檢測,和邊沿修復,閾值處理的基本概念也進行了1定介紹。閾值處理速度快,算法簡單,所以利用比較廣泛,算法的基本問題在于計算出閾值處理的閾值,在接下來的幾篇我可,介紹幾種肯定閾值的算法,基本數(shù)學知識都來自統(tǒng)計學,包括最簡單的平均數(shù),p-分位數(shù),方差等數(shù)學知識。
下面就從最簡單的均值閾值開始介紹。
均值處理屬于閾值中最簡單的1種,其使用的1副圖象所有灰度的均值作為閾值,分割圖象。
根據(jù)統(tǒng)計學知識,求均值可使用幾率方法:
1. 計算圖象灰度直方圖
2. 歸1化直方圖,得出直方圖每項的幾率
3. 直方圖的橫坐標與幾率的成績?nèi)缓笄蠛?
根據(jù)以上均值得到閾值,然后根據(jù)閾值處理基本公示處理整幅圖象。
/*********************************************************************************/
/*********************************************************************************/
////計算從start到end的直方圖的平均值,hist未歸1化
double getMeaninHist(int start,int end,int *hist){
int hist_count=0;
double hist_value=0;
for(int i=start;i<end;i++){
hist_count+=hist[i];
hist_value+=(double)hist[i]*i;
}
return hist_value/(double)hist_count;
}
/*********************************************************************************/
/*********************************************************************************/
//均值法求閾值
//閾值等于全圖的像素的平均值
void MeanThreshold(double *src,double *dst,int width,int height,int type){
int hist[GRAY_LEVEL];
double threshold_value=0.0;
InitHistogram(hist);
setHistogram(src, hist, width,height);
threshold_value=getMeaninHist(0, GRAY_LEVEL, hist);
Threshold(src,dst, width, height, threshold_value,type);
}
視察1下結果:
原圖:
原圖直方圖:
平均閾值:
閾值處理結果:
原圖加入1%的高斯噪聲
未處理:
直方圖:
平均閾值:
閾值處理結果:
原圖加入5%的高斯噪聲
未處理:
直方圖:
平均閾值:
閾值處理結果:
原圖加入7%的高斯噪聲
未處理:
直方圖:
平均閾值:
閾值處理結果:
lena圖均值閾值處理:
原圖:
處理后結果:
閾值:
均值閾值可以完成1些較為簡單的的處理,但對目標與背景的大小敏感,也就是直方圖那兩個峰的面積大小有關,如果這兩個峰相對大小相差不多,那末均值相對效果較好,如果兩個峰相差太多,也就是背景比目標大很多或相反目標比背景大很多時,結果失效。其次也遭到噪聲影響,但沒有上1因素影響大。