顯示具有 01362414 郭捷 標籤的文章。 顯示所有文章
顯示具有 01362414 郭捷 標籤的文章。 顯示所有文章

2015年1月8日 星期四

Color Models

HW5:Color Models

這次作業是畫RGB和YUV色彩模型以及將圖片改成單顏色的圖像
在畫RGB色彩模型的時候我是想用ScanLine的方法
直接圖像的每一個像素點的顏色做修改
因為之前的作業都是先讀一個圖檔,再讀取圖檔
的像素點的顏色做修改。所以如何不用先讀取圖檔就可以使用Bitmap
就成為了關鍵。
經過老師的指導和上網查詢后
我發現下面這個指令可以準備好一個空白的bitmap供修改

Graphics::TBitmap *TheBitmap;
TheBitmap = new Graphics::TBitmap();
TheBitmap->Height = 256;
TheBitmap->Width = 256;
Image3->Picture->Bitmap = TheBitmap;
Image3->Picture->Bitmap->PixelFormat = pf24bit;

有了這個空白的bitmap后就只要使用ScanLine將每一行
的RGB的值根據模型逐漸增加就行了
結果如下:


以第一個模型為例,X軸為BLue,Y軸為Green,TrackBar為Red.
所以第一個模型就表示在R為TrackBar->Position的值的時候
BG用不同程度相加,所呈現出來的不同平面。

YUV 色彩模型與 RGB 色彩模型相同, 也是用三個量來描述顏色, 
分別用 Y 代表亮度 (luminance), U、V 代表彩度(chrominance )
由於BCB中bitmap是用RGB表示顏色,所以如何將YUV色彩轉換
成RGB色彩成為了關鍵


在聽了老師上課的講解和看了投影片后得知套用上面這個
矩陣轉換公式可以實現。


通過TrackBar調整亮度可以得到不同的VU平面

接下來就是通過讀檔將原始圖像show在YUV模型的右邊


接著將圖像處理成灰階
(將每個像素點的RGB替換成RGB的平均數即可)


在寫程式的過程中,我認為將YUV的顏色替換RGB的顏色
是這個程式較為困難的部分

經過多次試驗和上網查詢資料后
我發現將RGB轉成YUV的重點就在Y的值
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16 
我們要先利用上面這個公式計算出這張影像的亮度
然後在用這個Y去計算
C = Y - 16 
D = U - 128 
E = V – 128
R = clip(( 298 * C + 409 * E + 128) >> 8) 
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8) 
B = clip(( 298 * C + 516 * D + 128) >> 8)
                               下面就是轉後后的結果


總結:
經過一個學期的學習,做了幾個影像處理的作業,正如老師所說
感覺就像在做一個簡易版的photoshop
每次寫出作業能將影像做一些修改就很有成就感
感謝老師這學期的指導,讓我對影像處理
有了一些基本的了解,也對影像處理更加有興趣!






2014年12月18日 星期四

Spatial Filtering 實作

HW4:Spatial Filtering

這次的作業是有關模糊化(blur),
銳化(Sharpen),胡椒鹽雜訊(Pepper-and-salt Noise),
中值濾波器(Median Filter)的實作。


這是程式的界面
有兩個Page,第一個Page為Image顯示原圖
第二個Page為Result顯示處理后的結果圖
程序有5個功能(如下圖所示)
1.box blur(快速均值模糊)             
2.Gaussian Blur(高斯模糊)          
3.Sharpen(銳化)                          
4.Sharpen Diagonal(對角戲銳化)
5.Median Filter(中值濾波器)        


一:
第一個是box blur(快速均值模糊)
其做法是將影像中每個像素點的值更改為
其周圍九宮格內像素的平均值


這裡要注意的是邊界不能取到
for (j=1; j<iImageHeight-1; j++)
所以是從1到imageheight-1做scanline
做完box blur的結果(如下圖)


二:
第二個是Gaussian Blur(高斯模糊)
高斯模糊是一種圖像模糊濾波器,它用正態分布
計算圖像中每個像素的變換。
可以理解為加了權重的box blur
它更加注重臨近的點對中間那點的影響


做完box blur的結果(如下圖)


三:
第三個是Sharpen(銳化)
銳化用到了Laplacian(拉普拉斯)運算子
將銳化濾波器的公式簡化可得
 g(x,y)=f(x,y)-∇^2 f(x,y)
=f(x,y)-[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)]
=5f(x,y)-f(x+1,y)-f(x-1,y)-f(x,y+1)-f(x,y-1)
簡化后的銳化濾波器的遮罩(如下)


左邊為只對橫向和縱向做銳化
右邊還加入了對角線的銳化

在做銳化的時候要注意色彩值可能超過255或小於0的問題
沒有做攔截的話可能出現(如下圖)的錯誤


int f=(5*a[4]-a[1]-a[3]-a[5]-a[7])
if(f>255)f=255;

else if(f<0)f=0;
所以這段很重要!
正確結果(如下):


可以發現整個畫面變得更清晰了。

四:
第四個是Sharpen Diagonal(對角戲銳化)
這個與三的區別在對角戲也做了銳化
結果(如下):


可以發現銳化效果相比于三更加明顯。

五:
第五個是Median Filter(中值濾波器)
中值濾波器常可用來消除脈衝雜訊
所以在用這個濾波器之前要先做
胡椒鹽雜訊(Pepper-and-salt Noise)這個動作
影像中的脈衝雜訊是以白點或黑點的形式出現,
所以胡椒鹽雜訊就是用亂數將影像的
某些像素點的色彩值改成黑白色
從而產生胡椒鹽的雜訊效果。
結果如下(這是6%的胡椒鹽):


撒完鹽之後就需要用到中值濾波器來處理了。

中值濾波器是將九宮格內的色彩值,


取出來之後排序,

之後拿取中間值


(這裡引用 99360134 徐賢傑 學長的圖來做說明)

中值濾波器處理后的結果(如下):


看起來會比之前影像模糊一點點

如果是10%的胡椒鹽就還會殘留一些雜訊


總結:這次的作業寫完后很有感覺,不僅模擬了photoshop的功能
還實作了影像的修復與處理。在撒完鹽后又用中值濾波器
將圖像復原的過程很有成就感。還有就是再老師指點完
將銳化的bug處理掉之後,得到了真正銳化的結果。
那個時候有興奮的感覺!
總而言之,這次的實作讓我對影像處理更加感興趣了!







 

2014年11月5日 星期三

levels and Curve Adjustment

HW3:levels and Curve Adjustment

這次作業是levels and Curve調整
和上一個作業一樣需要先讀入檔案
但是比上次多了一個Scrollbox的元件
這個元件可以將圖像裝在一個固定大小的box內
可以較好的控制版面的大小


levels 是可以通過在右邊的方框內輸入數值
來調整input、output的最大、最小值。
輸入的方框用到Edit元件
iInputMin = StrToIntDef(edInputMin->Text,0);
用這行指令讀取Edit元件中的數值
StrToIntDef()函數是用來將字串轉成整數的
逗號後面的0為預設值


上方圖像會隨著Edit元件內的數值的改變而改變
iOutput=iOutputMin+(iInput-iInputMin)∗( iOutputMax-iOutputMin)/(iInputMax-iInputMin)
這裡用到了查表法
利用公式建立一個 levelstable[] 
將0-255的色階值通過公式對應的數值存入表中
實際進行影像處理時,只要透過色彩值做為索引值,
直接查出所對應的輸出值,不需要進行實際的運算,
就可以快速完成整張影像的轉換。
按下apply鍵后可以得到處理后的影像


Curve的部分可以利用ImageMouseDown 這個事件
來取得滑鼠在圖像上的坐標
利用(0,0) (255,255) 和滑鼠的點,三個點可以確定一個
二次函數
y=f(x)=(T-S)/(S-255S) x2+(1-255 (T-S)/(S-255S))x
其中(S,T)為鼠標的橫縱坐標
同樣利用查表法,可以建立一個Curvetable[ ] 
來存放轉換后的色階的數值


要注意當iCurveTable的值大於255
或小於0的時候必須將值強制設定為 0 或 255
如此影像才不會出現亮部突然轉換成暗部,
或暗部突然轉換成亮部的特殊情形
if (iCurveTable[i] > 255)   iCurveTable[i] = 255;
if (iCurveTable[i] < 0)   iCurveTable[i] = 0;


最後用到SavePictureDialog元件
Image4->Picture->SaveToFile(SavePictureDialog1->FileName);
可以將檔案存到想保存的地方

這次作業讓我對用bcb與使用者互動更加了解,
通過元件的event可以完成與使用者簡單的互動
同時SavePictureDialog元件的加入,
可以讓我保存下影像處理的結果。