2014年3月24日 星期一

圖檔的直方均化以及檢測邊緣

這次開放可以使用OPEN CV所以我就直接拿OPEN CV的INCLUDE來實作了

要注意的事情大概就是後期的版本貌似都不支援VISUAL STUDIO 2008

要找2.3.1以前的版本,看網路上的大家都是用2.0這樣

其中,彩色直方圖均化的FUNCTION為這個:cvEqualizeHist

分別需要把R、G、B圖層都扔進去再組合起來

原圖:


結果:


接著是比較有趣的檢測邊緣(欸

其實就是把PIXEL跟PIXEL之間差異太大的地方抓出來

那個區塊就很有可能是邊緣這樣

以數學XY軸來解釋就貌似如此:
第一章是正常平滑的起伏,而第二章突然的色塊就是邊緣這樣

這部分我則是沒用OPEN CV 裡面內建的FUNCTION
而是選擇自己手算,畢竟上次的作業都好不容易把BMP內部搞懂了....
雖然出來的圖很醜(欸

輸出的結果就會是如此:





2014年3月12日 星期三

BMP縮放與旋轉(C/C++)

本次作業(C/C++)主要的課題有二

1. 影像縮放處理以及旋轉(MATRIX)的演算法

2. BMP檔案的格式(C/C++的重點)(參考點陣圖(Bitmap)檔案格式)

為了抓出BMP檔案裡面的RAW資料,有使用window.h

問題在於fread()這個函數抓出來的資料列是一維陣列

所以我們必須將他手動轉成二維以便做計算

在此則有另一個問題則是:BMP檔案又分為24-BIT(無壓縮)以及8-BIT(壓縮)

24-BIT的RAW檔每個PIXEL以RGB三個BYTE表示

8-BIT的RAW檔則是利用HEADER裡面的調色盤來表示,每個PIXEL一個BYTE

演算法部分則分為三種
  1. Nearest Neighbor Interpolation
  2. Bilinear Interpolation
  3. Bicubic Interpolation

在BMP檔案讀取花了較多的時間,所以演算法實做部分只用Nearest Neighbor Interpolation
(當初應該用.NET去寫作業的= =)



而縮放的部分我選擇直接使用一維的方式處理,直接算出縮放倍率並將畫格等比放大塞入新的陣列。以下是結果:
原始圖檔:
放大後:

放大前與放大後畫格差異:






旋轉的演算法則參考這篇(影像處理常見幾何運算)
其中,最主要是要REDIM整張畫布的大小。
且初始化的時候所有值設為HEX<<FF
且要將影像的四個角座標化才比較好實現旋轉的運用

旋轉後結果:

原本還有去查JPEG的檔案影象格式並且實做,但是沒辦法從壓縮過的那些資料列拉出原始影像陣列,然後就放棄了。