直方圖與直方圖均化
直方圖統計原理:
Bmp 圖片的存儲
,每一個圖元按照B、G、R三個通道順序存儲其顏色值,顏色範圍從0-255,表示每個通道顏色的深淺,對圖片的每一個圖元顏色進行直方統計,就可以知道圖片的顏色是較為明豔還是暗淡,有利於對圖像的優化處理。而一個圖元有3個顏色,每個顏色有256種可能,256^3種顏色組合是非常巨大的,而且也不夠直觀,為了避免麻煩,因此對3個通道分別進行長條圖統計。
直方圖統計方法:
宣告3個大小為256的陣列對圖像的每一個圖元進行顏色統計:
通過畫布畫出直方圖:
累積直方圖方法:
同理通過畫布畫出:
直方圖均化原理:
將每個圖元顏色通道的累積比例*255 ,g(x,
y) = cdf( f(x, y) ) * 255成為新的圖像的值,即可讓每一個顏色均分拉開成為一個長條圖,
長條圖均化方法:
由於圖片均勻的取色於區間(0-255),所以每一個長條圖都有傾向於均勻的分散的趨勢。
而基本上顏色數值都是在(0-255)之間均勻取值,在累積時,每一次都會累積差不多的個數,所以累積圖的增長是呈現線性增長的。
均化後的累計直方圖也成了有規律的三角形狀
顏色較為豔麗的圖片不適合做直方圖均化處理,而較為昏暗無光的圖片反而會有意想不到的效果:
存儲並打開處理後的圖像
因為讓圖片長條圖均化,均勻取色之後,顏色不會都集中在黑色部分,部分擴散到了接近白色,所以圖片在原本很灰暗的時候可以變的更清晰明亮一些。
介面設計:
為了方便觀看效果,弄成兩個視窗且不必切換
去除左邊的勾時可以隱藏該軌道的直方圖
TButton控制項使用:
按兩下控制項,和TmainMenu一樣直接編寫即可
TCombobox控制項使用:
按一下打開視窗
編輯下拉選項
編寫程式判斷:
void __fastcall TForm1::HistogramChange(TObject
*Sender)
{
if (ComboText == "Original_Histogram" && Image4->Picture!=NULL)
if (ComboText == "Original_Histogram" && Image4->Picture!=NULL)
tempImage->Picture = Image4->Picture;
else if(ComboText == "Now_Histogram"
&& Image2->Picture!=NULL)
tempImage->Picture = Image2->Picture;
}
TCheckbox控制項使用:
if(CheckBox1->State==cbChecked)
{
//如果打勾執行程式
}
else
{
//否則執行
}
因為這裡分為了長條圖和累積長條圖兩種,而checkbox只是判斷通道,所以先用Tcombobox選擇是長條圖還是累積長條圖,然後將計算的數值存在固定的陣列X[256],然後check打勾時,只用將X[256]在畫布上畫出就可以了。
沒有留言:
張貼留言