2013年12月10日 星期二

HW03

  這次的作業是做一些和濾鏡有關的東西,包括有模糊化、銳利化、胡椒鹽化以及將胡椒鹽化稍作還原的中值化。
  首先這是這次的原圖。


  接這這是經過模糊化之後結果,模糊化基本上就是將一個像素點周圍的八個點加上自己後取平均。其意思如下
中間紅框代表目標像素點,全部權重皆為1/9並將其相加後存入目標像素點,如此一來即可達成模糊化,另外有種凸顯其四周個點的方法,就是目標像素點的權重值取1/4,其上、下、左、右四點權重值取1/8,最後左上、右上、左下、右下權重值取1/16,總之就是透過改變權重使其產生不同的效果。


  接著銳利化其實就是透過上面的那個概念,只是將權種值改變而產生的結果,而我的作法是只取上下左右四點,其數據為目標像素點的權重值取5(或-3),其上、下、左、右四點權重值取-1(或1),另外八點的數據是目標像素點的權重值取9(或-7),其上、下、左、右、左上、右上、左下、右下全部都是權重值取1(或-1),當然不同的數據會產生出不同的效果。


  接著是胡椒鹽,胡椒鹽就是,將圖片的隨機像素點改成黑點(胡椒)或白點(鹽),圖中紅框的部分是干擾的百分比(Noise Percent,即胡椒鹽占整張圖的百分比),實作方法就是在掃描像素點的同時random出一個0~100變數,如果變數 <  Noise Percent/2就將點變成白色,如果變數介於Noise Percent/2和Noise Percent之間就將點變成黑色,即可實作出撒上多少百分比的胡椒鹽。


  最後是中值處理,這主要是在解決胡椒鹽化的圖,這裡又跟上面的九宮格又有關係了,其主要要做的就是將那九個點做排序,選出最中間的數值(所以其實排5次就可以了),把九宮格的數值全部取代成中間的數值就結束了,而其雖然沒辦法完全還原原圖(如果將圖放大會發現有些點還是白點或黑點,同時也會產生些許的鋸齒狀),但至少可使該圖片的胡椒鹽效果緩和,只是如果胡椒鹽的雜訊太多,還是會悲劇。


  以上就是這次的作業,而這次作業也更讓我了解修圖軟體的濾鏡究竟是在做什麼事情。

2013年12月9日 星期一

HW03

這次的作業內容是   銳化、平滑化

當時上課的主要提示是 9宮格的方式去做這三項圖片處理功能



1.
首先是銳化

左邊是未銳化圖,右邊是銳化之後的影像。

雖然感覺用9宮格的方式處理這張圖,有達到改變圖像的功能,但是我的方式似乎有點怪怪的,銳化應該顯得更清楚,但是右邊的圖並沒有達到我想像中的樣子。












2.
右邊是平滑化後的結果

這次用9宮格明顯達到預期中的效果
成功的將圖片平滑化,並且處理越多次能夠越平滑(同時會比較模糊),這跟9宮格內的演算法有關。






HW02

HW2  這次的作業主要是修改Levels 以及使用 Curve。

從XE2旁邊的函式庫拉出各種Label及picture box就不詳細說明。



用數字變化在Form上面畫出相對應的直線函數是用以下程式碼
     :  MoveTo、LineTo、還有用Pen指定畫筆的顏色。


1.將最小值的輸入輸出設為相同,最後修改圖片的結果不明顯。












2.
但是將輸出的值調整至200~250
圖片明顯變白了。












3.
然後將輸出的值調整至10~100
圖片也因應程式碼變為較黑的圖片
表示程式碼內容符合當初設想的輸出結果!






HW04_3D Photo



這次程式的撰寫沒有很難,只不過在ScanLine時不停地Out of range,一開始也用了偵錯,但依然沒有發現問題所在,我有把放3D相片的那個元件的寬高設地跟放座右眼的照片一樣大,可是在ScanLine時就是只有3D相片的那個有問題,做到這邊時我依稀記得之前好像也出現過了類似的問題,於是我開始往上看看之前所寫的程式碼,後來發現問題的關鍵在於這幾行Image12->Height = iImageHeight;
 Image12->Width = iImageWidth;
 Image12->Picture->Bitmap->Height = iImageHeight;
 Image12->Picture->Bitmap->Width = iImageWidth;
 Image12->Picture->Bitmap->PixelFormat = Image10->Picture->Bitmap->PixelFormat;
當我把這幾行加上去之後問題便迎刃而解
----------------------------------------------------------------------------------------
拍照攝影真是門大學問阿~~~

HW04

HW04
3D圖像製作
這次的作業是先拍攝二張分別由左眼和右眼拍攝出去,再將其中一張圖像的紅色像素,換上另一張的紅色像素,此動作即完成3D圖像。程式碼部分比起前面幾次作業都相對簡單,只是要注意存取RGB的順序是先B在G才R。

而這次最大的問題即是在拍照,拍來拍去都很不理想,不知道有沒有什麼技巧可以拍得好看點。

以下即是完成的圖片。


2013年12月4日 星期三

HW03

這次的作業在做銳化和模糊化時因為程式碼有地方寫錯,雖然都可以順利地執行,但始終不是正確的畫面,後來才用逐步偵錯的過程中發現原來是有一些數學計算的地方寫錯,很高興可以練習Debug,有人跟我說寫程式大部分的時間是在Debug,所以藉此機會練習而且還可以發現錯在哪真是令人高興的一件事

2013年12月3日 星期二

HW03

HW03

平滑化:
將影像中相鄰的像素(九宮格),給予權重值後乘上像素質再相加並除上權重總和再放置中間處(要變更的點),我直接給予九宮格內上下左右權重為2,中間為4,其他為1,所以將各個權重值乘上像素質並相加後在除16,即為變更後的像素。

銳化:
也是先給予權重值,但將九宮格中間的像素減去(加負值)周圍的像素,我設周圍皆為-1,中間為9,讓變更後的圖銳化的更明顯一點。

中值化:
將九宮格內的像素做排序並取中間值再放回,即為中值化。
完成後看不太出來有什麼差別...


心得:
主要遇到的問題即是Scan line index out of range,自己找來找去都找不出問題,問同學說是image的問題,加上一些程式碼後顯示出上面那些圖,但還是會跳出此問題,最後還是要問老師才發現問題。最後弄來弄去再把很多多餘的程式碼刪掉,並將功能優化,這些地方才是最花時間的地方~


HW3

這次的作業是對圖做平滑化、銳化和中值濾波器。
首先是讀取原圖。
 再來是模糊化的程式執行結果。
 再來是銳化的程式執行結果
 再來是加入雜訊胡椒鹽,方便後面的中值濾波做比較。
 以下就是加入胡椒鹽後的圖和用中值濾波器處理過後的比較圖。

以下這是模糊化的部分程式碼

number1= bPtrImageROW1[3*(i-1)+k]+bPtrImageROW1[3*i+k]+bPtrImageROW1[3*(i+1)+k]+
bPtrImageROW2[3*(i-1)+k]+bPtrImageROW2[3*i+k]+bPtrImageROW2[3*(i+1)+k]+
bPtrImageROW3[3*(i-1)+k]+bPtrImageROW3[3*i+k]+bPtrImageROW3[3*(i+1)+k];
 
       bPtrImageROW4[3*i+k]=(int)((float)(number1/9+0.5));


                                                      010
再來是銳化部分程式碼 用的是 151 方式
                                                      010

number2= (-1)*bPtrImageROW1[3*i+k]+(-1)*bPtrImageROW2[3*(i-1)+k]+
                        5*bPtrImageROW2[3*i+k]+(-1)*bPtrImageROW2[3*(i+1)+k]+
                                        (-1)*bPtrImageROW3[3*i+k];

if(number2>255)
number2=255;
if(number2<0)
number2=0;
bPtrImageROW5[3*i+k]=(int)((float)(number2));



這是  中值濾波器 的部分程式碼
                bPtrImageROW1 = (Byte *)Image2->Picture->Bitmap->ScanLine[j-1];
bPtrImageROW2 = (Byte *)Image2->Picture->Bitmap->ScanLine[j];
bPtrImageROW3 = (Byte *)Image2->Picture->Bitmap->ScanLine[j+1];
bPtrImageROW7 = (Byte *)Image5->Picture->Bitmap->ScanLine[j];
for (i=1; i<iImageWidth-1; i++)
{

for (k=0; k <3; k++)
{
nine[0]=bPtrImageROW1[3*(i-1)+k];
nine[1]=bPtrImageROW1[3*i+k];
nine[2]=bPtrImageROW1[3*(i+1)+k];
nine[3]=bPtrImageROW2[3*(i-1)+k];
nine[4]=bPtrImageROW2[3*i+k];
nine[5]=bPtrImageROW2[3*(i+1)+k];
nine[6]=bPtrImageROW3[3*(i-1)+k];
nine[7]=bPtrImageROW3[3*i+k];
nine[8]=bPtrImageROW3[3*(i+1)+k];
for(int a=0;a<9;a++)
{
 if(nine[a]>nine[a+1])
 {
 int c;
 c=nine[a+1];
 nine[a+1]=nine[a];
 nine[a]=c;
 }
}
bPtrImageROW7[3*i+k]=nine[4];
}
}




做完這次的作業感覺我離Photoshop更進一步了,了解了他部份的原理,程式不強的我也可以做一個簡單Photoshop,這次的作業讓我對於寫程式不再這麼懼怕。


HW3

這次的作業是關於讓圖片模糊化及銳利化的程式
首先來介紹模糊化


原圖
在經過模糊化後,圖片呈現了模糊
雖然似乎看得不是很清楚是有模糊,但是他真的有模糊!!
其中我覺得圖片像素的九宮格那邊最為有趣

sum=bPtrImageRow0[(i-1)*3+k]+bPtrImageRow0[i*3+k]+bPtrImageRow0[(i+1)*3+k]+
bPtrImageRow1[(i-1)*3+k]+bPtrImageRow1[i*3+k]+bPtrImageRow1[(i+1)*3+k]+
bPtrImageRow2[(i-1)*3+k]+bPtrImageRow2[i*3+k]+bPtrImageRow2[(i+1)*3+k];

bPtrResultImageRow[i*3+k]=(unsigned char)(sum/9);


再來是銳利化,銳利化有兩種不同的版本,原因是因為係數的不同,一種是四周都是-1中間為9,一種則是上下左右格為-1,中間為5

首先是第一種四周圍-1中間為9的圖

不知道為什麼她銳利化後的顏色感覺相當不協調
接下來是第二種銳利化的圖

這種銳利化的方式是將上下左右的值設為-1中間為5
他銳利化後的顏色並沒有第一種那麼不協調讓我很喜歡!!

中值濾波

他的改變有點小,其實看不太出來


這次的程式作業讓我做得相當有成就感,希望接下來的作業我也能一一搞懂讓自己更有信心!

HW3

這次的作業是實作空間濾波器,分別是平滑化(模糊化Blur) 、銳化(Sharpen)和中值濾波器(Median Filter)

平滑化(模糊化Blur) 

主要是將影像中不相干的細節減少,將影像中相鄰(九宮格)的像素值給予權重1之後加起來除以9放回原來的像素值(如下圖顯示),要注意的是影像四周相鄰的像素值不是九宮格,所以在做迴圈運算的時候要將影像的寬和高減一。

執行結果,Original Image與 New Image 的差異,New Image 看起來較模糊,尤其是花蕊的部分,這是針對影像四周做處理。


主要程式碼
for(i=1;i<iImageWidth-1;i++)
{
for(k=0;k<3;k++)
{
//9宮格內得數值加起來放入sum
sum=bPtrImageRow0[(i-1)*3+k]+bPtrImageRow0[i*3+k]+bPtrImageRow0[(i+1)*3+k]
+bPtrImageRow1[(i-1)*3+k]+bPtrImageRow1[i*3+k]+bPtrImageRow1[(i+1)*3+k]
+bPtrImageRow2[(i-1)*3+k]+bPtrImageRow2[i*3+k]+bPtrImageRow2[(i+1)*3+k];
//將sum平均做/9動作  
bPtrResultImageRow[i*3+k]=(unsigned char)(sum/9);
}
}


也有些人認為九宮格內,重要的像素點為前後左右四個點,所以給予較高的權重值,將最上圖黃色部分權重值增加為2,所以中心點權重值就為4,加總之後要除以16。以下為給予較高權重值的執行結果。


主要程式碼

for(i=1;i<iImageWidth-1;i++)
{
for(k=0;k<3;k++)
{
//認為前後左右的參考價值比斜對角的還有價值,所以前後左右權重為2,中心點為4,相加放入 //sum
sum=bPtrImageRow0[(i-1)*3+k]+2*bPtrImageRow0[i*3+k]+bPtrImageRow0[(i+1)*3+k]
+2*bPtrImageRow1[(i-1)*3+k]+4*bPtrImageRow1[i*3+k]+2*bPtrImageRow1[(i+1)*3+k]
+bPtrImageRow2[(i-1)*3+k]+2*bPtrImageRow2[i*3+k]+bPtrImageRow2[(i+1)*3+k];
//權重算出來為16,所以sum/16做平均動作
bPtrResultImageRow[i*3+k]=(unsigned char)(sum/16);
}
}
================================================================

銳化(Sharpen)

主要在凸顯強度上的變化,給予前後左右權重值為 -1,而中心點權重值為5(如下圖顯示),然後加總。要注意的是像素值最大為255最小為0,所以我們必須要設定高於255像素值為255低於0像素值為0。


主要程式碼
for(i=1;i<iImageWidth-1;i++)
{
for(k=0;k<3;k++)
{
//給予前後左右-1的權重,中心點為5的權重,相加放入sum
sum=-1*bPtrImageRow0[i*3+k]
-bPtrImageRow1[(i-1)*3+k]+5*bPtrImageRow1[i*3+k]-bPtrImageRow1[(i+1)*3+k]
-bPtrImageRow2[i*3+k];
//計算sum是否超過255,如果超過要=255,如果小於0,要=0
if(sum>255)
                 sum=255;
if(sum<0)
sum=0;
bPtrResultImageRow[i*3+k]=(unsigned char)(sum);
}
}

執行結果,在不同顏色的交界處感覺有白色的邊框,讓整個影像看起來比較銳利。


還有讓影像更銳利的做法就是將周圍(九宮格)權重值給予-1,而中心點權重值為9(如下圖顯示)。


執行結果,因為加上對角-1的權重值,所以整個影像看起來更為銳利。


主要程式碼
for(i=1;i<iImageWidth-1;i++)
{
for(k=0;k<3;k++)
{
//認為9個點的權重為-1,而中心點權重為9,相放入sum
sum=-1*bPtrImageRow0[(i-1)*3+k]-bPtrImageRow0[i*3+k]-bPtrImageRow0[(i+1)*3+k]
-bPtrImageRow1[(i-1)*3+k]+9*bPtrImageRow1[i*3+k]-bPtrImageRow1[(i+1)*3+k]
-bPtrImageRow2[(i-1)*3+k]-bPtrImageRow0[i*3+k]-bPtrImageRow0[(i+1)*3+k];
//一樣判斷是否超過255或小於0
if(sum>255)
sum=255;
if(sum<0)
sum=0;

bPtrResultImageRow[i*3+k]=(unsigned char)(sum);
}
}
================================================================

胡椒塩(Pepper and Salt)

亂數產生0到100的數值,在影像中產生出黑點與白點。
以下為實作情況 : 
上圖為開啟檔案所使用的影像

上圖為灑上胡椒鹽的影像,有黑點也有白點

主要程式碼
for (i=0; i<iImageWidth; i++)
{
  //亂數產生0到100的變數
iRandomNumber = random(100);
//變數小於10,影像的像素值為黑色    
if (iRandomNumber < 10)    
{
bPtrImageRow[3*i] = 0;
bPtrImageRow[3*i+1] = 0;
bPtrImageRow[3*i+2] = 0;
}
//變數值小於20,影像的像素值為白色
else if (iRandomNumber < 20)
{
bPtrImageRow[3*i] = 255;
bPtrImageRow[3*i+1] = 255;
bPtrImageRow[3*i+2] = 255;
}
}

================================================================

中值濾波器(Median Filter)

濾波器主要內容就是消除影像雜訊,實作方法就是將周圍(九宮格)的像素值取出來後作排序,再將中間的值(第5個值)放回原像素點。
執行結果,原本影像要用花朵,因為執行的結果看不太出來,所以使用這張影像來做影像處理。

上個步驟是將影像灑上胡椒鹽,而濾波器這個步驟是將影像的雜訊去除掉。


主要程式碼
for(j=1;j<iImageHeight-1;j++)
 {
bPtrImageRow0=(Byte *)Image7->Picture->Bitmap->ScanLine[j-1];
bPtrImageRow1=(Byte *)Image7->Picture->Bitmap->ScanLine[j];
bPtrImageRow2=(Byte *)Image7->Picture->Bitmap->ScanLine[j+1];
bPtrResultImageRow=(Byte *)Image8->Picture->Bitmap->ScanLine[j];
for(i=1;i<iImageWidth-1;i++)
{
ucNeighbors[0]=bPtrImageRow0[(i-1)*3];
ucNeighbors[1]=bPtrImageRow0[i*3];
ucNeighbors[2]=bPtrImageRow0[(i+1)*3];
ucNeighbors[3]=bPtrImageRow1[(i-1)*3];
ucNeighbors[4]=bPtrImageRow1[i*3];
ucNeighbors[5]=bPtrImageRow1[(i+1)*3];
ucNeighbors[6]=bPtrImageRow2[(i-1)*3];
ucNeighbors[7]=bPtrImageRow2[i*3];
ucNeighbors[8]=bPtrImageRow2[(i+1)*3];
ucMedian=MedianFinding(ucNeighbors);
bPtrResultImageRow[i*3]=ucMedian;

         ucNeighbors[0]=bPtrImageRow0[(i-1)*3+1];
ucNeighbors[1]=bPtrImageRow0[i*3+1];
ucNeighbors[2]=bPtrImageRow0[(i+1)*3+1];
  ucNeighbors[3]=bPtrImageRow1[(i-1)*3+1];
ucNeighbors[4]=bPtrImageRow1[i*3+1];
ucNeighbors[5]=bPtrImageRow1[(i+1)*3+1];
ucNeighbors[6]=bPtrImageRow2[(i-1)*3+1];
ucNeighbors[7]=bPtrImageRow2[i*3+1];
ucNeighbors[8]=bPtrImageRow2[(i+1)*3+1];
ucMedian=MedianFinding(ucNeighbors);
bPtrResultImageRow[i*3+1]=ucMedian;
}
}

================================================================

心得
這次作業都是利用二為陣列去做處理,第一部分的作業,我有使用兩種權重去處理影像,一種為像素值的八方權重為1,另一種為四方權重為2對角的權重為1,但出來的結果似乎差異不大。第二部分的銳化執行出來的結果可以很明顯的知道與原來的影像不同,我一樣也使用兩種權重值去處理銳化的部分,兩種結果差很多,不像影像的平滑化處理。最後是中值濾波器,以這次的作業來說是比較困難的部分,因為要找出像素點的九宮格去做大小排列,選出中間值當此影像像素點的值。