2016年12月2日 星期五

03360440曾郁凱HW02

作業內容 : 直方圖均化

這個作業可以分成幾個部分

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。
        
        

沒有留言:

張貼留言