教程:通過MATLAB進行數字圖像處理仿真的快速上手;

MATLAB是一款數學軟件,是MatrixLaboratory(矩陣實驗室)的縮寫。它把數學中的矩陣和線性代數等知識和傳統的計算機編程語言結合到了一起,並內置了豐富的庫,讓很多算法輕鬆實現仿真化成爲了可能。比如,你通過數學寫了一個二維圖像灰度變換的函數公式,可以在matlab下輕鬆地像以C語言math情況下去描述它,並實現賦值計算,再通過它內置的圖形計算庫還可以把你的算法完完全全仿真出來。

MathWorks公司歷史悠久、團隊強大、產品專一。它的matlab產品可用於多種學術研究專業,這樣首屈一指的軟件使得它在全世界都十分流行。也是數字圖像處理仿真的好幫手。本文送給從未接觸過matlab的朋友們。


關於數圖處理的一些前景知識;

圖像處理系統基礎設計的一個重要特點是測試和實驗的有效程度。系統方法和快速原型候選解決方案的能力在減少運算開銷和時間方面起着重要的作用。

一幅圖像可以定義爲一個二維函數f(x,y),其中x和y是空間座標,而f在任意座標(x,y)處的幅度稱爲圖像在該點處的亮度和灰度。彩色圖像是由多個單色圖像組合而成。當x,y和f的幅值都是有限的離散值時,稱該函數爲數字圖像。數字圖像是由有限數量的數組組成的,每個元素都有一個特殊的位置和數值。這些元素稱爲圖片元素(picture element)、圖像元素(image element)和像素(pixels\pels)。

數字圖像處理分爲低中高三種處理: 低級處理包括原始操作(降低噪聲、對比度增強..),輸入輸出都是圖像。 中級處理(分割..),把圖像分爲區域或目標,然後對目標進行描述。輸入是圖像,輸出是圖像提取出的屬性。 高級處理通過執行通常與人類視覺相關的感知函數,來對識別的對象進行總體確認。


matlab與數字圖像處理的一些關係;

一幅圖像可定義爲一個二維數組f(x,y),其中x和y是空間(平面)座標。圖像關於x座標、y座標和幅度是連續的。將座標值數字化稱爲採樣,將幅值數字化稱爲量化。當x、y和幅值f都是有限的、離散的量時,我們稱該圖像爲數字圖像。

採樣和量化得到的是一個實數矩陣。假設對一幅圖像f(x,y)採樣後得到一個M行、N列的圖像。我們可以稱這幅圖像的大小是MxN,座標的值是離散量。

這樣,一幅二維數字圖像就可以把它看做成一個矩陣函數f(x,y),把陣列的每個元素賦值就可以顯示出東西。這個陣列的每個元素都稱爲圖像元素、圖畫元素或像素。一個1N的矩陣被稱爲一個行向量,一個M1的矩陣被稱爲一個列向量。一個1*1的矩陣則被稱爲標量。

把二位數字圖像看成矩陣,這樣我們就可以輕鬆地在matlab中做各種仿真嘗試惹。


matlab數據的表示和運算;

matlab的命令行(>>)窗口是我們操作matlab的一個重要媒介。

我們可以進行一些簡單計算,比如把2+2的值賦給變量a。

a=2+2

如果輸入的表達式後面加上分號;的話,那麼結果就不會顯示出來。還有,matlab的變量名是對大小寫字母敏感的。它主要支持以下數值運算符:

+(加)、-(減)、*(乘)、/(除)、^(冪)、'(矩陣轉制)。

同時,matlab中還提供一些預定義變量可以直接使用。

i或j    根號1
pi      π
abs     數值的大小(實數的絕對值)
angle   複數的角度,以弧度表示
real    求複數的實部
imag    求複數的虛部
cos     餘弦函數,假設角度是弧度制
sin     正弦函數。假設角度是弧度制
exp     指數函數
sqrt    求平方根

matlab矩陣的表示和運算;

我們可以指定元素建立向量。創建一個1*4的行向量:

v=[1 3 5 7]; 或 v=[1,3,5,7];

也可以增加向量,變成1 3 5 7 8:

v(5)=8;

用等間隔元素建立向量:

t=0:.1:10;

這個命令創建了一個1*101的向量,元素爲0,0.1,0.2,…,10。這個表達式中前面的數字表示初值,後面的數字表示終值,中間的數字表示增量。

函數linespace和logspace也可用於創建向量;

x=linespace(a,b,n);
a表初值,b表終值,n指定元素個數,默認n爲100,x是1*n的線性等間隔分部的向量。
x=logspace(a,b,n);
a表示的向量初值爲10的a次方,b表示終值爲10的b次方,n指定元素個數,默認n爲50,x是1*n的向量,這n個元素取以10爲底的對數後在[a,b]間等間隔分佈。

矩陣可以通過輸入行列元素獲得:

M=[1 2 4;3 6 8];
M=1.00  2.00    4.00
  3.00  6.00    8.00

矩陣特定位置元素可以通過下面的命令賦值:

M(1,2)=5;

用下面幾個命令可以定義一些特殊矩陣:

M=[];            空矩陣
M=zeros(n,m);    n*m的0矩陣
M=ones(n,m);     n*m的1矩陣
M=eye(n);        n*m的單位陣

要得到向量或矩陣的規模可以用下面這兩個函數:

[r,c]=size(A)   r、c分別爲矩陣A的行數和列數
n=length(b)     n爲向量b的長度

matlab部分基本常用功能;

波形的繪製:

plot            繪製曲線圖
stem            繪製杆圖
hold on         保留當前圖形及座標的全部屬性
hold off        恢復圖形設置缺省值
grid on         畫網格線
grid off        去掉網格線
subplot(m,n,p)  將當前窗口分成m*n個子圖,並選擇在其中第p個上繪圖
figure          創建圖形窗口
xlabel          橫軸標註
ylabel          縱軸標註
legend          在右上角建立一個圖例說明盒
axis            確定座標軸刻度範圍
text            在圖中特定位置標註

數據的輸入和輸出:

load my.mat     調用my.mat數據文件
load data.txt   調用txt文件,並生成與文件名同名的變量
save my t y     把變量t和y保存名爲my.mat的二進制文件
save data.txt t y-ascii
把變量t和y保存名爲data.txt的8位ASCII文件

其它常用matlab命令:

who     列出內存中的變量名
whos    列出內存中變量的詳細信息
clc     清除命令窗口
clear   清除內存變量和函數
clf     清除圖形窗口
sound   對聲音進行回放
help    幫助

你還可以嘗試在安卓或ios端安裝matlab官方的遠程軟件操控電腦端的matlab,需要局域網環境和較新版本的matlab。

connector on
connector on password
connector off

matlab下的數字圖像處理快速上手;

讀入數字二維圖像文件到matlab變量f:

f=imread('test.png');

在新的圖形窗口顯示變量f中的圖像:

figure,imshow(f)

寫入圖像write函數(調整質量的範例):

imwrite(f,'test.png','quality','q');
q是0到100的一個整數,數字越小劣化越高

matlab提供惹一個圖像處理工具箱,它把matlab數值計算環境擴展到圖像處理的函數合集。

工具箱支持4種圖像類型:

灰度級圖像(Gray-scale images)
二值圖像(Binary images)
索引圖像(Indexed images)
RGB圖像(RGB images)

類和圖像類型:

double      雙精度浮點數,範圍±10的308次方(8byte/元素)
single      單精度浮點數,範圍±10的38次方(4byte/元素)
uint8       無符號8字節整數,範圍[0,255](1byte/元素)
uint16      無符號16字節整數,範圍[0,65535](2byte/元素)
uint32      無符號32字節整數,範圍[0,4294967295](4byte/元素)
int8        有符號8字節整數,範圍[-128,127](1byte/元素)
int16       有符號16字節整數,範圍[-32768,32767](1byte/元素)
int32       有符號32字節整數,範圍[-2147483648,2147483647](4byte,元素)
char        字符(2字節/元素)
logical     值爲0或1(1字節/元素)

類uint8和logical廣泛地用於圖像處理,浮點類double和single用於計算灰度的操作。

灰度級圖像:一幅灰度級圖像是一個數據矩陣,矩陣的值表示灰度的濃淡。

二值圖像:一幅二值圖像是一個取值只有0和1的邏輯數組。使用函數logical可將數值數組轉換爲二值圖像。

判斷c是否爲二值數組:islogical(c)
轉換變量A到g變爲二值圖像:g=mat2gray

matlab下的M文件;

M文件是大量MATLAB命令的集合,它以文本文件的形式存儲,文件後綴".m"。M文件可以是一個有輸入、輸出變量的函數,也可以是一系列的命令腳本。可以直接放到matlab裏執行。

引例,一個計算兩數之和的函數:

創建:edit z
function z=yplus(y,x)
z=y+x;
調用:z=yplusx(2,3)

關係運算符:
<(小於)、>(大於)、<=(小於等於)、>=(大於等於)、==(等於)、~=(不等於)。
邏輯運算符:
&(逐個元素"與")、|(逐個元素"或")、~(逐個元素"非")、&&(標量"與")、||(標量"或")。

流控制語句:
if          if與else和elseif一起,執行基於指定邏輯條件的一組語句
for         對一組語句執行規定次數
while       根據規定的邏輯條件,對一組語句執行不確定的次數
break       中止執行for或while循環
continue    將控制傳遞到for或while循環的下一次迭代,跳過循環體中所剩餘的語句
switch      switch與case和otherwise一起,根據規定的值或字符串執行不同的語句組
return      使執行返回到調用參數
try...catch 若在執行過程中檢測到錯誤,則改變流控制

matlab函數tic和toc可用於測量函數執行的時間。

tic;sinfun1(100);toc

函數timeit可用於得到函數調用的可靠的可重複的時間測量。

s=timeif(f)

利用矩陣和向量形式寫的M文件效率比較高。循環和if語句也可以在matlab中使用,但是計算效率較低,所以要謹慎使用。

向量化說明和函數meshgrid的介紹。

我們用matlab基於如下公式寫函數來創建一幅合成圖像:f(x,y)=Asin(u0x+v0y)

for循環版:

function f=twodsin1(A,u0,v0,M,N)
f=zeros(M,N);
for c=1:N
    v0y=v0*(c-1);
    for r=1:M
        u0x=u0*(r-1);
        f(r,c)=A*sin(u0x+v0y);
    end
end

meshgrid向量版:

function f2=twodsin2(A,u0,v0,M,N)
    r=0:M-1;
    c=0:N-1;
    [C,R]=meshgrid(c,r);
    f2=A*sin(u0*R+v0*C);
end

檢驗:

timeit(@()twodsin1(1,1/(4*pi),1/(4*pi),512,512))
f=twodsin1(1,1/(4*pi),1/(4*pi),512,512);
imshow(f,[])

向量化形式運行的時間約可少50%。


本地磁盤姬

ohayou.aimo.moe

微博:@本地磁盤姬碟醬

Twitter:本地磁盤姬

2019年07月16日

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章