您現在的位置是:首頁 > 垂釣
Matlab 影象處理基礎
- 由 Bug分享 發表于 垂釣
- 2021-10-17
matlab中ind什麼意思
一、影象處理的基本操作
1。從圖形檔案讀取影象
pic = imread(‘C:\Users\Good\Pictures\m。jpg’);
透過matlab自帶的imread讀入影象,函式內為影象的路徑。如果圖片在當前資料夾下,可以透過圖片名直接匯入。
pic = imread(‘m。jpg’);
2。顯示影象
imshow(pic);
透過上面的簡單操作,我們已經可以在matlab中讀入影象檔案,並顯示出來。接下來我們要對影象本身的一些問題進行原理性的講述
二、關於影象
1。光的三基色
(1) 光的三基色,就是光的三種基礎顏色(
Red、Green、Blue
),不可以透過其他顏色混合得到。但我們卻可以透過將這三種顏色混合獲得自然界中絕大部分顏色。
(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。小結
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