2008年10月3日 星期五

Chapter 2

影像處理課本的第2章,終於開始有使用到Matlab來做開啟影像的動作。這部分利用Matlab的操作,順便說明一些圖片的格式和特性,也有解釋一些簡單的Matlab函數。

首先2.1的地方,書上先一行一行的說明程式碼,並讀取一個灰階的影像來做範例。雖然看不懂的單字還是很多,但是因為程式碼的部分目前比較簡單,所以大致上看得懂它這一部分的意思。他用imread()函數將檔名為wombats.tif的圖片讀取進來,放在w變數裡面,然後再用imshow()函數將圖片輸出在新的Figure的視窗上。在imshow()前面加上figure。這邊比較特別的就是它還有一個設定,就是pixval on。多了這一個指令後,當滑鼠移到圖片上時,左下方會顯示滑鼠座標點的色彩值。因為這個影像是灰階影像,所以左下角顯示的值都是0~255。



這是一張我開起來的灰階影像,左下角的地方分別是座標和裡面的數值。
因為是灰階的,所以顯示的值應該只有0~255。


而2.2則是讀取一個彩色的影像,基本上用到的函數都是一樣的。不過這邊有用到size()這個函數,來顯示儲存這張圖片的矩陣大小,讓我們了解在Matlab中,一章圖片的資料是如何放在變數裡面的。還有用到一個很簡單的語法,輸出矩陣內( i , j , k)位置的值。範例是將圖片放在a變數裡面,所以用到 a(100,200,2)這個寫法,用來查看在這個位置內的值。這邊我發現它儲存的是3維矩陣,後來想到除了平面上用到2維的之外,因為還有R、G、B三種顏色,所以還要再用到第3維的空間來儲存R、G、B三種顏色的值。在這小節的最後面,書上有使用到impixel()這個函數。我實際用Matlab測試之後,發現只要打上2維的座標位置,這個函數會就自動回傳同樣座標中第3維中R、G、B的數值了。



這是一張我開起來的彩色影像,左下角的地方分別是座標和裡面的數值。
因為是彩色的,所以顯示的值應該有RGB三種顏色各0~255。


在2.3中,課本使用imfinfo()這個函數來查詢圖片的一些屬性值,像是檔案大小、圖片的存檔格式和長寬等等的資訊。然後利用這裡面顯示出來的資訊,說明彩色影像的儲存方式,有分利用color map來儲存的和直接儲存RGB 3個數值等等,這部分在第一章裡面也有介紹到。在書上程式的範例中,有出現三種ColorType(顏色型態),利用color map減少圖片檔案大小空間的indexed型態,還有真正儲存RGB數值的truecolor型態,最後一個則是灰階影像的grayscale型態。

下面是我實際找一個圖片,使用函數後回應的結果:

>> imfinfo('arch.tif')

ans =

Filename: 'arch.tif'
FileModDate: '12-Jul-2004 11:39:22'
FileSize: 292440
Format: 'tif'
FormatVersion: []
Width: 263
Height: 370
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: [73 73 42 0]
ByteOrder: 'little-endian'
NewSubFileType: 0
BitsPerSample: [8 8 8]
Compression: 'Uncompressed'
PhotometricInterpretation: 'RGB'
StripOffsets: [37x1 double]
SamplesPerPixel: 3
RowsPerStrip: 10
StripByteCounts: [37x1 double]
XResolution: 75
YResolution: 75
ResolutionUnit: 'Inch'
Colormap: []
PlanarConfiguration: 'Chunky'
TileWidth: []
TileLength: []
TileOffsets: []
TileByteCounts: []
Orientation: 1
FillOrder: 1
GrayResponseUnit: 0.0100
MaxSampleValue: [255 255 255]
MinSampleValue: 0
Thresholding: 1
Software: 'IrfanView '

2.4的內容比較短一些,標題是Data types and Conversions(資料型態和轉換)。我覺得這個就類似C++中,在宣告變數的時候都會一起說明這個變數的型態,例如:Int、Double等等。課本中就有附上在Matlab裡所使用的Data types表格了,就是在28頁的最下面那邊。裡面有5種,分別是int8uint8int16uint16double,有在前面加上"u"的代表它只能表示正整數,不能存負數。而在29頁最上面的表格則是剛剛在2.3裡所介紹的ColorType,這邊是用來轉換ColorType的函數。其實這些函數並不難記,舉例來說,rgb2gray()這個函數的功能是將 RGB格式的圖檔轉換為grayscale(灰階影像)。這個函數的唸法就是"RGB To Gray",中間的2(Two),發音就是To,這樣就可以很簡單的記住這個函數了。

終於看到了2.5的部分,2.5是在說明影像檔案和存檔的格式,這小節幾乎快占掉第2章的一半。老師上課的時候就有說到,儲存影像的格式其實有上百種,而這邊提到的只是平常比較常見的格式而已。課本上有說明10種,分別是JPEGTIFFGIFBMPPNGHDFPCXXWDICOCUR。就我自己來說,平常最常碰到的大概也只有JPEG、BMP和GIF而已,其他有很多根本就沒聽過......

在這邊書上用到dumphex()這個函數,還有在31頁附上這個函數內的程式碼,我不確定這個函數是內建的還是這個作者自己寫的。書上利用這個函數抓出圖檔內部分的資料,再利用這些資料說明剛剛列出10種圖檔格式的特色、差異性等等。最後這一章說明的部分比較多,我沒能夠慢慢的把全部都看完。只好立用老師今天介紹的"泛讀",而我用的是泛讀中的泛讀來看完這一節的。

最後,我覺得第2章除了最後一小節比較難讀之外,前面有程式碼的部分,只要利用Matlab實際操作一下,大概就能知道那個部分要說明的是什麼東西。感覺起來我覺得有比第1章簡單一些,可能是因為敘述說明的部分,用Matlab課本上的程式,就能體會大概的內容了吧。

沒有留言:

張貼留言