顯示具有 96360201 張展翔 標籤的文章。 顯示所有文章
顯示具有 96360201 張展翔 標籤的文章。 顯示所有文章

2011年1月8日 星期六

HW3

作業3是作3D圖,其實至從阿凡達之後什麼都來3D,
最讓我印象深刻的應該是去資訊展的時候體驗了3D電視,
真的好酷。
這次我自己寫3D,娃屋!! 酷!!

其實感覺很簡單,就在左眼跟右眼附近各拍一張照片,
之後左眼取出紅色的值,右眼則是取出藍色跟綠色的值,
最後把RGB合在一起。
可是我覺得我做出來的圖 效果有點差。

左眼
右眼
3D

hw4

作業四濾鏡處理,我覺得平滑、銳利、中位數濾鏡其實都還蠻簡單的。
過程中沒有遇到什麼太想破頭的問題。
平滑化:

平滑化應該是三個裡面最簡單的。每個像素把周圍八個像素給加總,最後在除以9。


銳利化:

銳利化,本來以為用動物會讓效果比較清楚,因為圖太小了,所以看不出來,老虎那個毛清晰的樣子,不過確實是銳利化了,整隻老虎有立體起來的感覺。
銳利化說真的寫完,我還是有點不太懂那個係數?看了課本又是二階導數又是普拉普斯,真是越來越困惑了。
另外,本來依舊想要用資工彌的那張照片,可是不知道爲什麼銳利化後的圖片,會感覺好老唷!所以就改成動物。
code:

for (int i=1;iHeight-2;i++)
{
byte *row0 = new byte[1];
byte *row1 = new byte[1];
byte *row2 = new byte[1];
byte *row = new byte[1];
row0 = (byte *)Image1->Picture->Bitmap->ScanLine[i-1];
row1 = (byte *)Image1->Picture->Bitmap->ScanLine[i];
row2 = (byte *)Image1->Picture->Bitmap->ScanLine[i+1];
row = (byte *)Image7->Picture->Bitmap->ScanLine[i];
for (int j=1;jWidth-2;j++)
{
int x=0, y=-1, z=5; //係數
r=(row0[(j-1)*3])*x+(row1[(j-1)*3])*y+(row2[(j-1)*3])*x
+(row0[j*3])*y+(row1[j*3])*z+(row2[j*3])*y
+(row0[(j+1)*3])*x+(row1[(j+1)*3])*y+(row2[(j+1)*3])*x;

g=(row0[(j-1)*3+1])*x+(row1[(j-1)*3+1])*y+(row2[(j-1)*3+1])*x
+(row0[j*3+1])*y+(row1[j*3+1])*z+(row2[j*3+1])*y
+(row0[(j+1)*3+1])*x+(row1[(j+1)*3+1])*y+(row2[(j+1)*3+1])*x;

b=(row0[(j-1)*3+2])*x+(row1[(j-1)*3+2])*y+(row2[(j-1)*3+2])*x
+(row0[j*3+2])*y+(row1[j*3+2])*z+(row2[j*3+2])*y
+(row0[(j+1)*3+2])*x+(row1[(j+1)*3+2])*y+(row2[(j+1)*3+2])*x;

if(r>255)
r=255;
if(r<0)
r=0;
if(g>255)
g=255;
if(g<0)
g=0;
if(b>255)
b=255;
if(b<0)
b=0;

row[j*3]=(byte)(r);
row[j*3+1]=(byte)(g);
row[j*3+2]=(byte)(b);
}
}
-------------------------------------------------*


中位數濾鏡:
中位數濾鏡最讓我頭痛的應該是排序法,突然有點對不起熊大,我把演算法都忘掉了><:::。
而有胡椒鹽圖片是我自己用小畫家點出來的。
code:
//中位數濾鏡主code

for i to Image的長
{
宣告原圖跟目的圖的ScanLine;
for j to Image的寬
{
前面把R_array, G_array,B_array把每個RGB給取好。

r = QuickSort(R_array,0,8);
g = QuickSort(G_array,0,8);
b = QuickSort(B_array,0,8);

row[j*3]=(byte)(r);
row[j*3+1]=(byte)(g);
row[j*3+2]=(byte)(b);
}
}

//快速排序法 且回傳值為中位數
int QuickSort(int data[],int left,int right)
{
int num = right+1;
int i,j;
if(left {
i=left+1;
j=right;
int target=data[left];
do
{
while((data[i] i++;
while((data[j]>=target)&&(i<=j))
j--;
if(i {
int temp;
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}while(i if(left {
int temp;
temp=data[left];
data[left]=data[j];
data[j]=temp;
}
QuickSort(data,left,j-1);
QuickSort(data,j+1,right);
}
return data[num/2];
}
-----------------------------*

2011年1月7日 星期五

HW2

我本身看了老師的程式之後,就差不多知道怎麼寫了。直方圖統計的流程就是:
1.初始化儲存資料的變數
2.取得原始資料的RGB值
3.R,G,B著色
4.調整位置
過程中,我遇到最大的問題應該是調整位置的地方,因為一開始出現的圖只有一部分,我以為我寫錯了,可是沒有想到我是對的,只是直方圖太大,所以我就用
Image->Height*(1.0-(float)t/(float)max),取得最高的RGB直之後把他依照比例縮小。另外,就是要用float,因為我之前傻傻的用int(因為小數0.xxx都會變成0,所以直方圖會沒有東西),結果debug超久。

以下是直方圖統計:
code:

for (int k=0;k<3;k++)>
for (int i=0;i<256;i++)
{
iHistogram[k][i]=0;
iCumulativeHistogram[k][i]=0;
}

for(int i=0;iHeight;i++)
{
byte *row = new byte[1];
row = (byte*)Image1->Picture->Bitmap->ScanLine[i];
for(int j=0;j
Width;j++)
{
for(int k=0;k<3;k++)>
{
iHistogram[k][row[j*3+k]]++;
}
}
}

Image3->Canvas->Pen->Color = clRed;
Image4->Canvas->Pen->Color = clGreen;
Image5->Canvas->Pen->Color = clBlue;

for (int i=0;i<256;i++)
{
int tR = int(( float(iHistogram[2][i]) * fHistogramScalar ) + 0.5);
Image3->Canvas->MoveTo(Image3->Width*((double)i/256),Image3->Height);
Image3->Canvas->LineTo(Image3->Width*((double)i/256),Image3->Height*(1.0-(float)tR/(float)maxR));

int tG = int(( float(iHistogram[1][i]) * fHistogramScalar ) + 0.5);
Image4->Canvas->MoveTo(Image4->Width*((double)i/256),Image4->Height);
Image4->Canvas->LineTo(Image4->Width*((double)i/256),Image4->Height*(1.0-(float)tG/(float)maxG));

int tB = int(( float(iHistogram[0][i]) * fHistogramScalar ) + 0.5);
Image5->Canvas->MoveTo(Image5->Width*((double)i/256),Image5->Height);
Image5->Canvas->LineTo(Image5->Width*((double)i/256),Image5->Height*(1.0-(float)tB/(float)maxB));
}
------------------------------------*

接著是直方圖均化,
主要就是要把bHistogramEqualizationTable跟灰階調色盤給弄好,
其實看了老師的範例程式,很簡單就弄出來了。
只是我就在想了直方圖均化到底在做什麼阿!?
我其實本來沒有太具體的感覺,就覺得只是增加對比,
後來我很無聊的把Histogram Equalization拿去google,
在wiki找到比較具體能讓我了解。
後來把均化後的圖 再做一個直方圖統計。
本來很擠的直方圖統計,突然整個均等的分佈了
(可以跟剛剛原圖的直方圖統計,很明顯的均化了)。




2010年11月5日 星期五

HW1


其實因為之前忙專研總審,所以有點跟不上上週的進度,
特別是調色盤的地方。

說真的本來我不想要用 new一個TImage物件的方式(像老師那樣 TImage *imNEW; ),
所以我都是直接 把原圖直接複製 在灰階修改。

code:
Image2->Picture = Image1->Picture;
---------*
後來怎麼樣run都run不出來,我還以為是因為要像老師new一個TImage物件那樣,
後來發現不是這句的錯,並順便証明我的也可以。

一開始開頭就說 有點跟不上進度,聽到有作業說要做什麼灰階,
我本來信心滿滿,寫完黑白2色 我還在那邊的得意洋洋。

黑白2色

code:
//用 ScanLine的方式 在用if判斷
if(row[a*3]<=128)
{
row[a*3] = 0;
row[a*3+1] = 0;
row[a*3+2] = 0;
}
else
{
row[a*3] = 255;
row[a*3+1] = 255;
row[a*3+2] = 255;
}
---------------*
而灰階4色也是如法砲製,可以說if到底。

灰階4色

後來發現if並非萬能,因為有128種灰階,總不能寫128種if來判斷吧!
我才開始翻開老師 同學們的上個禮拜的程式範本自己研究。
結果一弄....
就從學校弄回家,一回家開BCB,
甚至是把我原本的寫法都刪掉,學老師用new的 把所有的設定都弄好,
竟然還是不行,
那我只能出殺手賤了,接著對照跟同學的程式到底哪裡錯了,
甚至是Ctrl c Ctrl v來測試。差不多5個小時都在弄灰階8色。
我後來還一行行對照,為什麼同學的可以? 我卻殘念...ざんねん ざんねん ざんねん ざんねん

我發現了 我終於發現了...我哭了 ><::::::: ←感動的眼淚

code:
//前面則是像老師 老師new我就new什麼 老師設什麼 我就設什麼
.....
.....
....
for (int i=0; i<256;>
{
PaletteEntry.peRed = gray[i/(256/8)];
PaletteEntry.peGreen = gray[i/(256/8)];
PaletteEntry.peBlue = gray[i/(256/8)];
SetPaletteEntries(GrayPaletteHandle,i,1,&PaletteEntry);
}
newpic->Picture->Bitmap->Palette = GrayPaletteHandle;
for(int i=0; iHeight; i++)
{
row1 = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
row2 = (Byte *)newpic->Picture->Bitmap->ScanLine[i];
for(int a=0;a <>Width ;a++)
{
row2[a] = (Byte)(0.299*row1[a*3+2]+0.587*row1[a*3+1]+0.114*row1[a*3]);
}
------*
耗盡5個小時的 灰階8色
而我錯的地方是這句,我後面的是寫i,而正確的應該是讀a。
row2[a] = (Byte)(0.299*row1[i*3+2]+0.587*row1[i*3+1]+0.114*row1[i*3]);
也因為這句,我知道其實我之前寫的都是對的。
(其實都跟老師差不多,只是我是assign原圖,不是用new,也沒有設定一堆top 長高之類的)

if( 打通任督2脈 == 搞懂灰階8色)
{
cout<<灰階16色;

cout<<灰階32色;

cout<<灰階64色;

cout<<灰階128色;

}
else
{
for(5小時)
debug();
}
return 100分;