2009年11月28日 星期六

HW4

這次作業是乘冪律轉換基本形式:
s=c*r^gamma
s為新色彩
r為原色彩

依 gamma < 1 (變淡)與 gamma > 1 (變暗)
至於c則是為了將色彩值調整到0~255 (也就是(255.0)/255^gamma))
不過這樣跑出來會有小黑點(因色彩值0在怎麼縮放都維持0)



為了消去就取巧把色彩值0改成色彩值1
當gamma < 1 (gamma=0.05)


當gamma > 1 (gamma=3)

HW4

這次的作業是使用公式 S=C*(r^gamma),將圖片r經由gamma轉換,並將出來的值乘上常數C維持在0~255之間,得到新的圖片S。由於圖片轉換的時候,會出現黑色的部分無法改變顏色。(腰帶部分)
經過將像素全部往右邊移動後,得到的圖案有明顯的改善。

Gamma:0.2

Gamma:5

2009年11月27日 星期五

HW4

這次作業的公式:s=cr^gamma
s是經過Gamma轉換過後的新色彩值
c是常數,用來做為調整Gamma轉換過後使其s值範圍介於0~255中
r是色彩RGB的值
gamma是此轉換校正的參數值

程式方面我則是套用上面的公式下去撰寫,
寫好且編譯也都過了,執行的時候畫面卻是"黑色"的,
就覺得奇怪,公式上面都正確,也沒出現錯誤,那為什麼還會這樣,
就一直去重新驗算公式是否有錯誤,但是都沒有錯誤,
接著就想說比較有可能錯的應該是"常數c"這個地方,
就把常數c的數值對應輸入的gamma值用人工方式計算出來,
在寫死帶進去程式裡面去計算s值,結果執行結果竟然正確了,
後來才發現,錯了最不應該錯的地方,那就是宣告!!!!!!
我把常數c宣告成int拉,gamma的地方還記得宣告成float,
c的地方卻宣告錯,真的是超無言的。

以下是執行結果:gamma=1.9

HW4

第四次作業的部分是討論有關於GAMMA值的變換
參考運用的公式為 S = C (r ^ gamma)
一開始打程式碼的時候
因為忽略掉了 C 值的常數部份
採用常數預設 "1"
所以一開始所產生的結果有點糟糕
變成 RGB 都會產生超過 255 的結果
所以後來看到學長所提的必須將色素限制在 255 以內
雖然當初老師有提到這部分的問題
可是不太理解要怎樣限制住
回去看自己撰寫程式碼的部分
發現雖然有將限制條件加入
但是放置的位置錯誤
導致重複加乘所以結果錯誤
多次嘗試後結果是正確了
但是卻又發生執行第一次後
如果再次執行會產生圖片不斷的加深或加淡
因為在設定的程式碼部份我是將執行的公式直接放在畫布產生的地方
所以讓預設的 PIXEL 不斷的被覆蓋過去
之後在設定一組新的陣列讓設定過的 PIXEL 放入新的空間中後再放入畫布
結果就成功了!


GAMMA:5

GAMMA:0.5
產生後的結果雖然可以讓圖片更深或是更淺
但是相對的會發生圖片失真或是解析度下降的問題!

HW4

這次的作業是做Gamma Correction
把一張模糊的影像變清晰
首先要套課本上的公式 S=C*(r^gamma)
S為經過Gamma轉換後的值
C為參數值 在這裡C的參數值設成1
r導入公式表示為RGB各個的值
gamma值則是自行設定參數

最後他的公式還要再乘上一個 r/(r^gamma)
因為 r/(r^gamma)表示一張圖在讀進來時他每一點的RGB值都是介於0到255
經過Gamma Correction 後原本的圖的長根寬會有所改變
所以這邊需要做個調整影像大小的動作
以下是執行結果





























經過Gamma Correction後
可以發現原本的不清楚的部分在變清晰了
以下圖為套用在彩色影像
















2009年11月26日 星期四

HW4 - Gamma Correction

在這個作業上,真的不禁得對著自己罵聲髒話...
還記得當初在課堂上,跑出來的圖片一直有小白點...如下圖.



當時一直在想...到底是哪裡出問題!?
不同資料型態轉換出錯!?演算法的瑕疵!?


但卻完全忽略一個地方...那就是圖片的來源.
沒錯,發現之前在存成BMP的時候,不曉得是哪個環節出錯了.
所以才一直跑出這種破圖的結果.


再重新弄一次...




這樣才對嘛...藍色圈圈裡還可以看到所謂的"小黑點."
這次的程式,除了gamma由使用者輸入外,c值也開放由使用者輸入.



所以如果各位有遇到類似的問題,可以試試換張圖片.
就不會像個白癡一樣在那邊找"從未存在的bug"了......

補充:
不曉得跟這個所謂的"位元深度"有沒有關係!?
這部分還請老師解答了.
(左邊的跑出來會有小白點,右邊則正常.)

2009年11月13日 星期五

HW4

原圖:

這次所要交的作業是將原圖做
乘冪律轉換
公式
s=c*(r^garmma)

s為新圖
garmma與c為常數
r為舊圖
個人覺得較重點在於
將(r^garmma)所算出的值
範圍維持在0~255之間
畢竟像素的範圍為0~255所以
c就得設定為(255^(1-r))
RGB分別帶入運算後
在統一家回像素
garmma帶入0.2時結果如下:



加強區域亮度
讓原本過暗的地方
可以清晰顯示

加強區域暗渡
讓原本過亮的地方
亦可清晰顯示

2009年11月11日 星期三

課堂上做負片圖

上一次上課
老師在課堂上
教大家做負片的功能,
負片主要方式就是將每一點的RGB反轉
也就是都用255去減掉RGB值後再取絕對值
利用分析RGB柱狀圖的方式
已經可以分別對RGB作設定

HW3

實作RGB的柱狀圖
利用Bitmap可對二維圖像,
單點RGB個別取值的特性,
個別統計整張圖,
圖中每一列RGB的多寡,
並依照數值可以分析顏色的趨向。
為了控制分析圖的大小,
線性搜尋統計最大者,
當作柱狀圖的大小參考。
code: bmp.GetPixel(x, y).R;
為對bmp 取他的R(red)值 (G 為green)(B 為BLUE)

圖1原圖

圖2柱狀分析RGB圖

HW2

根據上課時所提出的轉換矩陣公式,
利用 bitmap可陣列化的特性,帶入公式。

接著是較難的部分,
定義框架位子。
也就是說你得計算出框架
於新的Bitmap裡的位子。
我選擇用角度
去算出旋轉過後的圖的底下那個三角形。
也就是說下圖紅色的部分
就是我用來訂出框架四個座標點的參考。


當然設計過程包括設計防錯機制,
但唯一的缺點
是我所設定的陣列必須取整數值,
所以對於角度的正餘弦轉換造成的小數值必須取Ceiling
所以在三次以上的旋轉後會造成模糊產生

2009年11月10日 星期二

HW1

首先必須先道歉這麼晚交作業,請見諒。

此為HW1開圖檔並顯示
我在課堂聽老師說要如何開檔後開始研究C語言相關指令
並用C#介面實作
基本上開檔大同小異以宣告一個Bitmap來接收所要求的路徑位子的圖檔(and picture only)
code: Bitmap bmp=new Bitmap(FileName);

圖1 開檔找路徑

圖檔選擇後用Bitmap接收並且直接將Bitmap丟進PictureBox.Image
code: PictureBox.Image=bmp;

圖2 顯示圖片

2009年11月5日 星期四

HW2


這次的作業真的讓我很頭痛

本來上星期就可以交作業的

結果碰上車禍

因為受傷的關係

所以又拖了一個星期......



這次的作業在旋轉的部分碰上了困難

就像上課說的

旋轉前跟旋轉後中心點的座標

上課老師說的

其實都知道問題在哪

但自己用bcb做

就連宣告都不知到該怎麼宣告

後來看了老師部分的程式

才大概了解了一點
總之這次的作業真的有點難









2009年11月3日 星期二

HW3 - Histogram

















上圖為程式畫面,下圖為修圖程式的分析畫面(綠色色版).














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

















上圖為程式畫面,下圖為修圖程式的分析畫面(藍色色版).














這次的作業,是要我們寫出一個Histogram.
其實學期初就有試著寫過了,而很幸運的是也寫成功了.














不過那次是用BCB內建的"Chart"元件來完成的.
算是有一點小作弊吧我覺得,所以這次就老老實實的用"MoveTo"&"LineTo"囉.

將整個作業寫成流程表的話,可大略分為...
1.計算不同的RGB值的出現次數.
2.分別找出RGB個別"出現次數"的最大值.
3.以最大值當分母,將各RGB值當分子,乘上100%來求各個直線的比例,以避免超出你所設的Image的高.

舉例而言,假設一張圖片中的R180出現的次數為1000次為最高.
但用來畫直方圖的Image高卻只有100,那我們便可以將其除以10.
那如果R200出現900次,同理也是將其除以10.

不過以上這個數字只是參考用,如果你發現跑出來的直方圖只有淺淺的一層,
那就可以試著把100%往上調,以求比較合適的表現.

2009.11.03 更新:
更改線條顏色:
Image2->Canvas->Pen->Color=顏色;
顏色的代碼就麻煩自行google囉.

2009年11月2日 星期一

hw3

















這次的作業對我來說.比較困難是在畫圖的方面.再另行補上.先用Memo show出各個value矩陣的值.在value統計上.我用的是map資料結構來儲存.因為之前有做過類似的統計.當時是用map來儲存.所以這次作業我也用我熟悉的來做


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

















這是補上的繪圖統計部分.稍微查了一下如何化線條.然後轉一下他的百分比.以免某些數值的個數高於我拉Image的高.這次的練習又跟第一次寫的不一樣.因為我發現我要繪圖的部分.如果那個值沒有存在於這張圖裡.則map資料結構裡不會有這值.而不是把這個值填成0.所以我另外又改回陣列的寫法.因為我們知道value的範圍是0~255.所以可以直接宣告一個256的陣列來統計和計算.最後在畫線條的時候.再去取得它的出現次數/百分比.

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















我的作業告一段落了.因為沒有辦法一次做很久的時間.所以分蠻多次的.稍微介紹一下我的東西.
我有一個load圖片的按鈕.有一個計算的按鈕.百分比機制.因為怕在某個value的個數太多.會呈現一條線的狀況.所以用了一個卷軸來動態改變那百分比的分母.可以讓分佈更加的明顯.一開使沒有線條變色的觀念.看到人家這樣做也想學習一個.不過好像一直試不出來.最後透過同學幫忙.讓我有pen的概念.我只能說~感恩!!
在重重畫線Imge這部分也讓我卡蠻久的.因為一直沒有好的關鍵字下.所已找不到幫忙!不過後來還是有看到一行. Image2->Picture->Assign(NULL);這對我幫助蠻大的~