顯示具有 95360856 方志棋 標籤的文章。 顯示所有文章
顯示具有 95360856 方志棋 標籤的文章。 顯示所有文章

2010年1月20日 星期三

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);
以下是實作圖片:














































































2010年1月16日 星期六

hw08

期末心得:

這學期這門課的上課內容有點讓我吃驚。

因為程式的教學與實作占大部分。

然後接著是用我這學期才開始學的BCB去寫作。

再開始的時候難免會有障礙。

之後在每個作業上,先是從課本開始去理解題意。

有不會的語法就上網去查相關的語法去打程式。

就在這樣日積月累下,慢慢認識的BCB語法也多了起來,才開始慢慢體會到BCB的魅力所在。

再來就是跟同學討論作業,從中雙方都會成長,從對方口中對於作業的描述,都可以看得出他對各個作業的了解程度有多少,不會的地方也往往可以得到最即時的幫助。

在這一學期的課程裡,程式寫作上面又有新的認識,並且每個作業去練習的程式邏輯概念都讓我懂了不少東西。

感謝老師這學期的教學。
感謝各位同學這學期的講解。

這一學期的課程從 一開始讓我意外的課程,到最後讓我得到意外的收穫。
最後希望大家都能有好的結果。

hw07

第七次的作業,梯度。
在課本上的的數學式子,花了有點時間去理解。
到最後還是弄得一個頭兩個大,看不大懂。
最快的方法還是去詢問看懂的同學,去理解式子。

首先是先將原本第六次作業所設定的九宮格。
分別去乘上課本上所給的水平遮罩與垂直遮罩。

-1 -2 -1 -1 0 1
0 0 0 -2 0 2
1 2 1 -1 0 1

將這遮罩套用上去之後,在將求出來的作平方。
最後開根號即可。

理論是這樣,但是實作上有遇過不少問題。

像是在平方的部分,一開始一直在想說如何用語法去表示開平方,後來知道其實不用這麼麻煩,直接自己乘上本身自己就可以達成平方的效果。
當把彩色圖片做邊緣偵測時,會有原本顏色得框框,只要把他邊緣偵測前作灰階處理,也可以得到像是第一張圖片的效果。
轉灰階的公式
RGB = (Red * 0.30) + (Green * 0.59) + (Blue * 0.11)
用兩個for loop再加上以下程式碼即可。
b=ptr[i*3];
g=ptr[i*3+1];
r=ptr[i*3+2];
gray=0.30*r +0.59*g+0.11*b;

以下是實作成果。



















當彩色圖片做邊緣偵測效果。
















灰階轉換之後的邊緣偵測成果圖

hw6

這次的作業:空間濾波器。
我在它本身的意思上看了課本很多次。

問了許多人才知道,是要計算的像素作為中心點,其他作為他周圍九宮格的鄰近點,
之後再除上1/9可以將他們的像素平均起來。
意思知道之後,再來遇到的難題就是看懂老師的程式碼。
程式碼沒註解的地方,經過詢問之後約略清楚再做甚麼後,
開始設九宮格的欄位,給使用者去設定九宮格的強度。

之後利用ScanLine去找他得鄰近點。
bPtrOriginalImage0 = (Byte *)imOriginal->Picture->Bitmap->ScanLine[i-1]; bPtrOriginalImage1 = (Byte *)imOriginal->Picture->Bitmap->ScanLine[i]; bPtrOriginalImage2 = (Byte *)imOriginal->Picture->Bitmap->ScanLine[i+1];
再彩色濾波上,還要去考慮ScanLine的特性,當b=i時,g=i+1,r=i+2。

每一格在分別去乘上使用者所輸入的各個強度。
圖片出來之後就會有柔化,更清楚的效果。

再看別人的成果圖,我大多看不出有甚麼變化。
然後對著鈔票上的人頭作空間濾波時,才清楚空間濾波器的功用可以將圖片造成這樣的改變。


以下執行結果,可以看到人頭上的黑線條,全部都變成周遭皮膚的顏色,
做過空間濾波之後,看起來變得像是一張黑白像片。














以下是彩色的空間濾波的成果圖。




2010年1月8日 星期五

hw5

位元平面切片。

像素是由位元所組成的數位數字。
假設一幅影像中每個像素都是用八個位元表示。把影像想像成由八個 1 位元平面構成,範圍從最不重要位元的平面 0(所有最低位元)到最重要位元的平面 7(所有最高位元)最低位元裡頭有影像比較精細的部分,最高位元則有大量視覺上的重要資料!

首先是要知道ScanLine()的語法
ptr = (Byte *)Bmp->ScanLine[j];

ScanLine主要是幫助你去取得影像某一行的開頭指標!

當取得某行的開頭指標後,我們便可以將那一行做and運算!
從
0000 0001
0000 0010
.
.
.
1000 0000
這樣子我們便可以做出八個位元的平面切面!

當然!最後的輸出要變成黑跟白!這時候我們就必須將b,g,r值去除以2算完之後在去乘上255,這樣就可以將他轉換為只有黑跟白的圖片了。

可能有人有疑問 為什麼是b,g,r,跟RGB是不是一樣的東西?答案是:scanline讀取一列的每一個pixel值,假如你讀的是一張24bits的BMP因為BMP的特性,所以每一列的pixel是以B1 G1 R1 B2 G2 R2 Bn Gn Rn ....排列下去,因為這樣特性的關係,所以要使用以下程式碼前三行的指令。

b=ptr[i*3];
g=ptr[i*3+1];
r=ptr[i*3+2];
b=((b/bit)%2)*255;
g=((g/bit)%2)*255;
r=((r/bit)%2)*255;

以下是實作圖片:。

































































2009年12月29日 星期二
















這個作業在運算式的表達花了許多時間。
先將數值/255之後(直接Gamam進去數字太大),等作Gamma轉換完再乘回255
所以就先將原本,顏色值/255,做完Gamma在乘回255
想說就是亮度比會增大,讓原本暗的地方會變得清楚。
結果好像不太OK

之後才了要用 c=255/(pow(255,r)) 這樣的方式去作轉換
然後再將每個像素點作Gamma次方運算後乘上C
後來出來的圖就有達到原本的初衷。

2009年12月17日 星期四

Hw3

在這一次作業,我學會了如何去在Image上去畫出線條

Image1->Canvas->Pen->Color=clBlue;

這個程式碼可以在Image1上畫出藍色的線條,Color=clRed,Color=clGreed分別可以畫出紅色與綠色。 這再畫RGB直方圖的時候就會用到。

接著要用到的是 MoveTo() 和 LineTo()的用法。

MoveTo()是移動到畫線的起點位置
LineTo() 指的是畫線的終點位置

一開始我們先宣告

RGBhistogram[3][256]的二維陣列

主要來放RGB還有0~255有效值

之後再用ScanLine去抓取每行的起始位置,再利用ScanLine的特性去抓取bgr!
利用兩層for迴圈,裡頭程式碼可以寫

b=ptr[index];
g=ptr[index+1];
r=ptr[index+2];
RGBhistogram[0][b]++;
RGBhistogram[1][g]++;
RGBhistogram[2][r]++;
index+=3;

之後畫出值方圖再利用for迴圈 裡頭設 (int i = 0; i < 256; i++) 畫直方圖的範圍0~255
接著再利用 MoveTo()與LineTo()畫出 RGB直方圖

以下是實作圖片:

2009年10月16日 星期五

hw2


這一次的作業是旋轉,一開始開檔的那兩行指令沒有問題。
這一次介面的製作比起第一次還在到處找物件在哪裡拉時快了許多。
一開始看到題目,嘗試上google去找關於旋轉的指令去試著寫程式。
找到語法之後,試著打上去,結果在Run的時候出現了幾個意想不到的Bug。
上網找語法不行,轉而向同學求救該怎麼寫 圖片才會旋轉。
每一行慢慢問才搞通。
然後在求他的角度→3.14/3旋轉60度 3.14/3是90度
再去找出圖片的中心點
原來只要先將一開始的圖,將圖上的每一點用for將他的每個點存到陣列,再用公式將他旋轉。
其中在公式的地方摸索了許久。
經過老師在黑板上圖文講解後對圖片旋轉的公式比較有感覺後,
終於在系週會開始不久後,跑出難得的成果。

2009年10月6日 星期二

HW1

用BCB將圖作RGB值統計所需的物件有:

Standard Group -> Mainmenu
Standard Group -> Pennel

※此物件可將被拉進的物件變成一個群組。

再來就是最重要的
Dialogs Group -> OpenpictureDialog
這是關於開啟圖片的物件



再來是語法的部分:

這兩行是用來開圖片的程式碼,可以將圖片從檔案讀進Image1

OpenPictureDialog1->Execute();
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

再來是抓取Image1的高與寬的語法。
底下分別是抓取他的高以及抓取他的寬。

iImageHeight=Image1->Picture->Height;
iImageWidth=Image1->Picture->Width;


接下來我們就是要利用抓取的寬與高,設置兩個For迴圈去將圖片每個像素的儲存格跑過一次


接下來就是利用抓取色彩值得函式庫去抓取每個像素的色彩值


ucMatrixG[i][j]=GetGValue(Image1->Canvas->Pixels[j][i]);
ucMatrixB[i][j]=GetBValue(Image1->Canvas->Pixels[j][i]);
ucMatrixB[i][j]=GetBValue(Image1->Canvas->Pixels[j][i]);


GetRValue,GetGValue,GetBValue分別是對像素抓取紅色、綠色、藍色的色彩值得函式庫。
去取得每個像素的色彩值時,存到ucMatrixR,ucMatrixG,ucMatrixB裡頭。

之後再利用指標去讀ucMatrixR,ucMatrixG,ucMatrixB裡頭的值,再用以下語法輸出RGB值


Edit1->Text=**ucMatrixR;
Edit2->Text=**ucMatrixG;
Edit3->Text=**ucMatrixB;

就可以大功告成囉!




以下是實作圖片。