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裡面編寫程式即可,不用把程式寫的一長串自己看還會搞混。

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

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