數字影象處理Matlab程式碼【1基本原理】
今天開始學習岡薩雷斯的《數字影象處理》。本文主要記錄書中的例題,以便今後學習參考。
-----------------------------------------------------------20180619-----------------------------------------------------
例2.1 讀入和顯示影象。
>> f=imread('路徑'); %從磁碟讀入,提取影象的基本資訊 >>whos f >>imshow(f) >>figure,imshow(f) %保留第一張圖,顯示第二張 >>imwrite(f,'路徑+檔名','tif') %儲存f到別的地方
例2.2 影象壓縮,影象的一些資訊顯示
>> g=imread('C:\t.jpeg');
>> imwrite(g,'tt.jpeg','quality',25)
>> imwrite(g,'C:\tt.jpeg','quality',25)
>> imwrite(g,'C:\tt.jpeg','quality',5)
>> imfinfo C:\tt.jpeg %imfinfo 的兩種不同用法,還有一種是結構體 命令-函式二元性的例子
ans = Filename: 'C:\tt.jpeg'
FileModDate: '19-Jun-2018 23:44:24'
FileSize: 5823
Format: 'jpg'
FormatVersion: ''
Width: 550
Height: 306
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
還可以結構體形式
>> K=imfinfo('C:\t.jpeg')
K = Filename: 'C:\t.jpeg'
FileModDate: '19-Jun-2018 23:37:15'
FileSize: 22867
Format: 'jpg'
FormatVersion: ''
Width: 550
Height: 306
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
>> K.FileSize
ans =22867
-----------------------------------------------------------20180620-----------------------------------------------------
不改變畫素只改變大小(一知半解)
>> imwrite(f,'C:\sf.tif','compression','none','resolution',300)
2.7.2影象與型別間的轉化
>> g=mat2gray(f) 將原影象的取值範圍變換為區間【0,1】
>> gb=im2bw(g,0.6) 使用閾值0.6將其轉為二值影象
>> gbd=im2double(gb) 將gb轉為一個值為0和1的double數值陣列
若gb是uint8類數值陣列,則對其使用函式im2double可以得到取值為0 0;0.0039 0.0039……
的陣列,因為函式im2double會將所有的元素都除以255。 這種情況下,在保持其值為0和1的前提下要將它轉換為double類陣列,可以使用如下語句:>>gbd=double(gb) gbd= 0 0; 1 1
-----------------------------------------------------------20180621-------------------------------
2.8 陣列索引
2.8.1向量索引
>> v=[1 3 5 7 9]
v =1 3 5 7 9
>> v(2)
ans =
3
>> w=v.'
w =
1
3
5
7
9
>> w=v'
w =
1
3
5
7
9
>> v(1:3)
ans =
1 3 5
>> v(3:end)
ans =
5 7 9
>> v(:)
ans =
1
3
5
7
9
>> v(1:2:end)
ans =
1 5 9
>> v(1:3:end)
ans =
1 7
>> v(1:1:end)
ans =
1 3 5 7 9
>> v([1 4 5]) %一個向量做另一個向量的索引
ans =
>> v=[1 3 5 7 9]
1 7 9
例2.5 使用陣列索引進行簡單的影象操作
>> imshow(g)
原圖a:
圖a
>> fp=g(end:-1:1, :); %把影象垂直翻轉 b
圖b
>> fc=g(30:80, 30:80); %把影象擷取一些 圖c
圖c
>> imshow(fp)
>> fs=g(1:5:end,1:5:end); %二次取樣 如下圖
>> imshow(fs)
>> plot(g(199, :)) %通過原圖a中部的一條水平掃描線
-----------------------------------------------------------20180622-------------------------------
終於結束了沒有意義的工作。希望每天可以多花點時間在這裡。
2.10 M函式程式設計簡介
2.10.1 M檔案
2.10.2 運算子
1執行數值計算的算術運算子
2在數量上比較運算元的關係運算符
3執行函式AND、OR和NOT的邏輯運算子
1注意用. 區分矩陣乘法和陣列乘法 A*B傳統意義上的矩陣乘法。而A.*B則表示陣列乘法,每個元素都是AB相應元素的乘積。
例2.6 算術運算子與函式max和min的示例
例2.11 使用for迴圈將多幅影象寫入檔案
g=imread('C:\t.jpeg');
for q=0:5:100
filename=sprintf('series_%3d.jpg',q);
imwrite(g,filename,'quality',q);
end
結果:
-----------------------------------------------------------20180703-------------------------------
2.10.4 程式碼優化
(1)向量化迴圈
將for迴圈和while迴圈轉換為等價的向量或矩陣運算。
例 2.13 向量化的可計算優點,編寫函式比較for迴圈和向量化程式碼的實現情況:
function [rt,f,g]=twodsin(A,u0,v0,M,N)
tic %Start timing
for r=1:M
u0x=u0*(r-1);
for c=1:N
v0y=v0*(c-1);
f(r,c)=A*sin(u0x+v0y);
end
end
t1=toc;
tic %Start timing
r=0:M-1;
c=0:N-1;
[C,R]=meshgrid(c,r);
g=A*sin(u0*R+v0*C);
t2=toc;
rt=t1/(t2+eps);
命令:
>> [rt,f,g]=twodsin(1,1/(4*pi),1/(4*pi),512,512);
>> rt
rt =
14.1993
>> g=mat2gray(g);
>> imshow(g)
2.10.5 互動式I/O
>> t=input('Enter your data','s')
Enter your data1,2,3
t =
1,2,3
>> class(t)
ans =
char
>> size(t)
ans =
1 5
>> n=str2num(t)
n =
1 2 3
>> size(n)
ans =
1 3
>> class(n)
ans =
double
>> A=[1 2;3 4];
>> disp(A)
1 2
3 4
>> sc='Digital Image Processing.';
>> disp(sc)
Digital Image Processing.
>> disp('QWERTYUI')
QWERTYUI