Transcript Document
MATLAB 程式設計入門篇:影像顯示與讀寫
影像處理
基本架構與應用
影像處理的基本架構
影像處理方塊圖
數位影像的特色
彩色影像與灰階影像的表示
相關研究領域與應用例
影像顯示與讀寫 -- Matlab
1
MATLAB 程式設計入門篇:影像顯示與讀寫
數位影像基本架構
多分光影像攝影系統
A:遮光布架;B:鏡頭;C:
濾鏡;D:物件承盤;E:交
流馬達;F:可程式控制器;G:
控制盒;H:攝影單元支架;I:
垂直調整台;J:CCD攝影機;
K:水平調整台;L:光源;M:
影像訊號傳輸線;N:個人電
腦
2
MATLAB 程式設計入門篇:影像顯示與讀寫
影像處理方塊圖
Optical
signal
Optical Image
Processing
Video
Camera
Electrical
signal
Analog Image
Processing
Digitizer
Digital signal
Digital Image
Processing
3
MATLAB 程式設計入門篇:影像顯示與讀寫
數位影像的特色
一個影像可被定義成一個二維的函數f(x,y)
當是彩色影像時為(x,y,λ) ,當是動態影像時則為(x,y,λ,t)
x和y是空間座標, λ是光譜或色層, t為時間
f(x,y)的大小是這幅影像在該(x,y)點的強度(灰階)
當x,y,f的大小值都是有限的離散向量時,我們稱這幅映像
是數位影像(digital image)
藉由數位電腦處理數位影像的領域稱之為數位影像處理
(digital image processing)
像素(pixel)
4
MATLAB 程式設計入門篇:影像顯示與讀寫
太陽光電磁波光譜圖
單位:Nanometer
電磁波(Electromagnetic wave)
不可視線(Invisible)波長較短
可視光區(Visible)
不可視線(Invisible)波長較長
γ
射
線
Χ
射
線
紅外線
紫外線 紫 靛 藍 綠 黃 橙 紅 (Infrared 微
(Ultraviolet)
波
light)
200
400
750
超
高
頻
電
視
及
調
頻
短
波
及
調
幅
長
無
線
電
波
106
近紅外線
中紅外線
遠紅外線
6
750
1500
10
4000
生育光線
6000 對人體及動物最有效之波長 14000
5
MATLAB 程式設計入門篇:影像顯示與讀寫
CCD取像原理
S=Photoconductor
能量(光子)
濾波器(分色陣列)
Storage Elements
(電荷儲存室)
電力輸入
S
感應材料(MOS)
電壓波形輸出
座
光感應器陣列
CCD攝影機
(未含鏡頭)
6
MATLAB 程式設計入門篇:影像顯示與讀寫
鏡頭成像
光軸
照度光源
(能量)
攝影機
焦距
S
v
掃描電路
視頻訊號
h
訊號轉換
D
物體
影
像
鏡頭(透鏡)
物距
光感測器陣列
像距
輸出的數位影像
7
MATLAB 程式設計入門篇:影像顯示與讀寫
RGB彩色立方體
Blue
White
(255,255,255)
255
Cyan
Magenta
Black
(0,0,0)
Green
255
255
Red
Yellow
RG B
I
3
8
MATLAB 程式設計入門篇:影像顯示與讀寫
灰階數位影像表示圖
x=13
y=4
Gray value
f(13,4)=123
9
MATLAB 程式設計入門篇:影像顯示與讀寫
彩色數位影像表示圖
10
MATLAB 程式設計入門篇:影像顯示與讀寫
與影像處理相關的研究領域
影像處理 Image Processing
電腦視覺 Computer Vision
改善影像資訊使人能理解
處理影像使電腦能感知物體
電腦繪圖 Computer Graphics
虛擬實境 Virtual Reality
11
MATLAB 程式設計入門篇:影像顯示與讀寫
數位影像處理的應用例子
現今使用的主要影像來源是電磁能光譜
其它尚有超音波圖、腦波圖、心電圖等
12
MATLAB 程式設計入門篇:影像顯示與讀寫
於核子醫學和天文學的應用
a 全身骨格掃描
b 正電子放射斷層攝影(PET)
a
b
c Gamma頻帶天鵝座星環
d 核子反應器的閥
c
d
13
MATLAB 程式設計入門篇:影像顯示與讀寫
X光影像
a
X光是放射線中最早被使用於獲取醫學影像的來源
也使用於天文學、工業上
a 胸部X光
b 大動脈血管圖
c 頭部CT切片
d 電子電路板的X光影像
b
d
e x光頻帶天鵝座星環
c
14
MATLAB 程式設計入門篇:影像顯示與讀寫
紫外光頻帶影像
紫外光的應用包括平板印刷術、工業上的檢視、顯微鏡、雷射、生物
影像、天文觀測
a 正常玉蜀黍
b 被煙煤感染的玉蜀黍
a
b
c 紫外光頻帶天鵝座星環
c
15
MATLAB 程式設計入門篇:影像顯示與讀寫
可見光與紅外光頻帶影像
光顯微鏡產生的影像
a 抗癌因子(taxol) x250
b 膽固醇 x40
c 微處理機 x60
d 氧化鎳薄膜 x600
e CD表面 x1750
f 有機超導體 x450
16
MATLAB 程式設計入門篇:影像顯示與讀寫
可見光與紅外光頻帶影像
遙測上的應用, 華盛頓特區的多光譜影像, 1~7 分別為
17
依據 NASA LANDSAT衛星之七個頻帶所拍攝。
MATLAB 程式設計入門篇:影像顯示與讀寫
NASA LANDSAT 衛星之可見光
與紅外光的光譜頻帶
18
MATLAB 程式設計入門篇:影像顯示與讀寫
可見光與紅外光頻帶影像
世界夜間照明資料庫
美洲的紅外線衛星影像
全世界的紅外線衛星影像
19
MATLAB 程式設計入門篇:影像顯示與讀寫
可見光與紅外光頻帶影像
製造產品的自動檢視應用
a光碟機電路板的控制器
b包裝的藥丸
c 瓶子
d 塑膠產品中的氣泡
e 麥片
f 人眼內的移植物
20
MATLAB 程式設計入門篇:影像顯示與讀寫
可見光與紅外光頻帶影像
影像辨識的應用
a 指紋辨識, b 紙幣辨識, c,d 汽車牌照辨識
21
MATLAB 程式設計入門篇:影像顯示與讀寫
無線電波影像
主要應用於醫學和天文上
無線電波用於磁共振成像(MRI), a 人的膝蓋骨,
b 人的脊椎骨
22
MATLAB 程式設計入門篇:影像顯示與讀寫
其他成像
聲學成像
地質成像
23
MATLAB 程式設計入門篇:影像顯示與讀寫
其他成像
超音波成像
c. 甲狀腺的;甲狀軟骨的;盾狀的
24
MATLAB 程式設計入門篇:影像顯示與讀寫
其他成像
傳送式電子顯微鏡(TEM)
掃描式電子顯微鏡(SEM)
SEM影像
25
MATLAB 程式設計入門篇:影像顯示與讀寫
其他成像
電腦合成影像
26
影像顯示與讀寫
MATLAB 程式設計入門篇:影像顯示與讀寫
MATLAB的影像格式
MATLAB 最常處理的影像格式為索引影像(Indexed
Images)
顯示此類型影像的語法如下:
image(X)
colormap(map)
其中X為影像的資料矩陣,map為色盤矩陣。
色盤矩陣的大小為K×3,每個橫列由三個元素所組成,
分別是R(紅) 、G(綠)、B(藍) ,每個元素的範圍為0~1
X的值為1~K,也就是當X(i, j)的值為p,則像素點(i, j)
的顏色為map(p, :)這一列的值所決定。
MATLAB 程式設計入門篇:影像顯示與讀寫
顯示索引影像
使用MATLAB顯示內建的小丑圖
image01.m
load clown.mat
% 載入小丑影像資料,含變數 X 和 map
image(X);
% 顯示影像
colormap(map)
% 取用色盤矩陣
20
40
60
80
100
120
140
160
180
200
50
100
150
200
250
300
MATLAB 程式設計入門篇:影像顯示與讀寫
顯示索引影像
X 是索引影像,其最小值是 1, 最大值會等於
map 的列數(即「可顯示之顏色數目」)
image02.m
load clown.mat
% 載入小丑影像資料,含變數 X 和 map
fprintf('min(min(X)) = %d\n', min(min(X)));
fprintf('max(max(X)) = %d\n', max(max(X)));
fprintf('size(map, 1) = %d\n', size(map, 1));
min(min(X)) = 1
max(max(X)) = 81
size(map, 1) = 81
此小丑影像共含有 81 種不同的顏色
MATLAB 程式設計入門篇:影像顯示與讀寫
顯示索引影像
要正確地顯示索引影像則需要正確的色盤,以上面的小丑影像為
例,如果使用亂數產生的色盤則會產生下面的結果:
image03.m
load clown.mat
% 載入小丑影像資料,含變數 X 和 map
newmap = rand(size(map));
image(X);
colormap(newmap)
20
40
60
80
100
120
140
160
180
200
50
100
150
200
250
300
MATLAB 程式設計入門篇:影像顯示與讀寫
IMAGESC(...)
IMAGESC Scale data and display as image.
IMAGESC(...) is the same as IMAGE(...)
except the data is scaled to use the full
colormap.
MATLAB 程式設計入門篇:影像顯示與讀寫
顯示索引影像
如果色盤矩陣只有 K 個橫列,但是 X 的某些元素值小
於 1 或大於 K,則可以使用imagesc指令將 X 的最小
值轉換成 1,最大值轉成 K,其他中間值則依線性關係
轉換成介於 1 與 K 的值。
imagesc01.m %sc 代表 scaled
X = peaks;
imagesc(X);
colormap(gray);
min(min(X))
% 顯示 X 的最小值
max(max(X))
% 顯示 X 的最大值
MATLAB 程式設計入門篇:影像顯示與讀寫
顯示索引影像
ans =
-6.5466
ans =
8.0752
5
10
15
20
25
30
35
40
45
5
10
15
20
25
30
35
40
45
具有上述特性的影像資料稱為強度影像
(Intensity Images),一般經由數值運算
產生的矩陣均屬此類,因此均可由 imagesc
來顯示。
MATLAB 程式設計入門篇:影像顯示與讀寫
顯示索引影像
image 指令亦接受全彩影像(Truecolor
Images)
全彩影像可以表示成一個 m×n×3 的矩陣
X,其中 X (:, :, 1) 代表紅色的強度。X
(:, :, 2) 代表綠色的強度,X (:, :, 3) 則
代表藍色的強度。
X的值的範圍可以是下列兩種:介於0~1
的浮點數或是0~255的uint8。
MATLAB 程式設計入門篇:影像顯示與讀寫
image04.m
X = imread('annie.jpg');
image(X);
Y=size(X);
text(10,-10,[num2str(Y(1)),' x ',num2str(Y(2)),' x ',num2str(Y(3))])
MATLAB 程式設計入門篇:影像顯示與讀寫
影像的顯示與列印
MATLAB 在顯示影像時,會將之置於預設的圖軸之
中,並以此圖軸的長寬比來成像,因而造成影像的失
真。若要以影像本身的長寬比來成像,可加入
axis image,如下:
image05.m
50
load mandrill.mat
image(X);
100
150
200
250
colormap(map);
axis image
300
350
400
450
100
200
300
400
500
MATLAB 程式設計入門篇:影像顯示與讀寫
將影像對應到螢幕上的點
若要使影像資料的每一點對應至螢幕上的一個
像素(Pixel),可輸入如下:
image06.m
load mandrill.mat
[m, n] = size(X);
figure ('unit', 'pixel', 'position', [200, 200, n, m]);
image(X);
colormap(map);
set(gca, 'position', [0, 0, 1, 1]);
MATLAB 程式設計入門篇:影像顯示與讀寫
將影像對應到螢幕上的點
此範例產生圖形如同前一個範例,如果你的螢
幕解析度較低,圖形會變大。
上述範例程式碼中, figure 的 ‘position’ 性
質為 [200, 200, n, m],代表視窗的左下角位
置是 [200, 200](以 pixel 為單位),而視窗
的寬度為 n,高度為 m,正好可以符合影像的
大小。
gca 傳回使用中的圖軸,最後一個敘述將圖軸
的位置設為整個視窗的大小,使用了正規化的
單位 。
MATLAB 程式設計入門篇:影像顯示與讀寫
影像的顯示與列印
在列印影像時,MATLAB 會根據視窗的 Paper
position 性質來調整圖形的長寬比,使得印出的影像
再度變形。欲防止情況,可用下列指令:
>>set(gcf, 'PaperPositionMode', 'auto')
若要使 Paper Position Mode 的預設值就是“auto”,
可在 startup.m 檔案中加入下一行:
set(0, 'DefaultFigurePaperPositionMode', 'auto')
MATLAB 程式設計入門篇:影像顯示與讀寫
8-bit影像
在 MATLAB 第 5 版之後,提供了 uint8 的資料
型態。
由於 uint8 只有 8 個位元,所以能表示的數值
範圍為 0 至 255(=28-1) 之間的整數 。
MATLAB 程式設計入門篇:影像顯示與讀寫
8-bit 影像 範例
由於 8-bit 影像資料的最小值為 0,和一般的雙精準索引影像資料
相差 1,因此在兩種資料相互轉換時,要特別小心。
uint801.m
load clown.mat
Z8 = uint8(X-1);
% 將 X-1 轉成 uint8 的資料型態
close all
% 關掉所有的圖形視窗
image(Z8)
colormap(map)
20
40
60
80
100
120
140
160
180
200
50
100
150
200
250
300
MATLAB 程式設計入門篇:影像顯示與讀寫
8-bit影像
若要將 8-bit 影像轉回雙精準影像,可輸入:
>> Z64 = double(Z8)+1;
uint8 資料型態亦可用於全彩影像資料,此時
每一像素的原色(R,G 或 B)範圍為 0 至
255 間的整數,而不再是 0 至 1 的實數。
MATLAB 程式設計入門篇:影像顯示與讀寫
8-bit影像
欲將雙精準的全彩影像轉作 uint8 資料型態,
可輸入如下:
>> RGB8 = uint8(round(RGB64*255));
其中 RGB64 為雙精準的全彩影像資料,而
RGB8 則是 unit8 的 8-bit 影像資料。反之,若
欲進行反轉換,可輸入如下:
>> RGB64 = double(RGB8)/255;
MATLAB 程式設計入門篇:影像顯示與讀寫
影像類別及型態關係表
資料型態
影像類別
雙精準(Double)
uint8
索引影像
(Indexed Images
)
影像矩陣大小:m×n
影像矩陣大小:m×n
影像資料範圍:介於 [1, k] 的整數
影像資料範圍:介於 [0, k-1] 的整數
色盤矩陣大小:k×3
色盤矩陣大小:k×3
色盤資料範圍:介於 [0, 1] 的實數
色盤資料範圍:介於 [0, 1] 的實數
影像顯示指令:image
影像顯示指令:image
(註:k 的值不大於 256)
影像矩陣大小: m×n
影像矩陣大小: m×n
影像資料範圍: 任意實數(但通常是[0,1])
影像資料範圍:介於 [0, 255] 的整數
色盤矩陣大小:k×3
色盤矩陣大小:k×3
色盤資料範圍:介於 [0, 1] 的實數
色盤資料範圍:介於 [0, 1] 的實數
影像顯示指令:imagesc
(色盤通常是灰階)
影像顯示指令:imagesc
(色盤通常是灰階)
影像矩陣大小: m×n×3
影像矩陣大小: m×n×3
影像資料範圍:介於 [0,1] 的實數
影像資料範圍:介於 [0, 255] 的整數
影像顯示指令:image
影像顯示指令:image
強度影像
(Intensity
Images)
全彩影像
(Truecolor
Images)
MATLAB 程式設計入門篇:影像顯示與讀寫
影像檔案的讀取/寫入與支援的格式
imread /imwrite 可用於讀取/寫入影像檔案。
影像檔案格式
副檔名
相關字串
微軟視窗的 Bitmap
bmp
‘bmp’
階層式資料格式
(Hierarchical Data Format)
hdf
‘hdf’
Joint Photographic Expert Group
jpg 或 jpge
‘jpg’ 或 ‘jpge’
微軟視窗的 Paintbrush
pcx
‘pcx’
可攜式網路圖形
(Portable Network Graphics)
png
‘png’
標記式影像檔案格式
(Tagged Image File Format)
tiff
‘tif’ 或 ‘tiff’
X視窗傾印
(X Windows Dump)
xwd
‘xwd’
圖形交換格式
(Graphic Interchange Format)
(第六版才支援)
gif
‘gif’
MATLAB 程式設計入門篇:影像顯示與讀寫
影像檔案的讀取
imread 指令可以讀取上述格式的影像檔案,
並進行必要之轉換,如下:
對於強度影像,imread 將資料以 uint8 的
矩陣(大小為 m×n)傳回。
對於索引影像,imread 將資料以 uint8 的
矩陣(大小為 m×n)傳回,並同時傳回一
個雙精準的色盤矩陣,其每個元素值介於
[0,1]。
對於全彩矩陣,imread 將資料以 uint8 的
矩陣(大小為 m×n×3)傳回。
MATLAB 程式設計入門篇:影像顯示與讀寫
使用imread讀取全彩jpg影像
uint802.m
% uint802
fname='simulinkteam.jpg'
X = imread(fname);
figure,
subplot(2,2,1);image(X);
subplot(2,2,2);image(X(:,:,1));xlabel('X(:,:,1)');
subplot(2,2,3);image(X(:,:,2));xlabel('X(:,:,2)');
subplot(2,2,4);image(X(:,:,3));xlabel('X(:,:,3)');
info = imfinfo(fname)
MATLAB 程式設計入門篇:影像顯示與讀寫
MATLAB 程式設計入門篇:影像顯示與讀寫
影像檔案的資訊內容
imfinfo 指令可用於傳回影像檔案的各項資訊,
例如:
>> info = imfinfo('simulinkteam.jpg')
對於不同的檔案格式,imfinfo 傳回的資訊項目
可能有所不同。
MATLAB 程式設計入門篇:影像顯示與讀寫
影像檔案寫入
imwrite 指令可將資料寫成影像檔
imwrite01.m
% imwrite01.m
load clown.mat
imwrite(X, map, 'myClown.jpg');
imfinfo('myClown.jpg')
!start myClown.jpg
最後一列會呼叫 Windows 作業系
統下的應用程式來開啟
myClown.jpg 檔案。
MATLAB 程式設計入門篇:影像顯示與讀寫
補充教材 --影像處理的技術
基本技術
常見的影像處理
灰階處理
色階分佈
目標區域的選取
範例程式的介紹
MATLAB 程式設計入門篇:影像顯示與讀寫
影像處理的基本技術
型態 Morphology
色層 Color map
紋理 Texture
53
MATLAB 程式設計入門篇:影像顯示與讀寫
常見的影像處理
•影像獲取 (image acquisition)
•影像加強 (image enhancement)
•影像復原 (image restoration)
•色彩影像處理(color image processing)
•小波(wavelet)
•壓縮(compression)
•型態上的處理(morphological processing)
•分割 (segmentation)
•表示與描述 (representation and description)
•辨識 (recognition)
•資料庫 knowledge
54
MATLAB 程式設計入門篇:影像顯示與讀寫
imggray01.m
全彩影像轉換
256灰階影像, 指令rgb2gray
黑白影像,二值化影像, 指令im2bw
% True Color image converts to gray level image and black-white image
A=imread('annietest.bmp'); % Read true color image
B=rgb2gray(A); % True color converts to 256 gray levels (8-bits)
C=im2bw(B,0.5);
% Gray level image converts to 1-bit black and white image with 0.5 intensity threshold
imwrite(B,‘anngray.jpg’); % Save gray level file
imwrite(C,'anniebw.bmp'); % Save black-white image
figure,
subplot(1,3,1);imshow(A);xlabel('true color');hold on;
subplot(1,3,2);imshow(B);xlabel('gray level');hold on;
subplot(1,3,3);imshow(C);xlabel('black-white');hold off;
55
MATLAB 程式設計入門篇:影像顯示與讀寫
imggray01.m 輸出結果
MATLAB 程式設計入門篇:影像顯示與讀寫
imggray02.m
% True Color image converts to gray level image and black-white image
A=imread('annietest.bmp'); % Read true color image
B=rgb2gray(A); % True color converts to 256 gray levels (8-bits)
figure,
for i=9:-1:1; C=im2bw(B,i*0.1);
subplot(3,4,i);imshow(C);
xlabel(['threshold ', num2str(i*0.1)]);
hold on;
end
subplot(3,4,10); imshow(B);
xlabel('gray level'); hold on;
subplot(3,4,11);imshow(A);
xlabel('True color'); hold off
57
MATLAB 程式設計入門篇:影像顯示與讀寫
imggray02.m 輸出結果
MATLAB 程式設計入門篇:影像顯示與讀寫
觀看影像,使用指令imview()
imggray03.m
I = imread('board.tif');
J = rgb2gray(I);
imview(I), imview(J);
[X,map] = imread('trees.tif');
gmap = rgb2gray(map);
imview(X,map), imview(X,gmap);
MATLAB 程式設計入門篇:影像顯示與讀寫
MATLAB 程式設計入門篇:影像顯示與讀寫
影像均勻化,使用指令histeq()
imggray04.m
[X,map] = imread('trees.tif');
imview(X,map), imview(histeq(X));
I = imread('tire.tif'); J = histeq(I);
imview(I), imview(J)
I = imread('cameraman.tif');
imview(I); imview(histeq(I));
h = imview(I,[0 80]);
%close(h)
%Imview close all
MATLAB 程式設計入門篇:影像顯示與讀寫
色階分佈(Histogram)
觀看色階
儲存色階數值
使用指令imhist(A)
使用指令[count,X]=imhist(A)
不同色層
使用指令R=A(:,:,1)
62
MATLAB 程式設計入門篇:影像顯示與讀寫
imggray05.m
function imggray05
[X,map] = imread('annietest.bmp');
R=X(:,:,1); G=X(:,:,2); B=X(:,:,3);
imview(X); imview(R);
imview(G); imview(B);
MATLAB 程式設計入門篇:影像顯示與讀寫
Imgerode01.m
影像侵蝕Erode
imerode(A,N)
影像膨脹Dilate
% Imgerode01.m
imdilate(A,N)
clear all;close all;clc;
%cir=imread('cir.jpg');
cir=imread('annie.bmp');
figure, subplot(2,2,1);imshow(cir);xlabel('original');hold on;
cir=im2bw(cir,.5);% 將cir圖檔二值化
subplot(2,2,2); imshow(cir);xlabel('bw (binary)');hold on;
N=1; N=ones(abs(N)); cir=imdilate(cir,N); % imdilate 膨脹
subplot(2,2,3); imshow(cir);xlabel('dilate');hold on;
N=-1; N=ones(abs(N)); cir=imerode(cir,N); % imerode 侵蝕
subplot(2,2,4); imshow(cir);xlabel('erode');hold off;
MATLAB 程式設計入門篇:影像顯示與讀寫
MATLAB 程式設計入門篇:影像顯示與讀寫
Imgresize01.m
IMRESIZE Resize image.
IMRESIZE resizes an image of any type using the specified
interpolation method. Supported interpolation methods
include:
‘nearest’ (default) nearest neighbor interpolation
'bilinear' bilinear interpolation
'bicubic' bicubic interpolation
B = IMRESIZE(A, M, METHOD)
A, B 為影像
M>1 放大,<1 縮小
MATLAB 程式設計入門篇:影像顯示與讀寫
imgresize01.m
% imgresize01.m
clear all;close all;clc;
%cir1=imread('cir.jpg');
cir1=imread('annie.bmp');
resize=0.5;
cir2=imresize(cir1,resize);
figure,imshow(cir1)
figure,imshow(cir2)
目標區域影像
縮小成1/4影像
67
MATLAB 程式設計入門篇:影像顯示與讀寫
imaoi.m
clear all;close all;clc;
image01=imread('media.tif'); %影像讀取
image01=rgb2gray(image01);%影像灰階化
image01=imcircle(image01,-70,0.15);% 選取圓形區域影像
imk3=['media_B.tif'];
imwrite(uint8(image01),imk3);% 儲存選取圓形區域影像
68
MATLAB 程式設計入門篇:影像顯示與讀寫
Subprogram: imcircle.m
function select_c=imcircle(image,N,tt);
% 將一圓形圖二值化→再膨脹或侵蝕,
% 再選擇圓之大小的區域。
% Cir 為圓形範本圖檔
cir=imread('cir.jpg');
cir=im2bw(cir,.5);% 將cir圖檔二值化
% 對圓形範本做侵蝕或膨脹
% Note:imerode =>侵蝕
% Note:imdilate =>膨脹
if N>0
N=ones(abs(N));
cir=imdilate(cir,N);
elseif N<0
N=ones(abs(N));
cir=imerode(cir,N);
else
disp(' 警告:N 為"0"時會產生影像錯誤。');
End
% 對侵蝕或膨脹後的圓形圖檔作找出
左上角及右下角座標
cir=imselect_bw(double(cir));
% 對侵蝕或膨脹後的培養基圖檔作找
出左上角及右下角座標, tt 為二值化
臨界值[0,1]
image=imselect(image,tt);
imwrite(uint8(image),’step1.tif','tif')
%判斷培養基影像是否大於範本影像
[Cy,Cx]=size(image);
im=zeros(Cy,Cx);
[cirY,cirX]=size(cir);
if (Cy<cirY) | (Cx<cirX)
disp('※警告:影像過大,請更正!')
End
69
MATLAB 程式設計入門篇:影像顯示與讀寫
imcircle.m
% 調整切割位置大小
X=fix((Cx-cirX)/2);
Y=fix((Cy-cirY)/2);
im(Y:(Y+cirY-1),X:(X+cirX-1))=cir;
%
image001=ones(Cy,Cx);
for nnn=1:Cy
for nnnn=1:Cx
if im(nnn,nnnn)==0
image001(nnn,nnnn)=0;
end
end
end
image000=image.*image001;
figure,imshow(uint8(image000));
title('被邊緣去除之部份');
imwrite(uint8(image000),’step2.tif','tif')
%
A=image.*im;
A=imselect(A,tt);
select_c=A;
figure,imshow(uint8(A));
title('區域分割之部份影像');
imwrite(uint8(A),’step3.tif','tif')
70
MATLAB 程式設計入門篇:影像顯示與讀寫
Step1.tif
Step2.tif
Step3.tif
MATLAB 程式設計入門篇:影像顯示與讀寫
Subprogram: imselect.m
function select_im=imselect(image,t);
%
k=size(image);
%┐
k=size(k);
%│
if k(2)==3
% │判斷是否為彩色影像(X,Y,3)。
image=rgb2gray(image); % │
end
%┘
imbw=im2bw(image,t);
[h,w]=size(imbw);
label1=zeros(6,2); % 用來記錄影像之四個原點座標之矩陣。
未完
72
MATLAB 程式設計入門篇:影像顯示與讀寫
Subprogram: imselect_bw.m
function select_bw=imselect_bw(image);
k=size(image);
%┐
k=size(k);
%│
if k(2)==3
% │判斷是否為彩色影像(X,Y,3)。
image=rgb2gray(image); % │
end
%┘
imbw=im2bw(image,.5);
[h,w]=size(imbw);
label1=zeros(6,2); % 用來記錄影像之四個原點座標之矩陣。
% 尋找左端點
for i=1:h
for j=1:w
if imbw(i,j)==1
label1(1,1:2)=[i j];
break;
end
end
if imbw(i,j)==1,
break;
end
End
未完
73
MATLAB 程式設計入門篇:影像顯示與讀寫
補充教材 --紋理分析
紋理分析Texture Analysis
基本技術
SGLDM灰階值共生矩陣
紋理公式
MATLAB 程式設計入門篇:影像顯示與讀寫
紋理分析的基本技術
應用影像元素的灰階值與空間相對位置
進行統計方法的演算與分析,
以了解影像結構內容的方向性
(Directionality)、規則度(Regularity)、粗
糙度(Roughness)等,
當找出紋理描述子後,即可用來比較不
同質地或紋理影像的差異
75
MATLAB 程式設計入門篇:影像顯示與讀寫
SGLDM灰階值共生矩陣
Gray level co-concurrence matrix
0
0
0
2
0
0
2
2
1
1
2
3
6 7 8
5 * 1
4 3 2
1
1
2
3
垂
直
方
向
4X4 四灰階影像
2
2
PH
1
0
2
2
0
0
1
0
3
1
0
0
1
1
水平方向
對角方向
76
MATLAB 程式設計入門篇:影像顯示與讀寫
紋理公式ㄧ
N G 1 N G 1
均勻度Uniformity
熵 Entropy
i 0
Cij lo g Cij
j 0
最大機率Maximum
probability
對比Contrast
j 0
Ci2
j
N G 1 N G 1
i 0
max (Cij )
i, j
N G 1 N G 1
i 0
j 0
| i j |k (Cij ) l
式中Cij 為灰階共生矩陣,指數k、l 值可自行依照影
像特性或影像處理所需來決定值之大小,在本研究
中設定k與l值為2。
77
MATLAB 程式設計入門篇:影像顯示與讀寫
紋理公式二
(Cij ) l
NG 1 NG 1
k階反向差衝量
Inverse difference
moment of order k
相關度 Correlation
i 0
|i j |
j 0
k
i j
N G 1 N G 1
i 0
(i x )( j y )Cij
j 0
x y
式中σx、σy為P矩陣之x與y方向元素的標準差;μx、
μy為P矩陣之x與y方向元素的平均。
行長機率 Probability of
a run of length
其中RP (Run percentages)為P矩陣之元素
的機率分佈,NG為共生矩陣之行向量維度,
NR為共生矩陣之列向量維度。
1 N R NG 1
2
RP (Cij )
[ Cij ]
TR j 1 i0
N G 1 N R
TR Ci j
i 0
j 1
78
MATLAB 程式設計入門篇:影像顯示與讀寫
紋理公式三
同質度
Homogeneity
群聚傾向度Cluster
tendency
NG 1 NG 1
i 0
j 0
Cij
1 | i j |
N G 1 N G 1
i 0
k
(i j 2 ) Cij
j 0
79
MATLAB 程式設計入門篇:影像顯示與讀寫
Imtexture.m
function output=imtexture(image01,K,L)
%
k=K;
% k 階(可自行依影像處理方法調整)
l=L;
% l 值(可自行依影像處理方法調整)
[H,W]=size(image01);
% 判斷影像之解析度 W X H
k1=0;
% 設 k1 為 0
image01=uint8(image01);
%for i=1:H
% for j=1:W
%
histg(image01(i,j)+1)=histg(image01(i,j)+1)+1; % 影像之Histgram 數據
% end
%end
histg=imhist(image01); % 影像之Histgram 數據
未完
80
MATLAB 程式設計入門篇:影像顯示與讀寫
補充教材 -- 線性判別
線性判別 Linear Discriminant
概說
線性判別公式
線性判別流程
正確率
MatLab程式介紹
MATLAB 程式設計入門篇:影像顯示與讀寫
線性判別概說
線性判別分析又稱費雪或費氏線性判別函數
(Fisher’s linear discriminant function),
係利用樣本建立群體間的線性判別方程式或稱
費氏分類函數,並計算待測樣本與已知群組之
馬氏距離(Mahalanobis distance),將其分類到
距群組形心最近之群組,以進行未知樣本的歸
類。
82
MATLAB 程式設計入門篇:影像顯示與讀寫
觀測值歸類
83
MATLAB 程式設計入門篇:影像顯示與讀寫
線性判別的公式
當分類群組僅有兩組時,其線性判別方程式可表示為
1
ˆ
Y ( X 1 X 2 )' X
X 1 X 2 分別為群1及群2的樣本平均值
_
1 n1
X1
X 1i
n1 i 1
_
1 n2
X2
X 2i
n2 i 1
式中n1、n2分別為群1及群2的樣本數
84
MATLAB 程式設計入門篇:影像顯示與讀寫
線性判別的公式(續)
共同變方矩陣之計算公式可表示
^
n1
S1 S 2
n1 n2 2
_
_
S1 ( X 1i X 1 )( X 1i X 1 )'
i 1
n2
_
_
S 2 ( X 2i X 2 )( X 2i X 2 )'
i 1
式中S1、S2分別為群1及群2樣本平方和矩陣
85
MATLAB 程式設計入門篇:影像顯示與讀寫
線性判別的公式(續)
當要判別一未知個體X0位於那群資料時,首先利用下
二式定出群1及群2資料之平均值中心點位置:
ˆ 1 X
Y1 ( X 1 X 2 )'
1
ˆ 1 X
Y ( X X )'
2
1
2
2
再計算未知樣本與兩群體中心點之馬氏距離
ˆ 1 X
Y0 ( X 1 X 2 )'
0
86
MATLAB 程式設計入門篇:影像顯示與讀寫
線性判別的公式(續)
Y0 Y1 Y0 Y2
則X0屬於群1
Y0 Y1 Y0 Y2
則X0屬於群2
87
MATLAB 程式設計入門篇:影像顯示與讀寫
線性判別的流程
計算特徵值
計算未知樣本馬氏距離
計算各群樣本平均值
作歸類
計算樣本共同變方矩陣
88
MATLAB 程式設計入門篇:影像顯示與讀寫
正確率
在300個試驗樣本中,隨機選取200個樣本(有
污染及無污染各100個樣本),作為校正組,以
建立判別方程式,另外的100樣本(有污染及無
污染各50個樣本)則作為測試組,以評判污染
判別正確率。
Nc
100 (%)
No
Nc為測試樣本污染判別正確之數目,N0為所有測試樣本之
數目(在此N0=100)
89
MATLAB 程式設計入門篇:影像顯示與讀寫
Discriminant.m
kk1=[1 2 3 4 4 5 6 2 2 3 4 5 5 6;7 8 8 8 10 10
10 7 9 9 9 9 11 6];%群1訓練樣本
kk2=[5 6 6 7 8 8 9 5 6 7 7 8 9 10;4 4 6 5 5 7 8
8 5 4 6 6 7 8];%群2訓練樣本
kk3=[1 2 3 4 4 5 6 2 2 3 4 5 5 6 5 6 6 7 8 8 9 5
6 7 7 8 9 10;7 8 8 8 10 10 10 7 9 9 9 9 11 6 4 4
6 5 5 7 8 8 5 4 6 6 7 8];%測試樣本
[reslu,inda,err]=Fisher(kk1,kk2,kk3,14,1);
%費雪線性判別副程式
90
MATLAB 程式設計入門篇:影像顯示與讀寫
Subprogram: Fisher.m
%區別分析副程式
%INPUT:fa為無污染樣本,nofa為有汙染樣本,rg為測試樣本,tn為測試樣本實際無污染數
%OUTPUT:reslu為判別結果,inda為辨識率,err為辨別錯誤數,ii設定判別法則(設定"1"為費氏線性判別;設定"1"為馬氏距離判別)
function [reslu,inda,err]=Fisher(fa,nofa,rg,tn,ii)
[rh1,rv1]=size(fa); %群1樣本資料(rh1為維度,rv1為訓練樣本數)
[rh2,rv2]=size(nofa); %群2樣本資料(rh2為維度,rv2為訓練樣本數)
[rh3,rv3]=size(rg); %測試樣本資料(rh3為維度,rv3為訓練樣本數)
somma=sum(fa,2);%群1樣本總和
ssn2=somma/rv1;%群1樣本總和除以樣本數
somma2=sum(nofa,2);%群2樣本總和
ssy2=somma2/rv2 ;%群2樣本總和除以樣本數
mface=ssn2';%群1平均值
mno=ssy2';%群2平均值
xx1=fa;%群1原始資料
xx2=nofa;%群2原始資料
ss1=0;
ss2=0;
%c1=cov(xx1')
%c2=cov(xx2‘) 未完
91
MATLAB 程式設計入門篇:影像顯示與讀寫
Discriminant.m 執行結果
第 1個樣本的判定係數為14.83361
第 2個樣本的判定係數為14.85569
……………..
第27個樣本的判定係數為-4.738
第28個樣本的判定係數為-4.71638
費氏判別錯誤數為2,無污染錯誤數1,有污染錯誤數1,辨識率為92.86
混合共變異矩陣為
S_pooled =
2.4313
0.9918
0.9918
2.0824
線性判別方程式係數
yy =
-2.4465
2.4686
馬氏距離臨界值
cirth =
4.6170
MATLAB 程式設計入門篇:影像顯示與讀寫
補充教材 -- 應用範例
組織培養培養基生物性污染的檢測
進行從影像擷取、目標區域選取、特徵擷
取、及歸類判別等
文章: TissueCulture.pdf
圖集: 圖集.pdf
表集: 表集.pdf