作業內容 : 直方圖均化
這個作業可以分成幾個部分
1. 分別針對 BGR 三原色進行統計,製作影像直方圖
部分程式碼 :
for (j=0;j<iImageHeight;j++)
{
bPtrImageRow = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
for (i=0;i<iImageWidth;i++)
for (k=0;k<3;k++)
iHistogram[ k ][ bPtrImageRow[ i * 3 + k ] ]++;
}
2. 要了解畫筆(Pen)與刷筆(Brush)兩項元件,以便製作直方圖(Histogram)
重點 :
一單位 : (畫布高度) / (統計出的最大值)
要畫的長度 : 一單位 * (0~255統計的數量)
3. 將直方圖轉為累積直方圖
部分程式碼 :
for (j=1;j<256;j++)
{
for (k=0;k<3;k++)
{
iHistogram[ k ][ j ]+= iHistogram[ k ][ j - 1 ];
}
}
4. 直方圖均化
公式 =g(x, y) = cdf ( f(x, y) ) * 255
重點 :
新的色彩值 = ( (目前累積的量)/(累積最大值) ) * 255
部分程式碼 :
for (j=0;j<iImageHeight;j++)
{
bPtrImageRow = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
bPtrImageRow1 = (Byte *)Image8->Picture->Bitmap->ScanLine[j];
for (i=0;i<iImageWidth;i++)
{
bPtrImageRow1[3*i+0] = 新的色彩值[ [bPtrImageRow[3*i+0] ];
bPtrImageRow1[3*i+1] = 新的色彩值[ [bPtrImageRow[3*i+1] ];
bPtrImageRow1[3*i+2] = 新的色彩值[ [bPtrImageRow[3*i+2] ];
}
}
實驗結果 :
圖片1 . 原始影像
圖片2 . 原始影像之直方圖
圖片3 . 直方圖均化後之影像
圖片4 . 處理後之直方圖
心得 :
我們可以觀察到圖片1和圖片3之間的差異,處理後的影像明顯的影像亮度更平均 ,
而影像處理的程式通常都可以用幾個迴圈就達到目的,靠著其背後強大的演算法,
這次的作業也是靠著一個簡單的公式,就能將圖片做直方圖均化,寫完非常有成
就感,感覺能寫出功能簡單的Photoshop。
沒有留言:
張貼留言