顯示具有 06360293 楊哲銓 標籤的文章。 顯示所有文章
顯示具有 06360293 楊哲銓 標籤的文章。 顯示所有文章

2020年1月10日 星期五

06360293 楊哲銓 HW5

色彩模型

RGB色彩模型

R(紅色)、G(綠色)、B(藍色)三原色來決定所顯示出的顏色。
若要表示所有顏色需要一個三維空間,因此在平面的螢幕上是做不到的。

因此若要在平面上表示顏色,我們採用了一張圖片+拉條的方式來呈現。
以拉條決定R、G、B其中一個的值,就可以用一張圖片來顯示該範圍內的所有顏色。


YUV色彩模型

以Y(明亮度)、U(彩度)、V(彩度)才決定所呈現的顏色。


實作YUV色彩模型



上方三張圖片為在不同的Y(亮度)情況下所呈現出來的UV平面。
在實作的前提下,必須將YUV的範圍也看成0~255以便轉換成RGB色彩模型中的顏色,整數空間中的公式會比實數空間中的公式淺顯易算得多。

將YUV轉換為R、G、B後即可以顯示在程式上。

點擊YUV色彩模型為圖片加上遮罩

要為圖片加上顏色遮罩,首先必須把原圖片的RGB轉換為YUV,並只保留Y(亮度值)。
UV則以點擊的位置來決定彩度的多寡。


這邊多為了不同的YUV色彩模型的亮度做了處理,遮罩的亮度亦會影響到原始圖片的亮度,但仍會保留原始圖片各個像素的亮度差異。





一旦點擊到了YUV色彩模型,程式會將原始圖片轉換後的Y保留,並以點擊事件中的X、Y參數來決定U、V值(因為圖片大小已設為256,因此X,Y參數皆為0~255,則可直接視為U、V值),在依TrackBar所指定的Y值對原始圖片的Y值做亮度處理,這邊採用:圖片轉換後的Y值-(255-TrackBar指定Y值)的方式對亮度做出差異。

YUV運算好之後需要再轉換回RGB才能填入圖片中顯示。

結論

三維空間中才有辦法顯示出所有顏色,不論是RGB色彩空間或YUV色彩空間皆是如此,因此選用了指定某值,顯示其餘兩值的平面的方式來實作色彩空間的顯示。

原本在點擊套用濾鏡時,YUV色彩模型的亮度不會影響到原始圖片轉換後的Y值,但是覺得YUV亮度不同的情形下應該也要做處理,因此加上了針對點擊位置亮度作調整的步驟。

06360293 楊哲銓 HW4

濾波器

濾波器,亦稱遮罩,下面皆使用3×3的遮罩大小來實作各種濾波器。
濾波器中,每一格都有他的權重,並以中心格為基準點,將八方向及中心格的R、G、B值依權重做處理後,放回並更新中心格。



因為以3×3遮罩大小實作,因此圖中 a、b 皆為 1,w(s, t)表不同遮罩位置的權重,f(x+s, y+t)表原本像素的R、G、B值。

平滑空間濾波器

平滑濾波器主要目的為模糊化、減少雜訊,將圖片一些微小細節移除,使圖片整體看起來較為平滑。

這邊實作了權重和為9與16的平滑濾波器



權種值依上圖所示。

將每個像素放在遮罩的中心格,其餘八方向的像素亦會被遮罩覆蓋。
將每個被覆蓋的像素乘上遮罩的權重,取總和後除以濾波器權重和,也就是取加權平均值,並放入中心位置的像素。



中值濾波器

與平滑濾波器相同,兩者皆有遮罩。但中值濾波器是將3×3範圍內的值做排序,取中位數填入中心格。
此方法對胡椒鹽雜訊處理效果較平滑濾波器佳。





除了中值濾波器外,亦有最大值濾波器、最小值濾波器。
顧名思義,就是取3×3範圍內的最大值或最小值放入中心格。

胡椒鹽處理

與中值濾波器相反,故意將圖片架上雜訊,亦可以再用中值濾波器將雜訊消除。


這邊實作了6%、20%的胡椒鹽雜訊處理,代表每格像素有6%及20%的機率會被取出放入胡椒鹽。
放入胡椒鹽的方法很簡單,將交選出來的像素依1/2的機率轉化為黑或白即可。

銳化空間濾波器

一種可以將圖片對比度提升,讓更多細節能夠被看見。



銳化濾波器使用的是下面的遮罩



僅考慮上、下、左、右以及自己五格像素,將自己飽和度變為5倍後再扣掉四個方向的值得到結果。

結論

濾波器可以說是影像處理一大重點,可以將圖片變更成想要的樣子,不論是移除細節,加強細節,移除雜訊等等,將我們不需要的資訊刪除,需要但不清晰的加強,使整體圖片變得更加容易判讀。

2020年1月2日 星期四

06360293 楊哲銓 HW3

色階調整

色階調整將原圖的R、G、B值依比例做範圍調整,改變圖片中顏色的飽和度。

線性調整

在這邊不先讀取圖片中的像素,因為每種顏色可能重複出現,若每個像素都計算一次可能導致計算量太大、程式運行過久。
因此這邊先執行線性轉換,轉換前範圍為old_left~old_right、轉換目標範圍為new_left~new_right。
圖中newPixel為一大小為256的陣列,因R、G、B範圍皆為0~255,因此不需要分別為三色做轉換,只需要將原始範圍轉換成新範圍即可以應用在R、G、B三色。


圖中公式


將input在原範圍中做比例計算,將計算出的比例移至新範圍,使用同比例求出output。

例如要將0~255中的10轉換為20~200的範圍,將範圍帶入公式中:


計算出10在0~255中佔了多少比例,依同比例在20~200中求出新的output作為轉換值。



上圖為將0~255轉換為128~255的結果示範,圖片整體顏色飽和度上升、圖片整體變亮。



圖中X軸為原數值、Y軸為轉換後數值,顯示將0~255轉換為128~255的線性轉換圖表。


曲線調整

與線性調整的方法相同,先將0~255轉換為新的值,再分別應用在R、G、B三色。
這邊實作曲線調整的前提為範圍必須0~255,並給定一值(如:(100, 150),表100轉換後會變成150)。
有了(0, 0)、(x, y)、(255,255)三個點,可以依數學方法求出經過此三點的曲線函數。

曲線公式:

分別將(0, 0)、(x, y)、(255,255)帶入可以求得a、b、c三值,得到一完整曲線方程式。


上圖為將(0, 0)、(100, 150)、(255,255)帶入的結果示範。



圖中X軸為原數值、Y軸為轉換後數值,顯示經過(0, 0)、(100, 150)、(255,255)三點的曲線轉換圖表。

結論

色階轉換主要是針對圖片的飽和度做調整,若圖片本身對比度就不足,則就算提升了飽和度,圖片依舊不清晰。

如下圖所示:

上方結果的線性轉換圖表:

2020年1月1日 星期三

06360293 楊哲銓 HW2

影像像素概念、直方圖、直方圖均化

全彩影像,紅色、綠色、藍色各有256種,因此總共可以呈現224種。
此作業使用C++ Builder實作對BMP影像中的RGB值做調整修改。


像素

BMP檔案中,每一個像素儲存了R、G、B三原色的值來決定此像素呈現的顏色。
例如:RGB(255, 0, 0) 為純紅色、 RGB(255, 255, 0) 為黃色等。



負片效果

負片效果,顧名思義是將像素中的RGB數值反轉,得到類似底片的圖片。


Byte* bPtrImageRow = (Byte*)Image_Box->Picture->Bitmap->ScanLine[j];
先將BMP中每一行的開頭指標存入bPtrImageRow,再由迴圈處理行中的每個像素。
由於每個像素中存了R、G、B三個數值,因此bPtrImageRow指向的陣列長度會是圖片寬度的3倍。
但這裡仍由「像素」為單位做考慮,並在每個像素中使用for迴圈處理R、G、B三值。
對每個像素中的R、G、B做反轉(255 - 原始值),即所有像素皆會變成原本顏色的補色。



灰階

當R、G、B三值皆相同時,該像素顏色會呈現灰色。
在這邊的做法是將R、G、B三值皆填入平均值,這樣可以保留與其他像素的顏色差異,並將顏色換成灰色。


相同地,先將BMP中每一行的開頭指標存入bPtrImageRow,再由迴圈處理行中的每個像素。
對像素中的R、G、B取平均後,將R、G、B三值皆換成平均值即可得到灰階化的效果。



顏色遮罩

類似使用玻璃紙眼鏡看圖片的效果。
在這邊實作了純紅色、純綠色、純藍色的三原色顏色濾鏡。

概念很簡單,以紅色遮罩為例,將所有像素中只留下R值,G、B皆設為零,即得到紅色遮罩的效果。
※C++ Builder中,並不以RGB的順序來儲存顏色資料,反而是以BGR的反向順序來儲存,因此圖中k!=2代表著當像該位置儲存的不是R值時,設為0。

直方圖

直方圖,將圖片的R、G、B統計後以圖表方式呈現。

開三個大小為256的陣列分別代表R:0~255、G:0~255、B:0~255的個數,並將圖片跑過一次做統計。



這邊將統計資料放入C++ Builder自帶的TChart圖表物件中來顯示。




直方圖均化

對於過暗的圖片來說,R、G、B值皆集中在數值較小的位置,使用直方圖均化將所有顏色平均分布至0~255,使得圖片暗部加亮,可見度增加。
同樣地,對於過亮的圖片來說,R、G、B值皆集中在數值較大的位置,使用直方圖均化將所有顏色平均分布至0~255,使得圖片亮部變暗,可見度亦增加。