2010年1月6日 星期三

HW4







這次交的作業

乘冪律轉換(Gamma Correction)
(數值0.5)
Gamma要調整的,就是修訂真實影像顯示過程中產生的失真
基本公式:
s = c * r ^ γ
用在常常有照片模糊不清或是色彩不清晰
是很多影像軟體中用到的工具


這次寫才發現原來中間只是帶入公式即可
會基本的讀圖及輸出就好


2010年1月5日 星期二

HW4 Gamma correction

這次作業是將圖片載入後,利用Gamma轉換來做圖片的明暗度調整,其中Gamma的公式為s=c*r^y,,但是在做運算的時候,必須將公式變換,改成c=s/r^y,也就是將變數範圍255做成c=255/pow(255,gamma)的公式。

y=1.0


y=1.8

y=0.6
寫的過程中發現,當y值為0時,程式會Error,所以我使用 if(Edit2->Text!=0)才執行
來使他不會Error。

2010年1月4日 星期一

HW4 Gamma correction

我在搞笑了 這個作業我在課堂上就寫出來了 忘記上傳 這個作業還滿簡單的 一行轉換式:s=c*r^γ ,其中關鍵在於c,c表動態像素範圍調整後的constant,c=(調整範圍)/(調整範圍)*γ,在此調整範圍代表像素範圍故調整範圍=255,r則表示原來的像素值,γ為gamma值,s為轉換後的像素值,特別注意的是當c=γ=1時轉換前等於轉後,也就是說γ值由使用者輸入來控制強度,γ<1則會變強變亮,γ>1則會變暗,此次作業目的應該是在早期的CRT螢幕比較需要用到gamma校正,通常γ介於1.8~2.5之間,所以通常會偏暗(>1),藉由轉換後讓螢幕的亮度變亮變清楚,暗處地方也方便作觀察,如此推得最佳校正的γ值介於1/1.8~1/2.5也就是0.6~0.4之間,下面幾張圖為執行的結果,γ等於1不變,γ大於1取1.8跟2.5,果然比原圖黑很多,且從0.6~0.4之間可以明顯觀察到原本陰暗處的部分越來清楚,但小於0.4之後圖案卻變得有點輕微退色的感覺:

γ=1 不變

γ=2.5 很暗

γ=1.8 稍微變亮但還是比原圖暗

γ=0.6 可以開始觀察到原本暗處看不到的地方

γ=0.5 暗處可以看得更清楚

γ=0.4 暗處可以看到更多細節

γ=0.3 此時雖然可以看到更多細節 但卻有退色偏亮的感覺

γ=0.2 圖完全偏亮


HW6

本次的作業是空間濾波器(spatial filtering),把老師提供的範例程式作為修改就完成了。
雖然輸上的公式看起來很複雜,寫成程式後反而很簡單易懂了。

這此也順便把之前的作業程式作了統整。
依照老師所寫的直接存取記憶體位置後程式執行的較快些。


原圖:


濾波器一:

結果一:

濾波器二:

結果二:

從兩張透過不同的濾波器的結果可以看出當中間數值較周圍總和小時可得到較柔和的效果(結果一)。

HW6_空間濾波器

彩色&使用者自行輸入,成果圖↓









先新增老師的程式碼來了解,還沒改成自己得寫法↓

dollar的圖確定是8bits,彩色是24bits


















這次的作業對我來說應該是尚未完全

雖然在老師Blogger中的程式碼我直接拿來修改並增加功能不會出現問題
但是如果我使用自己的寫法,記憶體配置就會出現問題或是scanline超出範圍
一樣是使用指標在進行抓點配置空間…

原理不難…就是選擇一點之後抓附近的八個點進行濾波
增加的功能讓使用者自行輸入調整比重

我都會看大家的問題出現在哪邊所以比較快解決
前幾個交作業中有提到3個Channel的問題,bit數不同的關係

還在想辦法對自己的程式進行修改…|||

-----心得更新-----
關於8bit跟24bit的問題,是我在這門課上遇到最麻煩的吧…!

找尋各種資料來比對我得錯誤。
8bit為每一個pixel用8bit表示,24bit則為三倍…

再來就是因為在8bit也就是256色…需要使用調色盤參考
而24bit則不用使用調色盤…

當我要使用8bit時,Palette必須設為Pixelformat(
pf8bit

單一功能程式執行沒問題…
或許程式功力有差…
由於調色盤的使用讓我的程是很難整個去把它改寫
因為各種功能都整合在一起,如果調色盤轉變之後
讀圖
、畫圖的時候都必須一起改變
因為長度的不同,像素點抓的時候也必須改變
這樣才不會出現一開始心得中提到的問題…

2010年1月3日 星期日

HW6


原圖

這次作業還是和經過同學之間的討論後出來的 主要就是把老師範例中的 iChannelNumber改成3 就可以處理彩色圖片了 圖片經過空間濾波器轉換後 看起來似乎沒什麼差別

HW5_位元切面(Bit Planes)

(心得修正…發現自己太笨做了多餘的東西)

依照習慣先來個成果圖↓ 為了方便觀看,此版本是特別弄出8bits的切面












這次作業花了不少的時間,但是完成之後會發現原理其實很簡單。
基礎原理:
假設要呈現bit1,就是將該值跟1(二進位00000001)做&運算
     bit2,就是將該值跟2(二進位00000010)
     bit3,就是將該值跟4(二進位00000100)以此類推…

我遇到了幾個問題點是一開始我直接將灰階做&運算後,做出bit層次愈低的切面會愈來愈暗。
應該是因為灰階色彩明暗度有關係吧!?

後來我將運算改為以一個變數來計算儲存該bit的值(1,2,4,...,128)
然後在做取餘數的運算之後值只會剩下0或1
再乘255就只會有黑跟白兩種色
這樣呈現出來的結果就是上面的那張圖。

簡單的說就是抓像素點然後做我上面提到的運算就大功告成了,
但是其中疑問及方法需要思考一下。

另外一個問題就是bmp圖檔的問題,好像是會造成記憶體讀取的問題?
那時候花了點時間調整變數以為是重複讀取得關係…
這問題有同學說出來了就是要使用24位元的bmp格式…
在做完第六個作業後就更證明是自己功力不夠…
因為HW6老師的程式碼是可以跑8bit的,但我將程式碼修改還是沒辦法

接下來的問題是BCB元件中功能不熟悉造成的
if else用bit來判斷要不要進入執行我寫的運算
因為我ComboBox設定為1~8,pow運算會有誤差,必須調整為0~7
判定式為互斥,但是卻發現我的if似乎會進入但是else也會進入!

後來發現ComboBox指向的東西為ItemIndex是造成我判斷時候出錯的原因
Text是框裡的值,而ItemIndex是由0~7…

附上一張將彩色轉灰階之後做位元切面的圖及彩色的位元切面…

HW6 - 空間濾波器。

  這次的作業是空間濾波器的實作,要能由程式自行判斷處理灰階或彩色影像,而且使用者可以輸入濾波器的值。

  由於老師有公佈了範例程式碼,所以灰階圖片的空間濾波很快的就可以出來,卡比較久的地方是在彩色濾波器的部分。原本以為跟上個作業一樣直接把值拿出來處理就好,但突然想起上個作業是做灰階圖片的處理,不過經由上次的經驗,知道24bit的圖片每一列的像素排列為B1G1R1B2G2R2...,所以把原本灰階圖片的一個陣列的處理改為RGB三個陣列分別去做,如下所示:

1. 首先讓三個指標陣列都讀取影像的同一列起始位置
bPtrResultImage_B = (Byte *)Image2->Picture->Bitmap->ScanLine[i];
...

2. 接著,跑濾波器(套用原理)
如果我們要處理某點的B值位於j = 3,那麼G值就會在j = 4,而R值就會在j = 5,而要抓某點左邊那點的B值時就要在j = 3 - 3 = 0這格去抓,同理,如果需要右邊那格的B值,就要在j = 3 + 3 = 6這格去抓(因為BGR的排列...),其餘依此類推。

濾波器原理的部分就要看一下課本啦。以下為我的實作結果:

灰階圖片實作↓


彩色圖片實作↓


這邊再貼上原圖和儲存後的結果會比較清楚,如下:

灰階原圖↓


灰階圖片濾波後↓


彩色原圖↓


彩色圖片濾波後↓


PS.濾波後的圖片會出現一個白色外框,我想應該是因為最外圈的值有部分的鄰近值無法參考,所以最多只能做到圖片外框往內1格的部分。

2010年1月1日 星期五

HW5

這次是要完成位元平面 (bit-planes) 程式實作
因為8 bit 所以可以把圖切成8個平面
作業方法就是把像素用ScanLine讀出
和切面值做and運算
ucRMatrix[x][y] & 0x01 (0x01就是16位元 0000 0001 的意思)


如果與值相等就設為255
Image2->Canvas->Pixels[x][y] = TColor RGB(255,255,255); //白色


不同就設0
Image2->Canvas->Pixels[x][y] = TColor RGB(0,0,0); //黑色


再多寫幾個大概就完成了0x02,0x03.....0x08
--------------------------------1/19(補)
這個作業就是
由於圖片是由8-bit組成 現在我們就是要把這八張圖片拆開來顯示
也就是說 把像素點做& 運算
譬如說 像素點0111 1100

-------------
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000 & 0111 1100 (原圖像素值)
0010 0000
0100 0000
1000 0000

一開始也是大概知道這樣運算
一張圖的像素值也是8-bit
and運算應該是把它的1值取出來其他都為0
例如
0111 1100
0000 0001 ->第一位元
--------------
0000 0000 -->判斷0111 1100 的第一位元是否為1
所以才用and 不用or

這應該就是位元平面的原理
補充 ..
我在想原來像素值可以直接和數值做邏輯運算
沒有想過把像素值二進制化= =

第一位元平面:

第二位元平面:

第三位元平面:

第四位元平面:

第五位元平面:

第六位元平面:

第七位元平面:

第八位元平面:








HW4



這次作業是完成乘冪律(Gamma)轉換程式實作
主要還是套公式
s = c * r ^ γ
-----------------
s 是經過 gamma轉換後的值
c 與 r 都是正值常數
不過 r是由使用者輸入
只要會抓值帶入公式其實不是太困難
後來才發現c這個常數
是為了調整色彩值介於0-255之間
把圖片色彩值0-255 都丟回代公式完後的陣列
大概就完成了
gamma=1.5





gamma=2 眼神更深邃



---------------------------1/19(補)


這個作業是gamma校正
目的是讓影像對比度增加
雖然有公式可以套 S=C*R^Gamma
可是c不能設為1 , 但是又要把像素值設在0.255之間
一開始把c寫成1時 , 出來的有點糟糕 , 顏色根本亂掉
在寫之前 還有天真的想法
用 min(s,255) 這樣就0到255 ... 圖片變成很白

尤其是gamma超過3時
後來參考同學的 才知道c值 要套
c = 255/(255^Gamma)

把程式約分約一約就
int (pow(i,gamma)/pow(255,gamma-1));

也就是 i^gamma /255^(gamma-1)
這樣就顏色就不會亂了

另外還學到了StrToFloat(Edit1->Text)
因為有用到浮點數輸入(有小數點) 這是我中間有點小錯誤的地方
很多影像播放器都有對比度調整的功能
我想原理應該就是這樣子
可是為什麼套公式就可以增加對比度?(gamma>1)
應該是色彩值套公式後值增加 讓影像看起來
rgb值比原本的"差值"更多 (猜的)