2014年10月21日 星期二

Color Histogram之Lenna的瞎琢磨

第二個作業:色彩直方圖(Color Histogram

首先採用Lenna作為測試圖
隨便科普下Lenna:
萊娜圖(Lenna)是指刊于1972年11月號《花花公子》(playboy)雜誌上的一張
躶體插圖照片的一部分,是一張大小為512x512像素的標準測試圖。
該圖在數位影像處理學習與研究中頗為知名!

(這裡特別註明是.bmp的圖檔,具體原因後面會提到)

有了素材就進入寫程式的部分
首先當然是讀檔


if (OpenPictureDialog1->Execute())

Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
主要用到這兩行程式就可以完成
當然這裡可以隨便記錄下圖檔的高度和寬度,
為了方便後面對圖像的修改和分析時的使用
(這裡要提到之前為什麼要用.bmp的檔案,
因為OpenPictureDialog這個元件只能讀取
.bmp,.tif,.ico等少數類型的檔案)

讀完檔就是畫Histogram(直方圖)的部分了


這裡要注意的是用
bPtrImageRow = (Byte *)Image1->Picture->Bitmap->ScanLine[j]
這行指令存取像素點中RGB的數值的時候
存入的順序不是RGB而是BGR


通過MoveTo 和 LineTo 劃出直方圖的線條
我通過三個陣列
iRED=(int*)malloc(n*sizeof(int));
iGREEN=(int*)malloc(n*sizeof(int));
iBLUE=(int*)malloc(n*sizeof(int));
將圖像中每個像素點RGB的值分別存入對應的RGB的陣列中
最後利用這三個陣列中的數據去畫直方圖


這裡比較讓我覺得麻煩的地方是
剛劃出的直方圖會超過圖像(image3元件)的高度
(你無法知道直方圖的最高處有多高,然後去配置元件的高度的屬性)
在一番琢磨后,發現可以通過求出最高點的值,
然後用每個點去除以它再乘上圖像元件設定的高度值
從而使得畫面變得豐滿而不會超過
Image3->Canvas->LineTo(l*2,255-(iBLUE[l]/(iBMAX/255)));


以上三張是通過按程序中對應的RGB的按鈕
所得到的Histogram
(會用到Image3->Picture->Assign(NULL);這個指令來清空畫面
以便畫新的圖像)


最後放上一張用photoshop cs6 分析的Histogram的圖像做對比

畫好了直方圖,就可以畫CDF了
CDF其實就是PDF的積分,
每個點的值是該點的pdf的值
加上前面所有點的pdf點的總和
icdfr[l]=icdfr[l-1]+iRED[l];

這次的作業讓我對color histogram (pdf,cdf)以及
像素的概念的理解更為深刻了

沒有留言:

張貼留言