Matlab 圖像處理(基礎篇)

一、圖像處理的基本操作

1.從圖形文件讀取圖像

pic = imread('C:\Users\Good\Pictures\m.jpg');

通過matlab自帶的imread讀入圖像,函數內爲圖像的路徑。如果圖片在當前文件夾下,可以通過圖片名直接導入。pic = imread('m.jpg');

2.顯示圖像

imshow(pic);

通過上面的簡單操作,我們已經可以在matlab中讀入圖像文件,並顯示出來。接下來我們要對圖像本身的一些問題進行原理性的講述

二、關於圖像

1.光的三基色

(1) 學過高中物理的我們都聽說過 “光的三基色”,光的三基色,就是光的三種基礎顏色(R紅色、G綠色、B藍色),不可以通過其他顏色混合得到。但我們卻可以通過將這三種顏色混合獲得自然界中絕大部分顏色。

(2) 在matlab中,顏色的表示就是通過顯示RGB相應的數值來表示顏色。通常情況下,RGB各有256級亮度,用數字表示爲從0、1、2…直到255,共256級。每個基色分量直接決定顯示設備的基色強度。

imfinfo('C:\Users\Good\Pictures\m.jpg') %獲取圖形文件的信息
size(pic)

在這裏插入圖片描述
可以看出圖像在matlab中就是一個 Height ✖ Width ✖ 3 的一個 uint8 類型的矩陣,其中 Height、Width 是圖像的大小,也就是像素點。一個個像素點上其中3即爲RGB的三個數值,用來表示該像素點的顏色,通過像素點的座標來定位到像素點。

R = pic(:,:,1);
G = pic(:,:,2);
B = pic(:,:,3);

在這裏插入圖片描述

2.灰度圖像

灰度是描述灰度圖像內容的最直接的視覺特徵。它指黑白圖像中點的顏色深度,範圍一般從0到255,白色爲255,黑色爲0,故黑白圖像也稱灰度圖像。灰度圖像矩陣元素的取值通常爲[0,255],因此其數據類型一般爲8位無符號整數,這就是人們通常所說的256級灰度。
在這裏插入圖片描述

3.彩色圖像轉化成灰度圖像

rgb2graymatlab的內置函數,用來將 RGB 圖像或顏色圖轉換爲灰度圖。灰度圖的圖像矩陣是一個 Height ✖ Width ✖ 1 的一個 uint8 類型的矩陣。也就是將三基色RGB的數值轉化爲一維的灰度值,便於圖像處理。彩色圖像轉換爲灰度圖像時,需要計算圖像中每個像素有效的亮度值,其計算公式爲:Y = 0.3R + 0.59G + 0.11B
在這裏插入圖片描述

turn_pic = rgb2gray(pic);
pic = double(pic);  %需要轉化類型,不然計算結果可能不同
turn_pic(1,1)
0.3*pic(1,1,1) + 0.59*pic(1,1,2) + 0.11*pic(1,1,3)

在這裏插入圖片描述

4.灰度圖像轉化爲彩色圖像

將灰度圖像轉換爲彩色圖像,稱爲灰度圖像的僞彩色處理。

僞彩色處理技術的實現方式有很多,如:灰度分割法、灰度級-彩色變換法、濾波法等等。以下采用的是灰度級-彩色變換法,這是將來自傳感器的灰度圖像送入三個不同特徵的R、G、B變換器,然後將三種變換器的不同輸出分別送到彩色顯示器進行顯示的技術。

gray2rgb函數可以將灰度圖轉化爲彩色圖,不過需要下載相關文件,需要的話可以自行搜索,而且執行效率很低。

映射關係如下,其中R(x,y)、G(x,y)、B(x,y)分別表示R、G、B的顏色值,f (x,y)表示特定點灰度圖像的灰度值,f 是所選灰度圖像的灰度值。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

5. 二進制圖像

二進制圖像也稱爲二值圖像,通常用一個二維數組來描述,1位表示一個像素,組成圖像的像素值非0即1,沒有中間值,通常0表示黑色,1表示白色。二進制圖像一般用來描述文字或者圖形,其優點是佔用空間少,缺點是當表示人物或風景圖像時只能描述輪廓。一般我們可以通過設置閾值來進行二進制圖像轉化,matlab中可以利用im2bw從灰度、索引、RGB圖象創建二值圖。

6.索引圖像

索引圖像是一種把像素值直接作爲RGB調色板下標的圖像。在MATLAB中,索引圖像包含一個數據矩陣X和一個顏色映射(調色板)矩陣map。數據矩陣可以是8位無符號整型、16位無符號整型或雙精度類型的。可以通過以下代碼對索引圖像和RGB圖像進行轉化:

IND = rgb2ind(pic,n);  % pic爲RGB圖像矩陣,map爲顏色映射矩陣,最多包含n個顏色。n必須小於或等於 65,536。
RGB = ind2rgb(pic,map);  % pic爲索引圖像矩陣,map爲顏色映射矩陣

7.小結

圖像類別 英文名稱 英文縮寫
RGB rgb rgb
灰度 gray gray
索引 index ind
二進制 binary bin

2英文two和to發音相同,所以很多轉換類函數都用2來命名而非to。比如number to string, 不是命名爲numTostr而是num2str。記住英文縮寫,我們就可以靈活使用各種函數進行圖像轉換。

三、利用插值法對圖像進行放大處理

1.二維插值

二維插值是對兩個變量的函數z = f(x,y)進行插值
求解二維插值的基本思路是:
在這裏插入圖片描述
常見的二維插值可以分爲兩種:網格結點插值和散亂數據插值。
二維插值處理圖片,可以使放大後的圖片的失真率降低,提升圖片放大後的顯示效果。

2.插值問題的出錯總結

pic = imread('C:\Users\Good\Pictures\m.jpg');
turn_pic = rgb2gray(pic);
[m,n] = size(turn_pic);
x0 = 1:m;
y0 = 1:n;
x = 1:0.5:(m+0.5);
y = 1:0.5:(n+0.5);
z = interp2(x0,y0,turn_pic,x,y,'cubic');

錯誤提示
在這裏插入圖片描述
出錯原因:x0, y0, X, Y 都是 double 類型的數據,但是 turn_pic 是 uint8 類型的數據。
錯誤修改turn_pic = double(turn_pic);
修改後運行
在這裏插入圖片描述
錯誤分析
像這樣的插值問題,最怕的就是矩陣的 size 不對應,參照我們插值時可以傳入 meshgrid 生成的網格數據,我們不難知道,interp2 的插值方式,內部會自己利用 meshgrid 方式處理傳入的數據。但我們知道 meshgrid 方式生成的網格數組與原數據矩陣 size 相反,所以要注意這個 size 問題。以代碼爲例:

[m,n] = size(turn_pic);
x0 = 1:m;
y0 = 1:n;

傳入的x0,x,y0,y分別對應的是圖像矩陣的行和列,利用 meshgrid 生成的網格面都與 turn_pic 的 size 正好相反。所以我們初始定義x,x0對應列,y,y0對應行,這樣就可以避免 size 錯誤。
正確代碼

pic = imread('C:\Users\Good\Pictures\m.jpg');
turn_pic = rgb2gray(pic);
turn_pic = double(turn_pic);
[m,n] = size(turn_pic);
x0 = 1:n;
y0 = 1:m;
x = 1:0.5:(n+0.5);
y = 1:0.5:(m+0.5);
[X,Y] = meshgrid(x,y);
z = interp2(x0,y0,turn_pic,X,Y,'cubic');
z = uint8(z);
imshow(z);

效果圖
在這裏插入圖片描述

3.網格點數據的生成

在matlab中,進行三維圖像的繪製,一般要構造二維的網格面,再通過二維的網格面對應z值,繪製出三維的圖像。
一般,我們常用meshgrid來構建二維的網格面。
meshgrid:二維和三維網格
用法:[X,Y]=meshgrid(x,y)
另一種用法[X,Y]=meshgrid(x) 這等價於 [X,Y]=meshgrid(x,x)
其中x爲n維向量,y爲m維向量,x, y爲 m ✖ n維的矩陣。它用於產生“二維變量的網格”。
下面舉例說明:

x = 1:4;
y = 1:3;
[X,Y] = meshgrid(x,y);

在這裏插入圖片描述
在這裏插入圖片描述
ndgrid:N 維空間中的矩形網格
用法:
[X1,X2,…,Xn] = ndgrid(x1,x2,…,xn) 複製網格向量 x1,x2,…,xn 以生成 n 維滿網格。
[X1,X2,…,Xn] = ndgrid(xg) 指定對所有維度使用單一網格向量 xg。您指定的輸出參數的數目決定輸出的維度 n。
兩者的區別與聯繫:
ndgrid 支持從1維到n維,而 meshgrid 僅僅限制於2維和3維。在2維以及3維中,兩個函數的座標輸出是一樣的,[X,Y,Z] = meshgrid(x,y,z)等效於 [Y,X,Z] = ndgrid(y,x,z),不同的地方在於輸出數組的形狀不一樣。例如:x長度爲 m,y長度爲 n,meshgrid生成的二維網格 size 爲 n✖m,而ndgrid爲 m✖n。
參考文章:彩色圖像與灰度圖像之間的轉換
鏈接:https://www.cnblogs.com/minisculestep/p/4878894.html

最近有點忙,後面有時間就接着更新。。。

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