顯示具有 2013HW03 標籤的文章。 顯示所有文章
顯示具有 2013HW03 標籤的文章。 顯示所有文章

2014年1月3日 星期五

HW03

空間濾波器程式實作

這次的作業是有關模糊化、均銳化、胡椒鹽化等等。

這是這次的原圖


均化後始得圖片更加的模糊,
模糊化就是將一個像素點跟周圍8個點加起來後平均,
感覺挺明顯得。


銳化後使得圖片更加銳利,
將中間的像素點*9-周圍的像素點,
圖挺銳利的。






HW03

均化

我們將一個像素點設為我們的主要像素點,
並將他周圍的另外八個像素點與自己相加並一起平均,
我們就能達到模糊的效果。

銳化

我們將除了主要像素點權重值設為 9,而周圍的八個像素點的權重值都設為 -1。



HW 03 LEVEL CURVE

對於基本的RGB有了認識之後
接著要了解圖片色階亮度和色彩有甚麼相關性

下方是一張柴犬的相片
在圖片的右方有4個 輸入值可以輸入

輸入之後 接著應用到圖片中
輸入時 會有曲線的顯示
以便看出變化


很明顯地色階 被降低了
圖片整個都變暗了
這種功能可以應用在夜晚拍照時
天色過差  光線不足時的應用
對於攝影是一個大功能  可以排除天色的因素


而CUVER的應用  則是 使暗區 更暗  亮區更亮
換言之 就是使照片對比更加強烈
除了應用在夜間攝影之外
一些風景 樹林  山脈的攝影也可應用
在單幾個色彩之下 色彩的對比也相當明顯

2014年1月1日 星期三

HW03

空間濾波器程式實作

這次做的程式是把圖片作特殊的修改友均化(模糊化)、銳化(清晰化)、胡椒鹽(雜訊化)、均值(處理雜訊) 、這些都是在一些繪圖軟體裡常見的特效,這次就來實作看看這些功能。

--------------------------------原圖--------------------------------

 --------------------------------均化--------------------------------


這是模糊化之後的現象,程式所做的事是把圖片中RGB色塊中的值,在周圍做平均。
說明:
                              這是一個RGB的像素,由左到右分別為藍、綠、紅,

 
這是9個像素點
把相同顏色圈起來的值相加平均起來
結果
此值不會固定住,因為是每移動一個像素就在此像素點的周圍做平均

-------------------------------------------------------------------------------------------


--------------------------------銳化--------------------------------
這難起來是不是有種比較清楚,銳利化的感覺呢?這個程式的作法是將自己的像素點乘以5減去自己上下左右的像素。
說明:
紫色的乘以5減去紅色的部分
對了,如果值會小於0就等於0,大於255就等於255

-------------------------------------------------------------------------------------------


--------------------------------胡椒鹽--------------------------------
 這是設隨機值時會出現黑點或白點,RGB(0,0,0)時是黑點,反之RGB(255,255,255)是白點

-------------------------------------------------------------------------------------------


--------------------------------均值(假)--------------------------------
這是把9個像素點做排序之後取中間值的結果。
說明: 
以自己50那個為中心,圈裡來的做排序,(10,11,25,30,50,85,100,123,211),中間值為50,就取50放回自己的值。
P.S.此資料剛好為自己就是中間值而已。
然而我發現我好像做錯了,不論怎麼多加胡椒鹽,均值化出來的圖都一樣。重點是任何黑白點都沒有,而且感覺上我好像把圖弄成水彩畫的感覺。

-------------------------------------------------------------------------------------------

--------------------------------均值(真)--------------------------------
仔細查看後發覺我錯在哪,我把排序後的值直接存回撒胡椒鹽的圖去,應該要另外開個空白的圖存進去。結果真的有胡椒鹽變少的感覺!!

HW03

這次的作業是空間濾波器實作,首先是第一個課題,模糊化(Smooth)。

這是原圖

處理後的圖
這次的程式碼其實不難,只要知道原理就差不多了。
其原理就是找九宮格,然後把這九宮格裡的色彩值做均化的動作,顧名思義,就是把九宮格裡的色彩值加總起來再平均就可以做出這個效果,這部分做得很順利,程式碼沒有什麼大問題。

第二個課題就是銳化(Sharp)。

這是原圖

處理後的圖

在做銳化的過程中,有個BUG一直找不出來,不管怎麼測,都會變成下圖。

中BUG啦!!!
之後發現原來是處理銳化的過程中把它轉成byte來顯示了,只要不用byte顯示,它就會正常。
最這課題的唯一問題就是這,但是銳化的原理還是不太清楚,得多多google了。

接下來就是雜訊啦,不過上圖那個應該就算是雜訊了吧。

這是原圖

處理後....好醜阿!!!

喔不!!雜訊太多了,圖片美感都被破壞了,想了一下,只要把亂數取值調大就好了。

更新
還是這樣比較好!!不過之後還會做到中值濾波器,把雜訊處理掉應該就沒什麼差別了。



2013年12月9日 星期一

HW03

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

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



1.
首先是銳化

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

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












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

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






2013年12月3日 星期二

HW03

HW03

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

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

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


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


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,但出來的結果似乎差異不大。第二部分的銳化執行出來的結果可以很明顯的知道與原來的影像不同,我一樣也使用兩種權重值去處理銳化的部分,兩種結果差很多,不像影像的平滑化處理。最後是中值濾波器,以這次的作業來說是比較困難的部分,因為要找出像素點的九宮格去做大小排列,選出中間值當此影像像素點的值。