一胰蝠、圖像處理的基本操作
1.從圖形文件讀取圖像
pic = imread('C:\Users\Good\Pictures\m.jpg');
通過 matlab 自帶的 imread 讀入圖像旅东,函數(shù)內(nèi)為圖像的路徑。如果圖片在當(dāng)前文件夾下檩淋,可以通過圖片名直接導(dǎo)入。pic = imread('m.jpg');
2.顯示圖像
imshow(pic);
通過上面的簡單操作萄金,我們已經(jīng)可以在 matlab 中讀入圖像文件蟀悦,并顯示出來。接下來我們要對圖像本身的一些問題進(jìn)行原理性的講述氧敢。
二日戈、關(guān)于圖像
1.光的三基色
(1) 學(xué)過高中物理的我們都聽說過 “光的三基色”,光的三基色孙乖,就是光的三種基礎(chǔ)顏色(R 紅色浙炼、G 綠色、B 藍(lán)色)的圆,不可以通過其他顏色混合得到鼓拧。但我們卻可以通過將這三種顏色混合獲得自然界中絕大部分顏色。
(2) 在 matlab 中越妈,顏色的表示就是通過顯示 RGB 相應(yīng)的數(shù)值來表示顏色季俩。通常情況下,RGB 各有 256 級亮度梅掠,用數(shù)字表示為從 0酌住、1、2… 直到 255阎抒,共 256 級酪我。每個基色分量直接決定顯示設(shè)備的基色強(qiáng)度。
imfinfo('C:\Users\Good\Pictures\m.jpg') %獲取圖像文件的信息
size(pic)
可以看出圖像在 matlab 中就是一個 Height ? Width ? 3 的一個 uint8 類型的矩陣且叁,其中 Height都哭、Width 是圖像的大小,也就是像素點。一個個像素點上其中 3 即為 RGB 的三個數(shù)值欺矫,用來表示該像素點的顏色纱新,通過像素點的坐標(biāo)來定位到像素點。
R = pic(:,:,1);
G = pic(:,:,2);
B = pic(:,:,3);
2.灰度圖像
灰度是描述灰度圖像內(nèi)容的最直接的視覺特征穆趴。它指黑白圖像中點的顏色深度脸爱,范圍一般從 0 到 255,白色為 255未妹,黑色為 0簿废,故黑白圖像也稱灰度圖像÷缢灰度圖像矩陣元素的取值通常為 [0,255]族檬,因此其數(shù)據(jù)類型一般為 8 位無符號整數(shù),這就是人們通常所說的 256 級灰度酪耕。
3.彩色圖像轉(zhuǎn)化成灰度圖像
rgb2gray
是 matlab 的內(nèi)置函數(shù)导梆,用來將 RGB 圖像或顏色圖轉(zhuǎn)換為灰度圖∮厮福灰度圖的圖像矩陣是一個 Height ? Width ? 1 的一個 uint8 類型的矩陣看尼。也就是將三基色RGB的數(shù)值轉(zhuǎn)化為一維的灰度值,便于圖像處理盟步。彩色圖像轉(zhuǎn)換為灰度圖像時藏斩,需要計算圖像中每個像素有效的亮度值,其計算公式為:Y = 0.3R + 0.59G + 0.11B
turn_pic = rgb2gray(pic);
pic = double(pic); %需要轉(zhuǎn)化類型却盘,不然計算結(jié)果可能不同
turn_pic(1,1)
0.3*pic(1,1,1) + 0.59*pic(1,1,2) + 0.11*pic(1,1,3)
4.灰度圖像轉(zhuǎn)化為彩色圖像
將灰度圖像轉(zhuǎn)換為彩色圖像狰域,稱為灰度圖像的偽彩色處理。
偽彩色處理技術(shù)的實現(xiàn)方式有很多黄橘,如:灰度分割法兆览、灰度級-彩色變換法、濾波法等等塞关。以下采用的是灰度級-彩色變換法抬探,這是將來自傳感器的灰度圖像送入三個不同特征的 R、G帆赢、B 變換器小压,然后將三種變換器的不同輸出分別送到彩色顯示器進(jìn)行顯示的技術(shù)。
gray2rgb
函數(shù)可以將灰度圖轉(zhuǎn)化為彩色圖椰于,不過需要下載相關(guān)文件怠益,需要的話可以自行搜索,而且執(zhí)行效率很低瘾婿。
映射關(guān)系如下蜻牢,其中 R(x,y)烤咧、G(x,y)、B(x,y) 分別表示 R孩饼、G髓削、B 的顏色值,f(x,y) 表示特定點灰度圖像的灰度值镀娶,f 是所選灰度圖像的灰度值。
5. 二進(jìn)制圖像
二進(jìn)制圖像也稱為二值圖像揪罕,通常用一個二維數(shù)組來描述梯码,1 位表示一個像素,組成圖像的像素值非 0 即 1好啰,沒有中間值轩娶,通常 0 表示黑色,1 表示白色框往。二進(jìn)制圖像一般用來描述文字或者圖形鳄抒,其優(yōu)點是占用空間少,缺點是當(dāng)表示人物或風(fēng)景圖像時只能描述輪廓椰弊。一般我們可以通過設(shè)置閾值來進(jìn)行二進(jìn)制圖像轉(zhuǎn)化许溅,matlab 中可以利用im2bw
從灰度、索引秉版、RGB 圖象創(chuàng)建二值圖贤重。
6.索引圖像
索引圖像是一種把像素值直接作為 RGB 調(diào)色板下標(biāo)的圖像。在 Matlab 中清焕,索引圖像包含一個數(shù)據(jù)矩陣 X 和一個顏色映射(調(diào)色板)矩陣 map并蝗。數(shù)據(jù)矩陣可以是 8 位無符號整型、16 位無符號整型或雙精度類型的秸妥」鐾#可以通過以下代碼對索引圖像和 RGB 圖像進(jìn)行轉(zhuǎn)化:
IND = rgb2ind(pic,n); % pic為RGB圖像矩陣,map為顏色映射矩陣粥惧,最多包含n個顏色键畴。n必須小于或等于 65,536。
RGB = ind2rgb(pic,map); % pic為索引圖像矩陣影晓,map為顏色映射矩陣
7.小結(jié)
圖像類別 | 英文名稱 | 英文縮寫 |
---|---|---|
RGB | rgb | rgb |
灰度 | gray | gray |
索引 | index | ind |
二進(jìn)制 | binary | bin |
2 英文 two 和 to 發(fā)音相同镰吵,所以很多轉(zhuǎn)換類函數(shù)都用 2 來命名而非 to。比如number to string
挂签, 不是命名為numTostr
而是num2str
疤祭。記住英文縮寫,我們就可以靈活使用各種函數(shù)進(jìn)行圖像轉(zhuǎn)換饵婆。
三勺馆、利用插值法對圖像進(jìn)行放大處理
1.二維插值
二維插值是對兩個變量的函數(shù)z = f(x,y)
進(jìn)行插值
求解二維插值的基本思路是:
常見的二維插值可以分為兩種:網(wǎng)格結(jié)點插值和散亂數(shù)據(jù)插值。
二維插值處理圖片,可以使放大后的圖片的失真率降低草穆,提升圖片放大后的顯示效果灌灾。
2.插值問題的出錯總結(jié)
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 類型的數(shù)據(jù),但是 turn_pic 是 uint8 類型的數(shù)據(jù)悲柱。
錯誤修改:turn_pic = double(turn_pic);
修改后運行:
錯誤分析:
像這樣的插值問題锋喜,最怕的就是矩陣的 size 不對應(yīng),參照我們插值時可以傳入 meshgrid 生成的網(wǎng)格數(shù)據(jù)豌鸡,我們不難知道嘿般,interp2 的插值方式,內(nèi)部會自己利用 meshgrid 方式處理傳入的數(shù)據(jù)涯冠。但我們知道 meshgrid 方式生成的網(wǎng)格數(shù)組與原數(shù)據(jù)矩陣 size 相反炉奴,所以要注意這個 size 問題。以代碼為例:
[m,n] = size(turn_pic);
x0 = 1:m;
y0 = 1:n;
傳入的 x0蛇更,x瞻赶,y0,y 分別對應(yīng)的是圖像矩陣的行和列派任,利用 meshgrid 生成的網(wǎng)格面都與 turn_pic 的 size 正好相反砸逊。所以我們初始定義 x,x0 對應(yīng)列吨瞎,y痹兜,y0 對應(yīng)行,這樣就可以避免 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.網(wǎng)格點數(shù)據(jù)的生成
在 matlab 中字旭,進(jìn)行三維圖像的繪制,一般要構(gòu)造二維的網(wǎng)格面崖叫,再通過二維的網(wǎng)格面對應(yīng) z 值遗淳,繪制出三維的圖像。
一般心傀,我們常用 meshgrid 來構(gòu)建二維的網(wǎng)格面屈暗。
meshgrid:二維和三維網(wǎng)格
用法:[X,Y]=meshgrid(x,y)
另一種用法[X,Y]=meshgrid(x)
這等價于 [X,Y]=meshgrid(x,x)
其中 x 為 n 維向量,y 為 m 維向量脂男,x, y 為 m?n 維的矩陣养叛。它用于產(chǎn)生 “二維變量的網(wǎng)格”。
下面舉例說明:
x = 1:4;
y = 1:3;
[X,Y] = meshgrid(x,y);
ndgrid:N 維空間中的矩形網(wǎng)格
用法:
[X1,X2,...,Xn] = ndgrid(x1,x2,...,xn) 復(fù)制網(wǎng)格向量 x1,x2,...,xn 以生成 n 維滿網(wǎng)格宰翅。
[X1,X2,...,Xn] = ndgrid(xg) 指定對所有維度使用單一網(wǎng)格向量 xg弃甥。您指定的輸出參數(shù)的數(shù)目決定輸出的維度 n。
兩者的區(qū)別與聯(lián)系:
ndgrid 支持從 1 維到 n 維汁讼,而 meshgrid 僅僅限制于 2 維和 3 維淆攻。在 2 維以及 3 維中阔墩,兩個函數(shù)的坐標(biāo)輸出是一樣的,[X,Y,Z] = meshgrid(x,y,z) 等效于 [Y,X,Z] = ndgrid(y,x,z)瓶珊,不同的地方在于輸出數(shù)組的形狀不一樣啸箫。例如:x 長度為 m,y 長度為 n伞芹,meshgrid 生成的二維網(wǎng)格 size 為 n?m忘苛,而 ndgrid 為 m?n。