2011年1月7日 星期五

HW2

第二次作業,內容是進行HistogramEqualization,上面的圖,第一張為原圖,第二張為HistogramEqualization後的圖,可以看出圖片明顯的變亮,雖然看起來有點像海報放太久才會出現的顏色,左下的圖是HistogramChannel,後面看起來好像只有紅色,其實是有綠色跟藍色的,只是紅色比較高,把其他兩種色都蓋過去了。

這次的程式部份,需要計算的部份比較多了一些,不過老師上課講解的很清楚,所以在程式寫作上沒有遇到太大的問題,不過也不表示這次作業一帆風順,有些時候,一些不常注意到的小地方,往往是問題所在之處。

作業剛寫出來時,原本興高采烈的要進行第一次測試,沒想到出來的結果完全出乎我的意料之外,跑出了如下圖這樣詭異的圖片。
雖然隱約可以看到原圖的雛形,顏色卻完全跑掉,頓時心情跌到了谷底,於是我開始檢查我的程式碼,上上下下確認了好幾遍,也跟同學所寫的程式碼及老師的範例進行過比對,計算的部份並沒有問題,不斷的進行修改與測試,問題一直沒有改善,我開始有點慌了。
 
但是問題一定存在於某個地方,所以我決定先把程式暫時完全寫的跟老師一樣,連變數的名稱都寫的一樣,終於,跑出來的圖片結果正確了,但當時我還是不能理解錯誤發生在哪邊。
 
隔了兩三天,我突然想通了,老師的範例中,計算HistogramEqualization的地方,有使用一個iPixelNumber來存放圖片的imageHeight * imageWidth
這一整行是這樣寫:
bHistogramEqualizationTable[k][i] = (byte)((iCumulativeHistogram[k][i] * 255 / iPixelNumber) + 0.5);
 
而我寫的時候,我不想多用一個變數來存放imageHeight * imageWidth,所以我的這一行寫的是:
bHistogramEqualizationTable[k][i] = (byte)((iCumulativeHistogram[k][i] * 255 / iImageHeight * iImageWidth) + 0.5);
 
所有的問題就出現在這一行,當初我寫的時候覺得這樣寫很順,沒有問題,所以忽略了一個小地方,而這個小錯誤造成了整個圖片結果的錯誤,問題在於--我少加了括號,只是這樣而已。
 
正確的寫法應該是:
bHistogramEqualizationTable[k][i] = (byte)((iCumulativeHistogram[k][i] * 255 / (iImageHeight * iImageWidth)) + 0.5);
 
而因為我少加一個括號,所以運算時變成會先除以高度再乘上寬度,這樣算出來的結果當然會相差很多,想通了問題,當然讓人很開心,也給了我一次反省的機會,下次在檢查程式錯誤的時候,絕對不能放過任何一個小地方,就算自己覺得沒有問題,也要進行確認。

沒有留言:

張貼留言