顯示具有 95363035 劉立銓 標籤的文章。 顯示所有文章
顯示具有 95363035 劉立銓 標籤的文章。 顯示所有文章

2010年1月17日 星期日

HW7

第七個作業是梯度Sobel , 把一張圖做邊緣偵測 (應該就是把邊緣像素
的差距明顯化..我自己的解釋) , 跟上次作業其實很像, 只是一個要銳利化
一個要模糊化 ,實作的方法就是用兩個遮罩(一個對X方向偵測 , 一個是
對Y方向的偵測)
↓下面就是使用的兩個遮罩










有兩個公式可用

G = GX + GY

G = (GX^2 + GY^2)^1/2

一開始我用 sqrt [ pow(GX,2) + pow(GY,2) ]
以為作業很簡單 , 很容易就寫出來了XD
可是同學說run出來的結果很奇怪 , 出現雜亂的顏色














我還自作聰明的給他3次方, 最後出現sqrt error ... 後來才想到3次方會有
負值 , 不可以開根號 , 最後問同學才知道自己沒有把值限制在255之間 ,
才有很奇怪的顏色出現

↓下面是最後實作出來結果










黑白影像會更明顯










再來我用 G = abs(GX) + abs(GY)
依照數學原理來說 , 應該差值會更明顯 , 可是跑出來的結果幾乎完全相同?

2010年1月16日 星期六

HW8

在上老師的影像處理前
本來和林東磊一塊修影像處理的
想說可以一起上課,不會也可以一起討論
程式方面或者課程內容
想不到 被放鴿子 XD

第一次接觸老師所教的課程
發現老師的教學與一般的真的不太同
比起一般填鴨式的教學
把一層一層的程式範例塞給學生
老師的教學更重於自學與真正的理解

可能沒有點名的壓力
所以才沒有很高的出席率
有去也是遲到居多
還有沒有期末上機考的壓力
變的真的很不積極
能拖就拖

所教的程式都是看課本自己看
圖書館借bcb書來看
不會在請教同學幫忙解釋一下
寫的很辛苦
可能沒認真在課堂上
所付出的時間會比平常的多很多很多
這就是我修老師的課
所犯的缺點

最後一堂課 老師要求我們給老師的課程
給點意見與想法
我在這裡 只有一點點小小地看法
除了出席點名外
期末有上機考可能對同學來說有考試的壓力
才有學習的動力(像我就是這樣子)
期末來個範例程式的改寫
在計時算分數(大二修辛華勻時候就是如此)
這樣同學的程式能力一目了然
也許這樣會比叫好吧
最後..老師 這學期辛苦你了~

2010年1月7日 星期四

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);


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




彩色圖片

灰階圖片




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

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值比原本的"差值"更多 (猜的)

2009年12月17日 星期四

HW3

原圖





R:


G:





B:
這次作業是等到老師 放範例程式碼
才勉強寫出來的
原來可以用MoveTo和LineTo劃線
Image1->Canvas->MoveTo(x,100);
Image1->Canvas->LineTo(x,100-(100*colorHistogram[G][x]/imaxGvalue));

用前面代表起點位置,後面是終點
用for迴圈來跑就可以完成了


--------------------------(補)
一開始照著moveto lineto 不過顯示出來一值都擠在前面
↓如下














可能不了解真正moveTo跟lineTo真正的意思, 後來GOOGLE了一下 , 才知道
lMoveTo(x,y) - 將畫筆移到(x,y)位置 結果他都畫在前面
lLineTo(x,y) - 從目前畫的位置,畫一線段到(x,y)位置
從下面往上畫那時候我還學到了Canvas畫布屬性
還可以畫不同的東西
lRectangle(x1,y1,x2,y2):畫矩形;
lEllipse(x1,y1,x2,y2):畫橢圓;

如下


HW2















原圖


















旋轉140度40度
本來一值沒辦法把圖讀到自己想要的位置
再看了老師的範例後
但是必須要計算轉完的大小(i,j)
再剪掉對角線的長度一半
這樣就是相對中心點的位置
iNewJ = j - iNewOriginX;
iNewI = i - iNewOriginY;
再套旋轉公式
iOldJ = iNewI * dCosAngle - iNewJ * dSinAngle;
iOldI = iNewI * dSinAngle + iNewJ * dCosAngle;
也就是 x=x*cos-y*sin
y=x*sin-y*cos
再加上舊邊長的一半
iOldJ = iOldJ + iOldOriginY;
iOldI = iOldI + iOldOriginX;
這樣就會剛好在框內
---------------------------- 1/19(補)

翻90度 270度 180度 都還好
翻30度 圖....要怎麼弄整個變大嗎?
在看過老師程式碼前面 , 一開始根本沒有頭緒
只知道有旋轉公式
想法是












定好右下角的點 旋轉 在計算 各點的位置
我把右下角點定為(0.0) 在另外宣告一個新的陣列
在套旋轉公式

(轉至維基百科)
後來又嫌太麻煩 又定"左上點"為原點 就不用換矩陣
可是實做出來圖會被切掉= = ,
中間也忘記加上#include
一直無法debug
後來是參考同學和老師的程式碼 才能正確的落在image2裡
最上頭是我參考老師的算法 才寫出來的
至於老師說得圖片品質變差
因為程式碼已不在了= =
所以沒辦法解答 真的 很抱歉...

2009年10月6日 星期二

HW1



這次我第一次用BCB 完成作業

除了上課 主要還是請教同學

完成後很有成就感

雖然只有完成開啟圖片 這項功能

還有很多很多沒有學到的

希望在這堂課 可以學到更多相關的

-------------------------------------------------------

以上是我第一次打的

下面是我後來修改的(為了分數...很現實= =)

第一個作業老師部落格上就有重點

Lee's C++ Builder Programming Notes 裡面image

就有寫到重點

這兩行是把圖片讀進myImage1開啟 BMP 影像

OpenPictureDialog1->Execute() ;

myImage1->Picture->LoadFromFile(OpenPictureDialog1->FileName)

利用宣告三個二維陣列 , 並用new配置記憶體空間 (動態宣告二維陣列

ucRMatrix = new unsigned char *[iImageHeight];

ucGMatrix = new unsigned char *[iImageHeight];

ucBMatrix = new unsigned char *[iImageHeight];

for (int j=0;j

{

ucRMatrix[j] = new unsigned char [iImageWidth];

ucGMatrix[j] = new unsigned char [iImageWidth];

ucBMatrix[j] = new unsigned char [iImageWidth]; }

這是例外處理 跳出

catch (std::bad_alloc)

{

ShowMessage("Could not allocate memory...Bye");

exit(-1);

}

這是用GetRValue和for迴圈抓取圖片的Pixels值取得RGB值分別存入二維陣列

ucRMatrix[x][y] = GetRValue(myImage1->Canvas->Pixels[x][y]);

ucGMatrix[x][y] = GetGValue(myImage1->Canvas->Pixels[x][y]);

ucBMatrix[x][y] = GetBValue(myImage1->Canvas->Pixels[x][y]); }

這個作業直接依靠老師的部落格就能動手完成

也是第一個作業 , 即使不熟bcb的同學 , 參考老師部落格就可以清楚

知道每個細節 , 這項作業是後面作業很重要的基礎 , 所以雖然之前寫

大概知道怎擺怎放 , 後來再打心得 , 才發現原來只是這樣 , 跟以前學的

c/c++觀念上根本完全相同 , 呈現方式不同罷了 , 我想這是我之後在寫心

得所發現的

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

老實說我一年級是學C語言 之後 是學java

與c++很不相同. 所以學起來很辛苦

c++是物件導向語言 , 多了可以建立實體物件的

資料結構也是學java的 那時候是 用類別class 裡面宣告

屬性 , 在主程式new實體物件 , 在用點(.) 例如:area.watch( int b)

來給初值或其他

c++ 是用箭頭(->) 所以一開始看到的時候 都霧煞煞

不過觀念都一樣 , 所以也沒有卡很久

用bcb之後 , 第一次用視窗化程式設計 來寫 , 不像以前都是開空白

#include ... 開始寫

第一次修老師的課 , 學到很多 , 不過自己"一開始"沒有花心思在上面

之後才再補齊課程內容 , 真的是很慚愧 ..

另外一提:try- catch 我從沒用過得說

例外我都是用if-else 如果要我憑空寫 我想我的程式碼應該一大串吧..

還好有老師的部落格範例..XD