2012年10月18日 星期四

99360134徐賢傑



這次的影像處裡作業,我是用C#去撰寫的,因為專研用了C#,怕說又用了Build C++ Xe2去寫,指令會錯亂,於是私底下去查了關於影像方面基本的使用指令。
先前有上過黃世育老師的互動電子技術專題課程,其中有交到OpenCV的一些觀念,私底下也有找過老師詢問影像在記憶體存放位置與概念。
在這學期的影像處理課堂上,也有事先預習課外讀物,並買了老師指定用書,雖然所學淺薄,對影像處理涉略不深,導致課堂上許多地方一知半解,回家也上網查詢許多資料,像是最基本的RGB色彩值也在小畫家上配對玩了許久。
對於程式碼這個部分,在前一週老師課堂上有講解與解釋了程式碼的概念與用法,我再搭配了之前在黃老師的課堂上所到的一些概念,大致上是懂了許多。到了下課也還是有四五位同學問我程式碼的部分,所以在課堂上幫同學舉手提問,對於記憶體的存放位置的問題,也加深與確認自己的概念是否正確。
片是由一個個的點所組成,每一個點又存放了三~四個色彩值(RGB+透明度),程式是將每一個點取出來後再把每個點的RGB分別的色彩值取出,並分類到自己設定的矩陣並且去計算個數,再去做累加或是均化的運算。




以下借用老師的小鳥圖
Histogram之後






均化之後

小鳥圖




另外比較還在深入探討的是所謂的均化”(equalization)的含意到底為何?

用意是為了將圖片對比呈顯更鮮豔,我寫的是將每個RGB的色彩值累加後,計算其在整張圖的百分比(除以total_pixel)再乘上255,乘出來的數是0~255之間,並不太了解呈現出來的是甚麼東西?
在思考及猜想後,我將原本RGB的色彩值放入新的乘出來的數
R3[R2[i]] = R[i]; 
//R = 原圖的RGB色彩值陣列;R2 = 乘出來的數值陣列;R3為均化後的直方圖
以下此為實際做出來的圖片
但似乎是與其他學做出來的有點出入..


研究了許久
b.SetPixel(i, j, Color.FromArgb(R2[b.GetPixel(i, j).R], G2[b.GetPixel(i, j).G], B2[b.GetPixel(i, j).B]));
這行指令實在是研究了很久才出來的

也是將均化的部分觀念釐清才有的成果

這張圖是我在去年跨年2011到2012年到福隆海水浴場所拍的
在台灣的第一道曙光

        因為天色昏暗,也沒有使用閃光燈,而且使用的是手機照相,因此整張圖顯得昏昏暗暗且模糊,下面是這張圖的Histogram。











經過均化(Histogram Equalization)處理之後


經過處理過後,其實可以發現很明顯的場景地點和山脈,當時人群是很擁擠的!





然而我發現一件很奇妙的事情,均化之後的Histogram累加圖,都是三角形形狀且呈現了階梯型的形狀!!






均化其實可以將昏暗的圖片把顏色對比明顯的呈現出來,然而我想了又想,有了個疑問!!!
假如均化可以將昏暗的圖片呈現明顯的顏色對比,那如果放上一張太過亮的圖片呢?會不會將顏色對比也顯現了出來?
於是我翻了翻自己的圖片庫找到了一張大一時期,和同學騎車上山賞景的一張拍得太亮的照片



可以明顯看到三種色彩值在255(最亮)的地方飆高!






均化過後,很奇怪的事發生了,結果不如自己猜測....








看到這個照片變成這樣,其實思考了一段時間,是不是背景"白"的部分太多,導致百分比會像這樣子差距這麼大,感覺色差完全失控。


看了一下累加的部分,依然是階梯狀,但在顏色Level.254的地方,累積的部分才41~42%左右,可見有58%的部分全部都是"白色"。

或許是這張圖太過於慘白,所以沒辦法顯現出原本的色彩,也或許是相機不夠好沒辦法將背景的顏色細微差別拍
程式打到最後,其實會越想越多,想加入的功能越寫越多,不過還是能細分成幾個方法,加入新的功能只要呼叫幾個需要的方法就可以完成。自己也有請教參考過其他人的程式碼,很多地方其實可以是縮減的,除了精簡更要效率,現在訓練自己除了邊打程式,還要邊想怎麼做個整理,才不會到最後維護不易。

剛寫出來這樣的程式碼,當程式編譯過且圖片跑出來的時候,不禁開始思考,原來網路上許多圖片編輯軟體,原來就只是這樣而已,再加上許多功能上去而已


接著就又有想要寫寫看轉換成灰階的程式,當作是自己的練習與磨練。等到有空閒的時間就會試著寫寫看。
<<我的程式是完全自己手動打的,完全無抄襲,我堅信自己手動寫過操作過才能真正了解其中含意,以下附上自己做的程式,我知道許多功能尚未出來,但沒有可以詢問的對象,只能慢慢從網路上尋求資源,若有BUG敬請見諒>>

沒有留言:

張貼留言