2011年1月7日 星期五

HW2

我本身看了老師的程式之後,就差不多知道怎麼寫了。直方圖統計的流程就是:
1.初始化儲存資料的變數
2.取得原始資料的RGB值
3.R,G,B著色
4.調整位置
過程中,我遇到最大的問題應該是調整位置的地方,因為一開始出現的圖只有一部分,我以為我寫錯了,可是沒有想到我是對的,只是直方圖太大,所以我就用
Image->Height*(1.0-(float)t/(float)max),取得最高的RGB直之後把他依照比例縮小。另外,就是要用float,因為我之前傻傻的用int(因為小數0.xxx都會變成0,所以直方圖會沒有東西),結果debug超久。

以下是直方圖統計:
code:

for (int k=0;k<3;k++)>
for (int i=0;i<256;i++)
{
iHistogram[k][i]=0;
iCumulativeHistogram[k][i]=0;
}

for(int i=0;iHeight;i++)
{
byte *row = new byte[1];
row = (byte*)Image1->Picture->Bitmap->ScanLine[i];
for(int j=0;j
Width;j++)
{
for(int k=0;k<3;k++)>
{
iHistogram[k][row[j*3+k]]++;
}
}
}

Image3->Canvas->Pen->Color = clRed;
Image4->Canvas->Pen->Color = clGreen;
Image5->Canvas->Pen->Color = clBlue;

for (int i=0;i<256;i++)
{
int tR = int(( float(iHistogram[2][i]) * fHistogramScalar ) + 0.5);
Image3->Canvas->MoveTo(Image3->Width*((double)i/256),Image3->Height);
Image3->Canvas->LineTo(Image3->Width*((double)i/256),Image3->Height*(1.0-(float)tR/(float)maxR));

int tG = int(( float(iHistogram[1][i]) * fHistogramScalar ) + 0.5);
Image4->Canvas->MoveTo(Image4->Width*((double)i/256),Image4->Height);
Image4->Canvas->LineTo(Image4->Width*((double)i/256),Image4->Height*(1.0-(float)tG/(float)maxG));

int tB = int(( float(iHistogram[0][i]) * fHistogramScalar ) + 0.5);
Image5->Canvas->MoveTo(Image5->Width*((double)i/256),Image5->Height);
Image5->Canvas->LineTo(Image5->Width*((double)i/256),Image5->Height*(1.0-(float)tB/(float)maxB));
}
------------------------------------*

接著是直方圖均化,
主要就是要把bHistogramEqualizationTable跟灰階調色盤給弄好,
其實看了老師的範例程式,很簡單就弄出來了。
只是我就在想了直方圖均化到底在做什麼阿!?
我其實本來沒有太具體的感覺,就覺得只是增加對比,
後來我很無聊的把Histogram Equalization拿去google,
在wiki找到比較具體能讓我了解。
後來把均化後的圖 再做一個直方圖統計。
本來很擠的直方圖統計,突然整個均等的分佈了
(可以跟剛剛原圖的直方圖統計,很明顯的均化了)。




沒有留言:

張貼留言