2010年1月20日 星期三

Hw8-期末心得檢討

這學期的課程 我因為身體狀況的關係

而缺了很多次的課

可以說是在後半段的課程中

才慢慢的進入狀況

而且作業也是在期末考之後的那週交的

可以說是在倒數的幾個順位裡頭


很感謝主任與老師們的協助

讓我能夠在沒有很大心理壓力下順利繳交作業

也很感謝老師把繳交作業的時間

延那麼長讓我能夠補繳

在這兒向老師們 說聲 感謝您們...

HW06_new

濾波器(spatial filtering) :濾波器可以柔化圖片也可以使圖片更加的清晰
濾波器的原理:
先設定一個大小遮罩後,經過運算的到新的像素結果,將像素分成固定階乘的方行矩陣(square matrix),然後再以輸入的方式來決定主要顯示像素會受到旁邊像素影響的比例多少,然後再將處理完的影像輸出,這次我以3*3(一般3*3濾波器遮罩)來做,這9個座標內的色彩值相加除以9,再把值傳回去,因此最中心的像素會受到周圍8宮格像素的影響,數值會被周圍色彩值影響變化成較為平滑得樣子.再影像中任一位置(x,y)處的平均值是以(x,y)為中心之3*3鄰域中9個強度的和在除以9,要小心,9個權重的值總和不等於0,否則"任何數/0"是會有錯誤.
銳利化->9個點個別*權重相加之後的結果,如果=正,數值變大顏色會變深,如果=負,數值變小顏色會變淺





今天我把濾波器課本內容及作業重新理解了一次,可能因為把前面作業全部都重新理解過的關係,所以理解起來很快就懂了!雖然不是很完美,可是我有進步了一些,希望老師看的到我的努力,可以加點分數,謝謝老師...

HW05_new

位元平面切片


位元平面切片原理介紹:
顏色是由8個位元儲存.所以我們可將其影像分成8個區塊重疊,這次的作業就是要分別顯現出這8張圖像,例如:假使我這一個像素點的顏色是0101 0010 (binary) ,我們可以分成8個像素點的組合而成.








  0000 0000   (第1張的像素點值)
   0000 0010   (第2張的像素點值)
   0000 0000   (第3張的像素點值)
   0000 0000       "
   0001 0000       "
   0000 0000       "
   0100 0000   








   0000 0000   (第8張的像素點值)
再*255來分辨是黑色還是白色如果值為"1"那就設為黑色如果不是"1"的話就設為白色








第1位元切面圖
















第2位元切面圖
















第3位元切面圖
















第4位元切面圖
















第5位元切面圖
















第6位元切面圖
















第7位元切面圖
















第8位元切面圖

















心得:
 一張圖片讀取之後,利用(and)運算.把2進制轉換成16進制0000 0001(2)=0x01 .就可以完成作業了,這次作業 我也把程式碼重新解讀了一次,讓自己更了解當初不太懂的地方~ 重新做了一次,希望老師可以加點分~

HW04_new

利用"S=C*R^Gamma"所計算出的值來套用


這是這次Gamma value主要的程式碼:


float r = StrToFloat(Edit1->Text); c = 255/(pow(255,r));
for(i=0;iCanvas->Pixels[i][j]=(TColor)RGB(s_R,s_G,s_B); } }



當Gamma value=2
(稍微看的出後來的比原來的還要來的暗一點)


當Gamma value=4
(已經開始明顯的看出後來的圖比較暗了)


當Gamma value=6

(相對於當Gamma value=4 已經變的更暗了一些..)


當Gamma value=10
(當Gamma value 已經輸入到10時,已經比原來的明亮度降低了~)
結論:


Gamma value越大(>1)時,明亮度降低~
當Gamma value越小(<1)時,明亮度就相對提高
這次作業,我也重新修改並且讀懂了一次,利用轉換的時候套上公式就可以慢慢的做成了!!

hw4_(修改後)

首先呢!先來看看乘冪律(Gamma)轉換的基本型式:

s = c
s=經過Gamma轉換過後的值。
c=正值常數 ,介於0~255區間。
r = 要做轉換的值
γ = Gamma值

Gamma 轉換對於一般用途的對比處裡很有用,因為人類對於亮度比較不敏感,所以在Gamma轉換之後提升對比度,可以讓人類看到更多的圖片細節。

在這個作業裡,主要的問題就是在於如何將數學式子轉換成程式碼,這對於大家來說可能是小問題,但對我來說是一個要讓我想上30分鐘才能理解的難題。

在這裡我們Gamma值要給使用者設定,所以需要用到

r =StrToInt(Exit1->Text)

r=StrToFloat(Exit1->Text)

這兩個最大的差別就是一個是宣告Int,令一個則是Float。
在這次Gamma轉換的作業裡,我們極有可能需要輸入小數,所以我們在這裡需要選用的是:
r =StrToFloat(Exit1->Text)

再來談談如何將數學子式子轉換成程式碼

c = 255/(pow(255,r));
再講這一段式子之前,先來談談pow()函式的用法。
Pow(x,y)
此段程式碼談的是,計算x的y次方的值!

c = 255/(pow(255,r));
就是先將255作r(也就是γ)的次方計算,去除255求得常數值!
c 求出來了,之後就是講各個要做轉換的值,去跟r做次方運算!
利用兩層for迴圈,以圖片的寬跟高為界去將每個要做轉換的像素點拿出,在作以下的數學轉換。
gamma_R = (pow(ucMR[i][j],r)*c);
gamma_G = (pow(ucMG[i][j],r)*c);
gamma_B = (pow(ucMB[i][j],r)*c)
將RGB做次方後,在乘上c即可大功告成。

將成果畫在Image2上,就可以有成果圖片了!

Image2->Canvas->Pixels[i][j]=(TColor)RGB(gamma_R,gamma_G,gamma_B);
以下是實作圖片:














































































HW03_new






1.GrayHistogram


以ARect為範圍統計直方圖的程式碼:

Byte *ptr; long GrayCount[256] = {0}, MaxGrayCount = 0; for(int row = 0; row < ptr =" (Byte">Picture->Bitmap->ScanLine[row];



用8bit灰階圖為方法的程式碼:

for(int col = 0; col <> MaxGrayCount) MaxGrayCount = GrayCount[ptr[col]]; } }


初始化直方圖的畫面得程式碼:

Image5->Canvas->Brush->Color = clWhite; Image5->Canvas->FillRect(TRect(0, 0, Image1->Width, Image1->Height));


畫出直方圖畫面的程式碼,利用for迴圈:

for(int index = 0; index <>Canvas->MoveTo(index, Image2->Height); Image5->Canvas->LineTo(index, Image2->Height * (1.0 - (double)GrayCount[index] / (double)MaxGrayCount)); }


2 . RGBHistogram


以下都跟畫出GrayHistogram的方法相同~


用8bit灰階圖為方法的程式碼:
for(int col = 0; col <> MaxGrayCount) MaxGrayCount = GrayCount[ptr[col]]; } }

初始化直方圖的畫面得程式碼:
Image5->Canvas->Brush->Color = clWhite; Image5->Canvas->FillRect(TRect(0, 0, Image1->Width, Image1->Height));

畫出直方圖畫面的程式碼,利用for迴圈:
for(int index = 0; index <>Canvas->MoveTo(index, Image2->Height); Image5->Canvas->LineTo(index, Image2->Height * (1.0 - (double)GrayCount[index] / (double)MaxGrayCount)); }


RGB呈現:利用FOR迴圈將RGB 顯現..


for (int i=0;iHeight;i++) { ptr=(Byte *)bmp->ScanLine[i]; index=0; for (int j=0;jWidth;j++) { b=ptr[index]; g=ptr[index+1]; r=ptr[index+2]; RGBhistogram[0][b]++; RGBhistogram[1][g]++; RGBhistogram[2][r]++; index+=3; if(RGBhistogram[0][b] > MaxBCount) MaxBCount = RGBhistogram[0][b]; if(RGBhistogram[1][g] > MaxGCount) MaxGCount = RGBhistogram[1][g]; if(RGBhistogram[2][r] > MaxRCount) MaxRCount = RGBhistogram[2][r]; } }



心得:


這是作業三~ 我也重新看過程式碼 並且加上註解,就像是我們知道value的範圍是0~255,可以直接宣告一個256的陣列來統計,最後在畫線條的時,再去取得它的出現次數除以它的百分比.這次作業,做起來顯的卡卡的,可能是我還不熟析的關係,我很認真的再去研究了一次程式碼,加上了注解,希望老師可以給我加點分數...謝謝

HW01_new






程式一開始要先有開圖片檔的程式碼:
OpenPictureDialog1->Execute();
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);






讀取得到圖片長寬的程式碼:


iImageHeight=Image1->Picture->Height;


iImageWidth=Image1->Picture->Width;




宣告RGB三元素的三個陣列的程式碼:


try
  {
   ucMR = new unsigned char *[iImageHeight];
   for (j=0;jucMR[j] = new unsigned char [iImageWidth];
  }
 catch (std::bad_alloc)
  {
    ShowMessage("Could not allocate memory...Bye");
    exit(-1);
  }


}




利用for 迴圈儲存RGB的值的程式碼:


for(i=0;iHeight;i++)
{
for(j=0;jWidth;j++)
{
ucMatrixR[i][j]=GetRValue(Image1->Canvas->Pixels[j][i]);
ucMatrixG[i][j]=GetGValue(Image1->Canvas->Pixels[j][i]);
ucMatrixB[i][j]=GetBValue(Image1->Canvas->Pixels[j][i]);
}
}


心得:
這次我把作業都重新看過讀懂了一次,利用BCB把所要的物件放上後,在用相關的程式碼對映上去,雖然說起來很簡單,其實卻不然,利用上課講解過的程式碼,以及同學們的教導,慢慢拼湊出來的,希望成果還可以! 老師可以給我加點分數

2010年1月19日 星期二

hw6

作業6:空間濾波器

這次作業的原理是這樣:

在一空間遮罩中

其像素為與其他相近鄰域像素

經過加乘後相加再取平均值

再輸出



經過這個程序處理之後

影像通常都會有被柔(銳)化的感覺

如下圖:


Hw5

作業5:位元平面切片

一開始還不知道什麼是位元平面切片

看完課本上的解釋和圖片之後

才有比較了解

一張256準位的灰階圖片

是由8個一位元的平面所構成

其中較低位元的平面提供影像中較精細的強度細節部分

而較高位元的平面則包含視覺上的重要資料

全部合起來就是一張圖片了





這次的作業 我還不太會寫

是靠同學的幫忙才完成的...

真的很感激 ...!

HW8 - 課程期末心得回顧

在學這門課之前,我完全沒有碰過BCB語言,一開始很辛苦,連POJECT都不會開,然後方塊圖在哪也要找半天,在過了一兩個作業以後,漸漸的熟悉了BCB的編寫方式,他比C++簡單許多,但是在第2個作業開始,我遇到了一個嚴重的問題,數學公式轉換成程式碼,由於數學不是很好,所以在公式上面花了不少工夫,後來就漸漸的能上手了,BCB最方便的是你只要將程式的架構先建好,載來每個BUTTEN裡面編寫程式即可,不用把程式寫的一長串自己看還會搞混。

不過也學到了一個很重要的東西,就是變數的宣告,我一直以來很習慣直接宣告在最上面,但是這對於電腦而言是一種記憶體的浪費,相對於需要用變數的時候在宣告,會省很多記憶體空間。

老師從以前到現在就一直倡導使用部落格將自己的成果記錄下來,這個真的很不錯,大家都把學習過程記錄下來,將來需要用到時一翻就有,而且同學間遇到作業上的問難,還可以看看部落格上別人是如何講解,這些應該是我上所有課以來記錄最完整的。

HW7 - 邊緣偵測

這次作業是做將圖片的邊緣顯示出來,將圖片剃度變化的地方突顯出來,所以使用Sobel來運算剃度變化的近似值。Gx是利用圖像與X軸的Sobel運算,Gy則是圖像值與Y軸的Sobel運算。

Gx

Gy
彩色圖

彩色邊緣偵測

灰階圖
徽接邊緣偵測

2010年1月18日 星期一

Hw04

這次的作業是寫Gamma轉換
從課本和程式可以知道:
當C>1.0時代表要將影像增強
這麼做會使圖檔的顏色看起來比較深
比較暗沉,如圖b,c,d
可以使用在一個外表褪色的影像
使它增強














圖a, C=1.0,原圖














圖 b, C=2.0













圖 c,C=4.0


圖 d, C=5.0


當C<1.0時代表會將影像減弱
這會使影像的對比度有輕微"褪色"的情形
尤其是在背景的部分,如圖2,3,4
可將它運用在醫學上的x光片上



圖 1, C=1.0,原圖


圖 2, C=2.0













圖 3, C=4.0















圖 4, C-5.0


再度地向老師說 非常抱歉
感謝老師....

Hw01

這次的作業,一開始本來還看不太懂這些程式碼的意思,
不過在看完學長的作業解說之後,才開始了解,這些程
式的用途。我才照著上面的步驟一一的將它完成;由於一
開始我沒上到課,不知道圖案的色素有分R、G、B,是到
學校之後同學告訴我的,我才又修改加上去的。















關於這作業這麼晚才繳交,我感到非常的抱歉....
在這裡跟老師說聲 對不起

HW05

這次的作業位元平面切片,怎麼看都沒感覺....也有上網去找資料,可是我怎麼找,
就只有這張圖↓,都沒有更深入的內容









這張圖就是在講位元平面切片,Bit 0~Bit 7的意義,Bit 1的意義最少,Bit 8的意義最多
我在猜Bit 數越大,就代表它和原圖越接近;Bit 數越小,就代表它和原圖差越多
位元平面切片似乎還牽扯到資訊隱藏的部分,好像是利用Bit 數小的來做資訊隱藏,並且不會破壞原圖

8bit的像素點顏色和
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000
0010 0000
0100 0000
1000 0000
分別做"&"運算就可以做到位元平面切片
當然程式的部分要轉成16進制才能執行囉
以下是實作

↓我是原圖









↓1-Bit








↓2-Bit








↓3-Bit








↓4-Bit








↓5-Bit








↓6-Bit








↓7-Bit








↓8-Bit










最後要老實說,這次的作業是借用同學的程式碼來研讀的
程式碼看完就大概知道切平面的做法,切平面的數學公式並不難理解
但是切完之後,為什麼1-Bit和8-Bit的差異這麼大
照最上面那張圖片給我的感覺,應該是把像素點色彩值平均切成8份
結果上網查了之後,發現有所謂的重要程度,我想這就是8-Bit這麼接近原圖的原因吧

2010年1月17日 星期日

HW8

期末心得

其實在寫這篇心得之前有先去翻了一下之前學長姐的心得,

發現老師其實在這門課的教學上一直有在做調整,

要如何教學才獲有效率、

才會讓學生有吸收到東西,

不像其他科老師老是用一成不變的老方法來做教學,

搞不好那方法只有老師才懂而已(我絕對不會說是X訊X理的老師)

在前年是讓學生自己評分、然後再去年改成學生互評,

今年則變成老師來做評量,由學生寫的心得來給分

這方是有人說好,也有人說不好,

說不好的人可能是因為程式碼寫得半死但是心得沒打幾個字就拿到低分,

說好的人可能是因為這作業只要要打打字就結束了。

但是心得在我看來也可以很簡單就知道這次的作業學生是否有用功在作業上

真正有寫作業的,能在短短幾行內寫出程式中最為困難的部分,

真正的核心,也不用去看學生的程式碼看得眼花撩亂,

所以我覺得交心得其實是不錯的交作業方法。

再來我想說的上課會遲到的問題,

我覺得這問題會發生有幾點

第一點:課是開在早上,正常來講,我認識的學生裡面作息生活有規律的人很少,

三不五時去夜唱,打打保齡球、聯誼、吃消夜、打遊戲,

這些時間都是在半夜.....說真的,

早上爬起來真的是有點困難。

第二點:這門課開在冬天,

這嚴格起來說不是這門課的問題,但是因為冬天是個非常可惡的季節,

它會讓學生無法脫離被窩的懷抱,離不開溫暖的床上。

第三點:點名通常是在第三節才點名,

設想,朋友第一節到,我第三節睡飽飽才到一樣被點名?

嗯哼......

那再說說課本的問題,

我是個窮困的學生,

課本非常的貴,

如果是我的話,

我會希望是否能用投影片做教學,

學生也可以上網去下在回家研究,

也不會再講課本的時間有人在電腦看網拍(我承認我有幹過那麼一次),

否會比較好呢?

現在只有想到這些,如果有想到新的東西的話會在補上

2009hw8

期末心得:

一開始選這門課時,很擔心
因為上學期選了視訊程式
覺得BCB很難寫。

經過一個學期下來
寫了這七個作業
覺得對BCB更了解了
也很感謝同學的幫忙。

在影像處理讓我覺得最神奇的地方
是老師上課是邊用Photoshop輔助
以前想要修改照片時
都是隨便按一按
上了這堂課後
才知道每個功能是做什麼用的。
讓我回家以後忍不住下載photoshop來玩。

也了解了很多關於影像處理的概念
包括對比、柔化、銳利..這些平常常用到的功能。

這是我覺得這門課最有趣的地方。


這學期有幾堂課沒去上課
後果就是要自己看書看很久
還要一直問同學
因此覺得很不好意思
期許自已以後可以好好的準時上課。


作業繳交的方式
覺得很好
尤其是在寫心得時
考驗自己對這個作業了不了解
為了要寫出重點
也查了很多資料
所以在寫心得的時候
會幫助自已更了解概念。

2009hw7

這次的作業是Sobel運算子實作

原理:
梯度銳化最主要的目的就是要去強調邊緣值
影像色彩的差距變大。

用第六個作業去改
很快就完成了
主要是兩個遮罩的運算
GX:

GY:

會得到兩個值,帶入畢氏定理。

結果:
(執行結果)
(灰階)
(彩)

在寫程式時
不知道怎麼把自已寫的funtion加入
後來問過別人後
知道在程式碼的地方
按右鍵->open source->把
int_fastcall TForm1::GX(int i, intj):
貼到private就可以了