顯示具有 03360474 陳鈺翔 標籤的文章。 顯示所有文章
顯示具有 03360474 陳鈺翔 標籤的文章。 顯示所有文章

2016年12月31日 星期六

03360474 陳鈺翔 HW06

色彩模型 & 單色調的影像

【RGB/YUV 色彩模型】

【RGB】

RGB色彩模型是一種加色模型,透光將不同強度的紅(R)、綠(G)、藍(B)三原色相加在一起,來呈現不同的色彩。
在寫程式的時候一開始忘記要把Image元件的位元深度改成24bit,導致一直出錯,改完之後就沒問題了。
透過TrackBar的拉動來改不同平面上的R、G、B的值↴
     

【YUV】

YUV色彩模型跟RGB色彩模型一樣都是用三個量來描述顏色,不同的是Y代表的是亮度,U、V代表的是彩度,透個三個量的強度不同來呈現不同的色彩。
透過以下的這些公式就能用程式把色彩模型表示出來了↴
     
先固定X、Y軸分別代表的彩度,在來透過拉動TrackBar來改變亮度↴
      

【單色調的影像】

首先先從影像上每個點的RGB透過公式算出亮度Y,然後透過MouseDown事件來選擇U、V的值,就可以把影像轉成單一的色調了。要注意的就是,在RGB跟YUV轉換的過程中,有可能不再0~255的範圍內,所以要寫一個判斷來限制它的範圍。

【心得】

所有作業裡面,我覺得最有趣也是最簡單的作業就是這個了,程式部分只要把公式複製貼上幾乎就可以完成,只要注意些小地方,像是範圍要在0~255之間,還有不要搞混YUV跟RGB之間的轉換就可以了。


2016年12月30日 星期五

03360474 陳鈺翔 HW05

濾波器(Filter)

【平滑空間濾波器-Smoothing Spatial Filter】

減少與周圍的差距,來達到模糊化或是雜訊處理,不過雜訊處理的效果不太好。
程式再寫的時候要注意迴圈的範圍,不然會出現下面的錯誤訊息
另外就是9個權重的值相加不能為0,因為 任何數/0 都為無意義,如果為0就會出現下面的錯誤訊息

【執行結果】

使用遮罩

使用遮罩
使用遮罩,雜訊為5%

【銳化空間濾波器-Sharping Spatial Filter】

增加與周圍的差距,來達到銳利化,可以讓影像裡的邊(細節)變得比較明顯。
程式再寫的時候一樣要注意迴圈的範圍,還有9個權重的值相加不能為0,要多注意就是有可能超過255或是小於0。

【執行結果】

使用遮罩
雜訊5%

【中值濾波器-Median Filter & 胡椒鹽雜訊】

用來去除圖片中的雜訊。雜訊通常是影像中比較極端的點,而中值濾波器是取mask裡的中位數,因為中位數可以排除掉mask裡的極值,所以才能把雜訊去掉。
程式再寫的時候一樣看你的mask多大迴圈的範圍就多大。
撒胡椒鹽雜訊,在影像裡隨機位置上撒雜訊,雜訊通常是比較極端的顏色,像是白點或黑點,所以在灑完雜訊後,影像才會變得多出這麼多奇怪的黑色根白色點點。
該注意的地方是,如果在原始圖灑雜訊沒清空的話,他會一直累積,所以要想個清空影像上雜訊的方式,免得出錯。
程式碼部分想了一段時間才知道什麼意思,灑雜訊分成兩部分:
白點
黑點
當初不知道為什麼要這樣做,後來花了時間再想想才想通了,當產生的亂數%100,那只可能出現0~99這100個點中的一點,noise是雜訊的比例,這邊除2代表的是3%白、3%黑;假設目前雜訊比例為6%,白點部分,0~99中97、98、99這三個亂數會大於,所以當出現這三個亂數的話就把它變成白點,黑點同理。

【執行結果】

雜訊10%,mask 3 * 3
雜訊20%,mask 3 * 3
雜訊20%,mask 5 * 5
雜訊40% -> 80% -> 99%,mask 5 * 5
雜訊20%,mask 7 * 7
雜訊99%,mask 7 * 7

【心得】

1.平滑化:
當mask中間的權重很大時,處理完的圖像不會模糊化,反而會更接近原圖,因為周圍的點影響中心點的能力太小了;平滑化一樣可以處理雜訊可是我覺得效果非常地不好,他只把雜訊點變得比較模糊,可是其實還是很明顯,我想原因應該是因為平滑化是對取的每一點乘上個別的權重再取平均,但是平均會受到極值的影響,使每個雜訊點的顏色都沒辦法跟鄰近的點類似,所以平滑化對雜訊的處理是不理想的。
2.銳化:
銳化其實就是用來讓影像細節變得更清楚,像是上面影像中,花的邊跟葉子的邊變得更明顯了;當時做完這些程式後,因為無聊,所以試著對撒過雜訊的圖做銳化,結果發現白點旁邊都圍著一圈黑色,黑點旁則圍著一圈白色這個有趣的現象,透過這個發現到,影像裡的邊界跟雜訊一樣都跟周圍的點的顏色不相似,再加上mask裡中間的權重最高,所以銳化後會讓那個點變得很明顯,才會使的影像中的邊的部分變得更明顯。
3.中值濾波器和撒胡椒鹽雜訊:
這個應該是這次作業裡面最有趣的一個了,看著圖片一堆白點根黑點慢慢的不見超療育的;中值濾波跟平滑化一樣有去除雜訊的功能,可是中值濾波的成效比較好,為什麼?因為中值濾波器處理過的點取的值並不會受到極值的影響,它直接去掉比較極端的點;中值濾波器我寫了3種mask大小,有(3*3)、(5*5)、(7*7)的。
發現了幾種現象:
(1) (5*5)的mask處理後的圖,顏色比較接近原本的,可是影像形狀在雜訊比例越來越高的時候變得越來越不明顯,去掉雜訊點的能力比較強。
(2) (7*7)的mask處理後的圖,它在雜訊比例比較高的時候,形狀比較接近原本的影像,可是處理後雜訊,雜訊還是很多。

2016年12月18日 星期日

03360474 陳鈺翔 HW03

Level & Curve


【Level】


透過自己設定的輸入、輸出的上下界調整影像的色彩明亮度
公式:


【程式撰寫】


1.畫圖
部分程式碼:
//先把線上對應的輸出位置存在一個陣列裡
要注意當輸入>InputMax,輸入要改為OutputMax;當輸入<InputMin,輸入要改為OutputMin
//再把這些點連起來,另外因為圖形的圓點是在左下角,所以y軸的位置是相反的

2.處理影像
部分程式碼:
//處理影像
紅色框起來的部分要注意:
1.當輸入>InputMax,輸入要改為OutputMax;當輸入<InputMin,輸入要改為OutputMin
2.因為是比例關係,所以型態要宣告成float,否則影像處理完會錯誤

【Curve】

利用曲線來調整影像,假設選取的點為(S,T),脫出的拋物線通過(0,0)以及(255,255),利用下面的公式就可以畫出曲線以及新的影像
公式:

【程式撰寫】

1.畫圖
部分程式碼:
//先把對應的點存在陣列裡
這邊要多設一個條件處理X跟Y相同或是X為0的時候,在這兩個情況下程式會出錯,所以要另外處理
//再把點連接起來,這邊判斷y = 0是因為在這個地方畫出來的線不太明顯,所以把它往上移

2.處理影像
部分程式碼:
//處理影像


【實驗結果】
1.Level



2.Curve
//曲線凹向下

//曲線凹向上




【心得】

Level的部分,使用上課推導出來的公式,就能簡單的把線以及對應輸出的色彩值找出來,比較要注意的只有變數的型態,因為用到三角形的比例關係,所以型態要用float或double,如果使用int的話就會處理錯誤,當初在這邊花了一個多小時才發現到。
Curve的部分,也是使用上課推導的公式,就可以把曲線以及對應的影像處理出來,那要注意的地方也跟Level差不多,像是變數的型態、Image元件的元件的原點位置,只要該注意的地方弄好就可以容易的寫出來了。
接下來對照上面的圖可以發現,Level因為有設定輸入輸出的上下界,所以處理完影像後的統計直方圖可以明顯的看到它的色彩值被限制在一個區域裡面,那從影像來看則可以看到本來很暗的地方變得稍微亮一些,本來很亮的地方則變得比較暗;Curve分成兩種:1.曲線凹向下 2.曲線凹向上,第一種可以發現影像變得更亮了,從曲線可以看到當曲線凹向下的時候,輸出的值會變得比原本的輸入還來的大,對照到統計直方圖就可以發現亮度比較高的色彩值出現了,第二種則是曲線凹向下,影像變得比較暗的原因同理可證。

















2016年12月4日 星期日

03360474 陳鈺翔 HW02

直方圖、直方圖均化


【直方圖均化】


用於增加影像的對比度,可以讓影像的亮度有更好的表現;實際實驗後發現在影像過度曝光、曝光不足或是背景前景太亮或太暗有不錯的效果,可以讓影像某些部份變得比較清楚,可是在對失焦的圖做均化則沒有什麼效果,甚至做完均化後圖片反而變得更糟......。

【程式撰寫】

1.畫出直方圖跟累積直方圖
部分程式碼:
//直方圖
//累積直方圖

2.直方圖均化
部分程式碼:
//計算累積最大值
//計算目前累積值
//直方圖均化
公式: g(x,y) = 255 * cdf( f(x,y) )  --->  色彩值 = 255 * ( 目前累積值 / 累積最大值 )

3.畫圖
部分程式碼:
利用TImage物件裡的內部函數就可以完成
//設定畫筆顏色(紅色)
//移動畫筆到點(x1,y1)
//從目前的點(x1,y1)畫一條線到(x2,y2)

【實驗結果】
1.過度曝光












2.影像部分區塊亮度不足

3.失焦

【心得】

對應上面的直方圖跟累積直方圖:
1.從直方圖可以發現,本來統計後很擠的位置,在做過均化後整個分散開來了。
2.從累積直方圖可以發現,都變成了比較像三角形的形狀,也就是說它的累積值的變化是比較固定的彼此之間不會有太大的差異。
以上兩點可以知道在做過均化後的圖片,影像的亮度變得更平均。
這些在上面實驗結果的第1跟2項可以看到紅圈部分變得更清楚了 !
寫完程式後,想了一下均化的用途是在對影像做對比度的調整,可以讓比較暗的地方變得比較亮、比較清晰;既然在影像過度曝光、曝光不足或是背景前景太亮或太暗的這些情況下使用會有不錯的效果,那麼再失焦的影像上做處理會有什麼情況產生了點興趣。均化後發現亮度的確變的平均了、本來不明顯的地方也變的明顯了,可是圖片變得更糟了,所以我覺得對失焦照片做均化應該是沒有什麼效果。
在寫影像處理程式的時候,通常使用雙重迴圈再加上幾行負責處理的程式碼就可以完成,而這次的直方圖以及累積直方圖也是如此,所以在寫程式的時候也沒有遇到什麼困難,比較要注意的只有在畫圖部分,TImage物件的(x,y)原點是在左上角,y往下是增加往上是減少,這邊跟平常習慣的不太一樣,所以花了點時間適應。唯一遇到問題是讀取某一些影像會出現"stream read error",雖然上網找了資料,可是看不懂......,目前只知道用Photoshop CS把影像存為BMP檔再用BCB打開的時候才會發生。