一、圖像處理的基本操作
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.彩色圖像轉化成灰度圖像
rgb2gray
matlab的內置函數,用來將 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
最近有點忙,後面有時間就接着更新。。。