2009年12月31日 星期四

HW4_Gamma校正

HW4:Gamma校正

首先是成果圖↓ 有Gamma值為2跟0.5圖






























補上對於這次作業所做的小資料,算是對於影像顯示的介紹


人眼對灰度變化的感覺比對色調變化的感覺來得敏銳

人眼對低亮度變化的感覺比對高亮度變化的感覺來得敏銳

而上述的第二項就是Gamma的緣由,也就是在較暗的影像時選擇較高的Gamma值,以犧牲亮部層次來換取更多的暗部表現

相對地,一些明亮的影像中就選擇較低的Gamma值以犧牲部分的暗部層次,來使得亮部層次更為明顯



由於之前的作業已經使用過抓像素點(其實是很久了…

Gamma整個運算部分 s = c * r^γ
這個部分在我剛開始了解Gamma的時候,就在想如何解決掉數值改變的問題…
後來我自己想到了一個錯誤的方法,是在跟朋友討論的時候用的
在開始寫程式前,我自己帶值來運算就發現出來的值還是有問題。
數學問題…數學太糟,不過已經解決了!

基本上會抓點改值再放回去就可以完成這個作業了(底子真的很重要阿…
由於整個程式我有一直做合併,所以很快就把Gamma校正完成,比HW3簡單很多。

最後是關於程式的部分
這個作業沒有什麼大問題,導致說不知道該如何報告這個作業?

簡單的介紹我對於這個作業如何去完成它
主要是分為三個部分:開啟圖檔、及抓取每一點、運算
開啟圖檔及動態宣告一個BCB所定義的Bmp來做運算其實算是基本
Graphics::TBitmap* BMP=new Graphics::TBitmap();

再來其實是運算優先,也就是把要如何運作及數值做調整後
最後將每一點抓取出來做運算後畫上去

其實也就是在做影像處理時會進行的操作


2009年12月29日 星期二

HW4

Gamma值轉換的作業
把給的公式帶入程式當中就可以了

可是有沒有發現我的圖很怪...
轉換出來後的圖
顏色確實有成功轉換了
不過圖片的大小
一直沒辦法跟原圖一樣
讀圖的範圍設定設為原來image圖的大小

真傷腦筋>"<
















這個作業在運算式的表達花了許多時間。
先將數值/255之後(直接Gamam進去數字太大),等作Gamma轉換完再乘回255
所以就先將原本,顏色值/255,做完Gamma在乘回255
想說就是亮度比會增大,讓原本暗的地方會變得清楚。
結果好像不太OK

之後才了要用 c=255/(pow(255,r)) 這樣的方式去作轉換
然後再將每個像素點作Gamma次方運算後乘上C
後來出來的圖就有達到原本的初衷。

2009年12月28日 星期一

HW6




這次的作業是空間濾波器,把範例程式改一下就好了
不過還是有遇到一些小問題,像有些圖片結果會被切掉
後來發現是圖片檔案位元深度的關係

HW5 - 逐段線性轉換函式(位元切平面)。

  又是費經千辛萬苦阿...終於給他寫出來了!!(小小抒發,馬上回歸正題吧~)

  這次的作業是把一張八位元灰階圖片的每個位元切平面顯示出來,我所使用的方法為,利用ScanLine[i]的方式把圖片每一列的第一個點的記憶體位址取出給一個型態為Byte的陣列指標當做起始位置,另一方面也宣告一個指標來接收你將來要顯示的圖片的起始記憶體位置,接著跑圖片的三倍寬度次數,利用記錄原始圖片值的陣列,把這一列上的每個點和某位元平面值做and運算,如果為該位元平面的點,就把用來顯示圖片的一維陣列對應位置的值設成255,如果不是的話就設成0。(這個部分不知道為什麼要跑圖片寬的三倍,我用原始圖片寬度時,只會出現1/3寬的圖片結果,等待高手指點。)

  以上就是整個程式中比較重要的部分,其它像是個位元平面的值,可能就要去網路上搜尋一下了。那麼現在就來展示一下實作成果:

開啟圖片↓


第一位元平面↓


第二位元平面↓


第三位元平面↓


第四位元平面↓


第五位元平面↓


第六位元平面↓


第七位元平面↓


第八位元平面↓


以上就是我的實作結果,下面提供程式內ScanLine的語法:
-----------------------------------------------------------------
Byte *Ptr;
Ptr = (Byte *)Image->Picture->Bitmap->ScanLine[Index];
-----------------------------------------------------------------

補充:
  後來為了解決上述的疑問,在網路上找到了一些資料,像是某個網站中所提到如果圖片為24bits的bmp圖片,那麼scanline所讀的那一列的pixel排列會為:

 B1 G1 R1 B2 G2 R2 ... Bn Gn Rn

如此排列,後來我去看了一下我的圖片格式,是為24bits的bmp圖片,因為當初使用小畫家存圖時,存成8bits的bmp圖片會失真,4bits也會,如下圖所示:

8bits bmp picture↓


4bits bmp picture↓


所以最後就把它存成24bits的格式了,這也就是為甚麼需要三倍寬度的原因。

2009年12月26日 星期六

HW6

這次作業是空間濾波器
有了老師給的範例程式碼
做起來輕鬆很多

不過宣告的部分有些沒有很懂
一開始還看很久...
後來才發現又是忘記小地方要加上*符號
每次都搞這種烏龍= =

內容的部分
從灰階到彩色比較要注意的地方應該是
bPtrResultImage[j] = (byte)((bPtrOriginalImage0[j-1]+bPtrOriginalImage0[j]+bPtrOriginalImage0[j+1] + bPtrOriginalImage1[j-1]+bPtrOriginalImage1[j]+bPtrOriginalImage1[j+1] + bPtrOriginalImage2[j-1]+bPtrOriginalImage2[j]+bPtrOriginalImage2[j+1])/9 + 0.5);
這一段的部分
因為灰階跟彩色圖的bit數不同
所以轉成彩色的時候要留意一下是三個Channel



2009年12月25日 星期五

HW03




這次的作業是把一張圖做RGB值的統計並用直方圖顯示出來
實作方式為利用一個二維陣列和選擇Channel的方式
去記錄RGB個別的值
後來參考了老師的程式
知道了可以使用MoveTo和LineTo畫線的長度
還有使用Image2->Canvas->Pen->Color去畫線的顏色
又看了老師關於之前直方圖均化的範例程式的這兩行
iImageHeight = imOriginal->Picture>Height;
iImageWidth = imOriginal->Picture->Width;
才知道原來多了這兩行
圖片才可以順利進行瀏覽
好不容易完成了這次的作業
有點小小的開心:)