2010年1月7日 星期四

HW6

這次的作業是做一個空間濾波器

我做得是一個3*3的濾波遮罩

運算方式是將圖片(1,1)這個點為中心的3*3正方形與遮罩器做運算後的運算結果

放置新圖片(1,1)的點上,然後往右遮罩

(Mask1*(0,0) + Mask2*(0,1) + Mask3*(0,2) +

Mask4*(1,0) + Mask5*(1,1) + Mask6*(1,2) +

Mask7*(2,0) + Mask8*(2,1) + Mask9*(2,2) ) /Sum(Mask)

這是第一次遮罩的運算

上述座標為圖片的座標點

運算出結果後,將結果放置新圖片(1,1)這點上,後將遮罩器右移 成

(Mask1*(0,1) + Mask2*(0,2) + Mask3*(0,3) +

Mask4*(1,1) + Mask5*(1,2) + Mask6*(1,3) +

Mask7*(2,1) + Mask8*(2,2) + Mask9*(2,3) ) /Sum(Mask)

運算結果放置新圖片(1,2)的點上....

以此類推將整張圖片掃過。

此方法由(1,1)開始放入像素點,所以圖的四個邊緣,會因沒有放入數值,而呈現白色狀態.
以下為成果照片...




遮罩後,與原圖的差異性不大,但仔細看後,還是會有稍微的不同...

2009hw4

這次的作業是做gammar值的轉換
利用不同的gammar值調整對比明暗度
找出圖片色彩的最大值和最小值,經由調整過後,將值落在0~255之間。
藉由調整影像色彩來改變圖的對比。

公式為: 255/255^g=s/r^g
r為原本的色彩
s為調整後的色彩
g為gammar值

當gammar值等於1時,是原本的圖
當gammar值小於1時,亮度就會變亮
當gammar值大於1時,亮度就會變暗

程式方面流程是先轉換值後,原本的圖再根據值來輸出後來的圖片。

結果:
gammar=1,原本的圖
gammar=0.5,顏色變淡變亮
gammar=2,顏色變深變暗
寫作業時
本來都會直接複製老師的程式
想要看看結果是什麼
可是因為都不是完全的程式
所以都會有地方要改
後來覺得要自已了解程式的意思才能寫出來
都要一直請教同學
很不好意思但也很謝謝他們。

---------------------------------------
在寫程式時
有一個錯誤的訊息是
E2034 Cannot convert'AnsiString' to 'float'
後來加上StrToFloat這個函數就好了
之後寫程式時也常遇到這個訊息= =

---------------------------------------
記得在寫公式的時候
寫了GA[i]=(i^g)*255/255^g;
程式是之前寫的
錯誤訊息沒有留住
大概是說illegal之類的
後來問同學才知道程式不是用"^"的方式
要用pow函式
所以要寫成GA[i]=(pow(i,g)*255/pow(255,g));
這樣才會過

hw4

這次的作業是GAMMA的轉換

底下的值是0.1

顯然顏色比較淺


再來轉換的值是0.8

這就跟原圖差不了多少



最後發現了一個問題

就是有時候畫面會被切掉有時候又不會

像第一個圖就有畫面被切割到的問題

不知道是哪裡出了問題

HW6

這次作業是空間濾波器的實作
老師這次有給範例
慢慢看完後 再翻翻課本
原來濾波器技術 就是設定一個大小遮罩
經過運算的到新的像素




我們是用3*3鄰域的線性率波技術
方法是取每一位置像素
再乘上輸入值得加總*1/9 (因為是3*3)

iMask[0]*bPtrOriginalImage0[iChannelNumber*(j-1)+k]
+ iMask[1]*bPtrOriginalImage0[iChannelNumber*j+k]
+ iMask[2]*bPtrOriginalImage0[iChannelNumber*(j+1)+k]
+ iMask[3]*bPtrOriginalImage1[iChannelNumber*(j-1)+k]
+ iMask[4]*bPtrOriginalImage1[iChannelNumber*j+k]
+ iMask[5]*bPtrOriginalImage1[iChannelNumber*(j+1)+k]
+ iMask[6]*bPtrOriginalImage2[iChannelNumber*(j-1)+k]
+ iMask[7]*bPtrOriginalImage2[iChannelNumber*j+k]
+ iMask[8]*bPtrOriginalImage2[iChannelNumber*(j+1)+k]
)/iMaskWA + 0.5);


程式方面是蠻簡單的
不過輸入權重後
輸出的圖片我還是真的看不出差異在哪
再翻了翻課本
應該是跨越的領率很小很小
差異性就不是很大




彩色圖片

灰階圖片




這就是平滑處理
讓圖片達到柔和&模糊的效果

HW4

這次的作業,就類似於明暗度、對比的調整
其實就只是把圖片的RGB值套入
s=c*r^gamma 這個公式中,
其中c=255.0/255^gamma
  r=原本的色彩
  s=調整後的色彩
所以當gamma=1時,所得到的結果是不會變的
gamma>1 (調暗);gamma<1(調淺)
利用c=255.0/255^gamma公式,
可以把調整後的色彩控制在0~255之間

當gamma>1時  gamma=2

這裡可以發現,原本不是很清楚的睫毛,因為對比增加了之後,睫毛就變成清晰可見

當gamma<1時  gamma=0.5

感覺像是被打了spa light...喬巴也可以有粉嫩的肌膚(誤)

HW6 - 空間濾波器。

這次作業是利用Spatial filter的技術,將圖片的每個像素點,與周圍的像素點做加權運算後平均,來獲得圖像可以均勻化的效果,在程式碼的方面,要將一個像素點的RBG都截取出來,與周圍的8個像素點的RBG分別做加權運算,然後平均值在給中間的那個點。

在程式碼方面,使用兩個FOR迴圈把整個圖片的像素點全部掃過一遍,然後使用[i-1][i][i+1]代表九宮格的高以及[j-1][j][j+1]來代表九宮格的寬,但是每個像素有RBG3個要計算,所以要將J乘以3來別計算RBG的數值,然後再將九宮格的RBG數值分別將其像素點的加權做相乘後在相加,然後再除以總加權數,再放入[i][j]的點。

加權1
加權1
加權提高
灰階

2010年1月6日 星期三

HW6

這次做的是filter運用



分別有兩個

1.平滑化
(filter範圍內的值分別乘以filter範圍內的色彩值後相加)/filter值的和。

PS. filter值的和不為0

EX:以3*3來說,這9個座標內的色彩值相加/9,再把值傳回。
1,1,1
1,1,1
1,1,1

簡單說就是中心點+8近鄰去平均再傳回,所以值會被周圍色彩值影響變的較為平滑。


===========================================================
原圖





===========================================================
5*5

1,1,1,1,1
1,1,1,1,1
1,1,1,1,1
1,1,1,1,1
1,1,1,1,1






___________________________________________________________


2.銳利化
這邊Filter跟前面其實很像

(filter範圍內的值分別乘以filter範圍內的色彩值後相加)

PS. filter內的值和要為0

不過要注意因為有負數,所以當抓取RGB色彩值時要轉成int再去做運算

當做完恭喜你,你已經做好了拉普拉斯轉換!!

不過這只是中心點與8近鄰差異量。

所以銳利化 = 中心點色彩值 + 常數C * 拉普拉斯(中心點與8近鄰差異量)。

常數C 為判斷加或減所以值為 +1 or -1 (看中心點為正就加,反之則減) 。

差點忘了!!由於它是屬於+ - 運算,所以可能小值減大值,或大值+大值,發生溢位。

所以要記得收斂到0~255(就超過255就給255,低於0就給0)。

所以公式就是 原圖+(拉普拉斯)

當拉普拉斯為正才顏色較深,反之為負較淺,所以就有銳利效果。

===========================================================

所以

0,-1, 0
-1, 4,-1
0,-1, 0

和

0, 1, 0
1,-4, 1
0, 1, 0

是一樣低





===========================================================

-1,-1,-1
-1, 8,-1
-1,-1,-1

和

1, 1, 1
1,-8, 1
1, 1, 1




由此兩張圖可知,受越多鄰近影響,銳利化程度越明顯。


===========================================================


下圖就貼一下有程式低~~證實




貼一張5*5低

-1,-1,-1,-1,-1
-1,-1,-1,-1,-1
-1,-1,24,-1,-1
-1,-1,-1,-1,-1
-1,-1,-1,-1,-1






補充:

至於為啥轉換過後的圖都有一層白框,

那是因為我們用ScanLine,把它當二維陣列中的一維

3*3
ScanLine[i-1]
ScanLine[ i ]
ScanLine[i+1]

5*5
ScanLine[i-2]
ScanLine[i-1]
ScanLine[ i ]
ScanLine[i+1]
ScanLine[i+2]

而ScanLine[?]------------> ?=0

所以起始位置以3*3來說(1,1)開始填,5*5的話就是(2,2)。

HW6 - Spatial Filter Implementation

沒想到這次的作業是在課堂上要完成的,那沒去的結果就是只好再次自己慢慢研究囉.
先啃完老師的程式碼後,深深了解到,寫程式真的要有做註解的習慣.
幸好老師都有作註解,不然要看懂老師的code可真的有點難度.

再翻了一下課本,空間濾波器就是利用遮罩的方式,
將每個需要處理的pixel加上周圍的8個pixels除以9之後,當作新的pixel值.

這是處理彩色圖片的結果:

















再來是處理灰階圖片:


















以上.

hw6

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

1.平滑化

就是中心點+8近鄰去平均再傳回,所以值會被周圍色彩值影響變的較為平滑。

(filter範圍內的值分別乘以filter範圍內的色彩值後相加)/filter值的和。

PS. filter值的和不為0

原圖:

3*3

1 1 1
1 1 1
1 1 1

結果:

2.銳利化

其實就是把前面所輸入的值改成總合為0,當抓取RGB色彩值時要轉成int再去做運算,

由於它是屬於+ - 運算,所以可能小值減大值,或大值+大值,發生溢位。

所以要記得收斂到0~255(就超過255就給255,低於0就給0)。

(filter範圍內的值分別乘以filter範圍內的色彩值後相加)

PS. filter內的值和要為0

3*3

-1,-1,-1
-1, 8,-1
-1,-1,-1

結果:


HW5 - 位元切平面

這個程式研究很久,一直搞不懂他該如何做運算,後來知道一個圖片中8個BIT,會有8種不同的切面,而作業是要將像素質跟切面值相同的就將他設為黑色,不同的就設為白色,所以在程式碼中,將像素質用ScanLine讀出來,跟切面值做AND運算,如果等於切面值,就將他的值設為255,如果不同將其值設為0。如此以來,像素值就會變成有此切面數值的,會變成黑色,沒有的會變成白色,然後彩色的圖讀進來後,卻變成黑白圖,所以將變術改成RGB三種分別去做運算,如此以來彩色的圖就可以顯示出彩色的像素。

彩色第六位元平面
第八位元平面

第七位元平面

第六位元平面

第五位元平面

第四位元平面
第三位元平面

第二位元平面

第一位元平面