2011年1月8日 星期六

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];
}
-----------------------------*

沒有留言:

張貼留言