Ch. 2: Image Files and MATLAB Types of file formats: BMP : Microsoft Bitmap Pattern JPEG : Joint Photo-graphics Experts Group GIF : Graphics Interchange Format TIFF : Tagged Image File Format PNG : Portable Network Graphics HDF : Hierarchical Data Format PCX : PC Paintbrush XWD : X Window Dump ICO : ICOns CUR : CURsor 1
BMP -- without compression, need larger storage JPEG -- lossy compression, need smaller storage GIF -- lossless compression http://zh.wikipedia.org/wiki/Jpeg 剛剛前面有提到 由於 raster image對我們影像處理來說比較好用 所以我接下來只針對這類的影像格式做比較詳細的介紹 這些是常見的點陣圖 第一個是BMP檔 影像最基礎最原始的格式 就是一開始我們講到的 將一張影像視為一個二維陣列 陣列中的每一個格 代表影像中的 每一個pixel 裡面存著該張影像的顏色資訊 這種儲存方式沒有經過壓縮 顏色越多越逼真 是影像很原始的檔案 像我們掃描進來的檔案就是BMP檔 所以相對的他所佔的空間 就會比較大 第二個是我們最常見的JPEG檔 他其實是一種壓縮的技術 我們對影像經過一些前處理之後 經由 discrete cosine transform 轉成頻譜 原本那些離散的影像資訊阿 就被轉成頻率的樣子表現 頻率有的高有的低 那對一張影像來說 頻率高的就是edge較多的地方 頻率低的就是比較平滑的部分 那JPEG壓縮的精神就在於 他將高頻的地方丟掉 之後再轉回來 像這張圖上 原本的圖 牛的毛清清楚楚 也就是edge比較多 但其實我們有些情況不需要連這些牛的毛都看得清清楚楚 這些部分被轉成頻率之後 就是比較高頻的地方 這些資訊會被丟掉 轉回來以後 就像左邊這張圖 牛的毛 沒有看的那麼清楚了 但我們只要知道他還是隻牛就好 如此一來 這種壓縮技術將比較細節的 不重要的部分捨棄 可以節省很多空間 但相對的影像也會失真就是有破壞性的 由於有些資訊被丟掉了 我們沒有辦法再將它們撿回來重填 所以他沒有辦法再從JPEG檔轉回原本的BMP檔 因為我們已經失去一些資訊了 2
Physically, An image file is a binary file, which can be shown in hexadecimal dump. 3
An image file contains (a) Header: Characteristics of image Image size, Color map, Compression method (b) Image data: Pixel values, Index values Example: BMP Format
中間上面是我現在要讀的BMP圖檔 但對電腦來說就是一堆數字 中間這張圖就是我們的contents 左邊是他的記憶體位置 一開始根據標頭檔的規格抓前面兩個 byte 這兩個數字 表示ASCII code 的‘BM’ 在往後抓四個byte 表示這個檔案有多大 所以我這邊框起來的部分就是content中標頭檔的範圍 現在我們知道它是一個BMP檔啦 所以就可以產出這張BMP Information header的table對照取值 往後抓四個byte 這裡紀錄了此張table的大小 電腦才知道 他要抓多少值以後就抓完我要的 information header 再後面四個bytes 就記錄這張影像的寬有多少(瀏覽一下圖) 所以這個範圍內紀錄了這個BMP檔應該要有的資訊 這個部分 會依照每個檔案格式不同而有所不同 接下來就是我們的 data value 像這裡是 RGB 保留位元 有些檔案如果支援透明度阿法 這裡就會有值 所以這大概是一個檔案進來的時候 電腦怎麼讀取的方法 5
How to read a BMP image? C/C++ Program http://www.cs.ucsd.edu/classes/sp03/cse190-b/hw1/
Open CV Download ftp://140.122.184.4:9876 影像處理區 資源下載 Setting http://iammic.pixnet.net/blog/post/34304039-visual studio-2010%EF%BC%9Aopencv-2.3- %E4%BD%BF%E7%94%A8-webcam 8
// 0讀進灰階圖, 1讀進彩色圖 9
GIF Format Header Name Size Description Signature 6 bytes ‘GIF87a’ or ‘GIF89a’ Global Descriptor 7 bytes Global descriptor Width 2 bytes Width in pixels Height Height in pixels Flags Bit 7 Global descriptor flags Global color map Bits 4-6 Color resolution bits Bit 3 Pixel bits Bit 2-0 Background color 1 bytes +1=color depth Aspect Ratio 好 所以就依照這個方法 GIF檔也是這樣 只是他的標頭檔的table跟剛剛我們講的BMP不同 但道理一樣 這邊我們就不看了 10
GIF Format 11
Example 這裡也是一樣 因為編碼的不同 這些ASCII code 就都不一樣了 像這裡一開始 他的signature 就是 GIF89a 12
Input/Output a color image C(R,G,B). Homework 1: Input/Output a color image C(R,G,B). 2. Transform the color image C into a grayscale image I by I = (R+G+B)/3 ; Output image I. 13
Homework 1. Input a color image C(R,G,B); 2. Transform the color image C into a grayscale image G by G = (R+G+B)/3 ; 3. Show the input and output images C and G. 14
◎ MATLAB 1. Introduction ○ MATLAB: (a) A data analysis and visualization tool (b) Powerful for matrix operations, graphics, and programming ○ Toolbox – a set of programs designed to support a particular task e.g., image-processing toolbox
○ Function – accepts parameters and produces output: matrix, string, graph, or figure e.g., sin, imread, imclose ○ Command – e.g., >> sin(pi/3) >> c = imread(‘cameraman.tif’); >> a = imclose(b); ; : Not display the result on the screen
Multiple commands can be put on a single line, which are separated by commas All data are considered to be matrices e.g. single value -- 1×1 matrix string -- 1×n matrix of characters
2. Use of MATLAB ○ Command window ○ prompt >>
○ Addition, subtraction, multiplication, division, exponentiation e.g., >> 2+2
○ Default format: Internal: double precision Display : 8 decimal places * Entering format returns to the default format
sqrt, log, log10 pi : built-in constant
3. Variables and Workspace Variable: for storing value a and b are displayed in the short format
Internally, MATLAB stores their full values Further calculations
3.1. Workspace -- contains all variables, their data types and sizes To open: (1) use View menu, choose Workspace (2) use whos function Function who lists variables only
4. Matrices Enter a matrix e.g., >> a=[[4 -2 -4 7; 1 5 -3 2; 6 -8 -5 -6; -7 3 0 1]
4.1. Matrix Elements m(i,j) corresponds to m(i+r(j-1))
Extract multiple values from a matrix >> 2:7 ans = 2 3 4 5 6 7 >> 2:3:16 ans = 2 5 8 11 14
>> a(2,1:3) ans = 1 5 -3 >> a(2:4,3) -3 -5 >> a(2:3,3:4) ans = -3 2 -5 -6 >> a(3,:) 6 -8 -5 -6 >> a(:,2) >> a(:)
4.2. Matrix Operations -- add, subtract, multiply, invert power 2 4 -7 -4 5 6 3 -2 1 -8 -5 -3 0 -6 7 -1
○ Geometric operations
○ Dot operators Dot multiplication c(i,j) = a(i,j) × b(i,j)
Dot division >> a./b Warning: Divide by zero. ans = 2.0000 -0.5000 0.5714 -1.7500 0.2000 0.8333 -1.0000 -1.0000 6.0000 1.0000 1.0000 2.0000 -Inf -0.5000 0 -1.0000
Dot power Dot reciprocal
4.3. Constructing Matrices -- zeros, ones, rand, randn, floor Zero matrices >> zeros(5) ans = 0 0 0 0 0
>> zeros(3,5) ans = 0 0 0 0 0 * zeros(m,n,o,p,…) zero(a)
Random integer matrices
A(i,j) = i+j-1
4.4. Vectorization
MATHLAB 介面 1 2 3 4
1 Current Directory -目前檔案所存放的路徑 2 Workspace -顯示目前工作環境中,所有的變數與其數值 3 Command Window -輸入指令與資料之介面 4 Command History -顯示層經在Command Window所用過的指令
基本指令 Enter:執行指令或輸入資料 分號(;): 1.置放於指令結尾處,使其不顯示執行過 程與結 果,但仍會執行輸入之指令 2.在輸入陣列資料時,用於每一個列(row)的結尾 範例:A=[1,2,3;4,5,6] 加 減 乘 除(+、-、×、÷):基本四則運算符號
冒號(:): 1. 產生數列 格式: 起始:公差:結束 或 起始:結束 範例 A=1:2:10 A=[1 3 5 7 9 10] 2. for-loop iteration 格式 for i=1:10 程式碼 end
sin( 徑度 ) cos( 徑度 ) tan( 徑度 ) 三角函數: sin( 徑度 ) cos( 徑度 ) tan( 徑度 ) csc( 徑度 ) sec( 徑度 ) cot( 徑度 ) pi=3.1416 繪圖指令: 折線圖: plot ( x , y ) 長條圖: bar ( x , width ) 產生圖表視窗: figure( number ) 標題:title ( ‘字串’ ) ─放在figure 之後
矩陣宣告: 1. 零矩陣:陣列之內容值(element)皆為0 格式: A = zeros( m , n , … ) 產生m-by-n 之陣列 2. 壹矩陣:陣列之內容值(element)皆為1 格式: A = ones( m , n , … ) 格式轉換 1. 轉換成double:A=double(A) ─計算用 2. 轉換成uint8 :A=uint8(A) ─影像顯示用
陣列運算 基本矩陣運算(Matrix operation) 1.加法運算(+): A+B 2.減法運算(-):A-B 4.次方運算(^): A^c (c is a constant) 元素對元素運算(Array operation): 1. Array multiply(.*): A.*B 矩陣A之元素個別對矩陣B之元素,進行乘法運算 2. Array power(.^); A.^c 矩陣A之元素各別進行次方運算
轉置矩陣運算(Matrix transpose): B=inv(A) 反矩陣運算(Matrix inverse): B=A’
Example:
方程式求解 解法一 解法二 ( for matlab ) A = [4,5;2,1]; b = [10;2]; x = A\b
影像處理指令 讀取影像 imread( ) IM=imread(‘c:\example\pic1.bmp') 輸出影像 imwrite( ) imwrite(TM , 'c:\example\OM1.bmp' , 'bmp' ); imwrite(矩陣名稱, '路徑' , '格式') 顯示影像 imshow( ) imshow(TM); imshow(影像矩陣);
彩色轉灰階 rgb2gray() TM=rgb2gray(IM); 灰階陣列= rgb2gray ( RGB陣列 ) mat2gray():將矩陣轉換成gray scale [0-1] mat2gray(IM) mat2gray(影像矩陣) 取得影像尺寸 size() [height width] = size ( IM ) 取得影像尺寸imfinfo() info = imfinfo ( '檔案路徑' )
RGB to HSI:將RGB的色彩模型轉換成HSI TM = rgb2hsv ( IM ) [h s v] = rgb2hsv ( IM ) HSI to RGB:將HSI的色彩模型轉換成RGB TM2 = hsv2rgb(TM) [ r g b ] = hsv2rgb(TM) RGB to YCbCr:將RGB的色彩模型轉換成YCbCr TM = hsv2rgb(IM) YCbCr to RGB:將YCbCr轉換成RGB
影像濾波器: OM = imfilter (IM, Mask, option1, option2 ) OM:輸出的影像矩陣 IM:輸入的影像矩陣 Mask:處理時所用的mask(window) option:設定邊界的處理與輸出的影像大小 定義Mask: 1. 宣告適當大小的矩陣,並填入數值作為weight 2. Mask= fspecial ( '樣式' , 大小 )
Mask的種類:
Order-statistic filter: OM = ordfilt2 ( TM, order, domain) domain:定義mask的大小 order:指定序數n 範例: 3×3 Median filter OM = ordfilt2 (TM, 5, ones(3,3) )
Histogram of an image: imhist (IM, bin) IM:輸入的影像矩陣(gray-scale) bin:間格數(預設為256) Histogram equalization: OM = histeq ( IM) OM:histogram equaliztion的結果 IM:輸入的影像矩陣
OM = edge ( TM, 'detector' , threshold , … ) detector:定義尋找edge的方法 Edge detection: OM = edge ( TM, 'detector' , threshold , … ) detector:定義尋找edge的方法 threshold:定義edge強度的門檻值 edge只能用在gray-scale的影像 detector 'prewitt' 'roberts' 'sobel' 'log' 'zerocross' 'canny'
Dilation: OM = imdilate ( TM, SE) SE:定義使用的structuring element (mask) Erosion: OM = imerode ( TM, SE) Closing: OM = imclose ( TM, SE) Opening: OM = imopen ( TM, SE)
Structuring element: SE = strel ( shape , 大小 ); shape:定義structuring element的形狀