Matlab學習筆記(四)--影象處理
1、影象的讀取與顯示
>> rgb = imread('F:\圖片\beautiful scenery\\2.jpg'); %讀取圖片
>> image(rgb) %顯示圖片
2、通過矩陣產生影象
>> A = [1 2 0 ;5 6 7;12 90 7];
>> imshow(A)
3、讀取影象資料到陣列
A = imread('tp.jpg') ;%圖片資料儲存在A中
對於一張真色彩圖片,陣列A是一個三維陣列,即M*N*3.
注意:對陣列A進行運算時候,要將其轉換成double型才可以,否則會算術溢位(當值大於255便溢位)。例如T=[123 252 12 0]為陣列A中的以部分元素,則T(1)+T(2)=0(溢位)。
因此對於影象陣列運算千萬要注意!
將影象陣列轉換成double型方法:
A = im2double(A).此時A中數字均會按照相應的比例轉換成double數字.
4、改變影象畫素
函式imresize(A,[M,N])將圖片A的畫素變成N*M,並返回改變畫素後的圖片。例:
hf = imread('E:\臨時檔案\38.jpg') ;
N = 800 ;%圖片的畫素為800*800
hf = imresize(hf,[N,N]) ;
5、視窗分割
【例一】
A= imread('E:\臨時檔案\3.bmp') ;
%黑白照片上下左右旋轉
C0 = A ;
C1 = rot90(C0,1) ;%逆時針旋轉90
C2 = rot90(C0,2);%逆時針旋轉180
C3 = rot90(C0,3);%逆時針旋轉270
%顯示旋轉的圖片
figure('NumberTitle','off','Name','圖片旋轉') ;
subplot(2,2,1) ;
imshow(C0) ;
xlabel('原始圖片') ;
subplot(2,2,2) ;
imshow(C1) ;
xlabel('左旋轉') ;
subplot(2,2,3) ;
imshow(C2) ;
xlabel('倒置') ;
subplot(2,2,4) ;
imshow(C3) ;
xlabel('右旋轉') ;
pause(3) ;
close all ;
效果如圖:
【例二】
A = [1 2 ;3 4];
subplot(6,2,1:2:11);
imshow(A/256);
for i = 2:2:12
subplot(6,2,i);
imshow(A'/256);
end
6、獲取影象詳細資訊
使用函式imfinfo可以獲取影象詳細資訊。
使用格式: imfinfo <filename>
例:
imfinfo 'F:\圖片\Pure girl\\38.jpg'
結果如下:
Filename: 'F:\圖片\Pure girl\38.jpg'
FileModDate: '27-八月-2012 18:03:45'
FileSize: 141602
Format: 'jpg'
FormatVersion: ''
Width: 500
Height: 473
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
7、圖片的儲存
imwrite函式用來儲存影象。
使用格式1 :
imwrite(f,’filename’)
filename中必須包含可是別的檔案格式副檔名。
【例一】:
hf = imread('F:\圖片\Pure girl\\38.jpg') ;
imwrite(hf,'E:\\tmp.tif') ;
使用格式二:
imwrite(hf,'filename.tif','compression','parameter','resolution',[colres,rowres]);
給中方法僅適用於儲存成tif格式。
【例二】:
hf = imread('F:\圖片\Pure girl\\38.jpg') ;
imwrite(hf,'E:\\tmp1.tif','compression','none','resolution',[200,200]);
imwrite(hf,'E:\\tmp2.tif','compression','none','resolution',[300,300]);
hf = imread('E:\\tmp1.tif') ;
subplot(1,2,1) ;
imshow(hf) ;
hf = imread('E:\\tmp2.tif') ;
subplot(1,2,2) ;
imshow(hf) ;
注:最後一個引數的修改僅是改變圖片的大小,並不改變圖片的畫素。
8、資料類
名稱 |
描述 |
Double |
雙精度浮點型,範圍:-10^308~10^308(8位元每畫素) |
Uint8 |
無符號8位元整數,範圍[0,255](1位元每畫素) |
Uint16 |
無符號16位元整數,範圍[0,65535](2位元每畫素) |
Uint32 |
無符號32位元整數,範圍[0,4294967295](4位元每畫素) |
Int8 |
有符號8位元整數,範圍[-127,127](1位元每畫素) |
Int16 |
有符號16位元整數,範圍[-32678,32677](2位元每畫素) |
Int32 |
有符號32位元整數,範圍[-2147483648,2147483647](4位元每畫素) |
Single |
單精度浮點數,範圍-10^38~10^38(4位元每畫素) |
Char |
字元(2位元每畫素) |
Logical |
值為0或1(1位元每畫素) |
注:函式round可以將浮點數轉化成整數。
例如:roud(3.25) = 3.
資料間的型別可以直接轉換;格式為
B = data_class_name(A),其中data_class_name上表格中的任意一項。
9、影象類和型別間的轉換
名稱 |
將輸入轉換為 |
有效的輸入影象資料 |
Im2uint8 |
Uint8 |
Logical,uint8,uint16,,double |
Im2uint16 |
Uint16 |
Logical,uint8,uint16,double |
Mat2gray |
Double,範圍為[0,1] |
Double |
Im2double |
Double |
Logical,uint8,uint16,double |
Im2bw |
Logical |
Uint8,uint16,double |
10、影象旋轉轉
10.1直接使用陣列處理
【例一】
hf = imread('F:\pictures\Pure girl\\70.jpg');%讀取的影象為三維陣列
A = hf(end:-1:1,end:-1:1,:);
subplot(1,2,1) ;
imshow(hf);
xlabel('原影象');
subplot(1,2,2) ;
imshow(A) ;
xlabel('旋轉後的影象');
10.2函式rot90()
使用格式:
B = rot90(A,n);
說明:
將矩陣A按照逆時針方向旋轉n個90度,將旋轉後的矩陣返回給B.
注:該函式只能對於二維矩陣進行旋轉,並且旋轉的度數為90的整數倍數.
【例二】
%只對二維陣列旋轉
hf = imread('F:\pictures\Pure girl\\70.jpg');
BL = hf(:,:,1);%變成黑白照片
A = rot90(BL,1);%逆時針轉轉90
B = rot90(BL,2) ;%逆時針旋轉180
subplot(1,3,1) ;
imshow(hf);
xlabel('原影象');
subplot(1,3,2) ;
imshow(A) ;
xlabel('旋轉90後的影象');
subplot(1,3,3) ;
imshow(B) ;
xlabel('旋轉180後的影象');
10.3函式imrotate()
使用格式:
B = imrotate(A,angle)
B = imrotate(A,angle,method)
B = imrotate(A,angle,method,bbox)
說明:
第一個引數A為旋轉前的矩陣;第二個引數angle為旋轉的度數,如果angle為正數則按照逆時針方向旋轉,否則按照順時針方向旋轉;第三個引數為旋轉方法,即在空出的地方進行插值填充的方法;第四個引數設定旋轉後圖像的尺寸.
method取值如下:
Value |
Descripition |
Nearest |
取附近的值進行插值 |
Bilinear` |
雙線性插值 |
Bicubic |
三次插值 |
注:nearest為預設值.
bbox取值如下:
Value |
Description |
Crop |
使變換前後尺寸大小相同 |
Loose |
使變換後的影象尺寸適應視窗大小 |
注:loos為預設值.
【例】
f = imread('F:\pictures\pure girl\1.jpg');
set(0,'defaultfigurecolor','w');%設定繪圖視窗背景顏色
for i = 1:1:16
%每次旋轉45度,且使旋轉後的圖片的尺寸大小不變
B = imrotate(f,i*45/2,'bilinear','crop');
imshow(B);
pause(1);
end
close ;