2 v5 O! o" b2 t& \2 S+ Cimread - Read image from graphics file: U, V2 t) n# u" E; R1 U- b
! {" N0 j. Y& ^ This MATLAB function reads a grayscale or color image from the file specified by3 w" j; }8 ?) g3 U
the string filename. 0 ]- L3 C% Z) W6 |, ?% N- s7 j 4 C Q7 o4 C" q% s A = imread(filename, fmt) 3 A- F8 b* |$ V+ [2 P8 d8 I [X, map] = imread(...) & \$ p8 m- Y$ K6 o. n [...] = imread(filename) 9 \/ p4 T# d, p, C [...] = imread(URL,...) - d, N E1 s0 E& S9 I! e. | [...] = imread(...,Param1,Val1,Param2,Val2...)% C2 e$ g( M% w' ~7 r. R, ~0 U: \1 D
1 & c3 G' M: k; s- Z, g, G5 @2* n K1 g5 ]4 f( X0 ]' I! u8 w
3- u. j8 s1 X3 v- q3 [ Q8 b5 u. j, C
4) T% p& v4 z2 |% a& |# P
5 * o( l, f0 |- w0 ^/ Q60 e7 x% n! s0 J& R; @
7 . [6 v, V, Z1 J0 \7 |% w8 & s! \1 v' J& B! ^1 J( h' b$ P( N1 V9, q o$ c: A1 p9 \% `
10% m0 t! j9 q# r1 E. s5 n# C5 Z
以其中一个常用的用法为例: W8 q# z8 a4 x# d/ L3 C6 O) r 2 a& b) P* R' Y+ u$ L3 m[...] = imread(filename) 2 _' u# i) @2 G8 A! A* _2 r1 ' [ ?$ p& {: O( C其中filename为待读取图像文件名。若该图像不在matlab默认路径下并不与当前运行.m文件同目录时,需要手动添加路径名。 9 L- y* p* ?3 y" G# R$ d ) v' c+ }8 e- ?" f7 m实例: 4 t! u& r" e$ f) i9 z+ f' @6 V: T5 u* w5 z' a2 R0 B, M
>> pic=imread('E:\1.jpg')2 `( u6 v3 ^/ M3 S" @. ^0 M- e% b8 {
1# Y; E, R0 K" _7 J
该代码将E盘下的1.jpg文件读入了matlab,用变量pic存储。 0 W# l, B3 v5 ]0 }1 T, q 2 L/ r1 z+ V4 Q' h r(2)图像显示——imshow ' Z! M! y( |' w 7 {6 E# Q5 \4 }; VMatlab自带参考文档里imshow的用法介绍: / y8 x# d) }! x& ^6 T3 o @1 K & l& h, [: e: y7 i0 j( T3 rimshow - Display image& f3 ], w. E n- w- Y
8 r& L9 w& _2 L" F$ \ This MATLAB function displays the image I in a Handle Graphics figure, where I0 V" s) Z7 i/ R
is a grayscale, RGB (truecolor), or binary image.! U# Q4 d0 [. i8 A
$ v8 X- l; |9 N5 {) M4 h imshow(I)( S, m5 Z8 n7 j* x) n* J
imshow(I,RI) ! c3 F6 Q3 C8 U7 f/ I imshow(X,map)' E/ b/ d/ F3 b, e6 D
imshow(X,RX,map) & |0 O! l4 m V3 ^$ i# j; }- v& a imshow(filename) ( r& F8 B, o! R# F imshow(___,Name,Value...)- P! N) Y9 ~$ W; D1 |# O
imshow(gpuarrayIM,___) - [4 G2 P [8 d3 E/ G% q imshow(I,[low high]) ) D8 {1 S7 e! l$ p. b2 j+ [5 Nhimage = imshow(___). J- l( [. X, d( l1 f k
10 [ ^+ y f: Y# j9 `
2 * x; _' n0 c) w3 & |6 z4 z5 _% ^+ ]8 N$ F5 ?/ S4. n" h( A i* n; `+ I9 e
52 ^5 }& i$ b4 ]( ], y! N
6 7 k' b/ K7 B% J- P3 @7. G5 x* O) V) Q0 G4 T
8 5 S( x. K" y* @" u! M0 v9* e9 s% p6 V4 u) o% J3 F
10 |- D' j, Y; F) u( W/ b1 H11 ' k& b- C! S+ i4 \+ U1 u12/ k# q- c2 D% t5 }/ W
13$ V' K+ X5 i& j! f w- C( q" Z* n
14) r6 O9 m( ?! N m P6 k6 e5 A9 e
以其中一个常用的用法举例:% \- M0 g) n4 c: R( ~% v1 F
1 w# z6 c( \! {: U, o+ h
imshow(I)+ w# U6 d) f, R X# ]
1 . H# E6 q! B5 D% H其中,I为一个矩阵。该函数将把该矩阵所代表的图像显示出来。- s. P3 [# W, z9 O J
1 g1 |7 q, T$ V6 v; o- a; Q
注:并不是只有读取的图片所生成的变量才可以显示出图像,一般而言自己创建的、符合要求的矩阵均可通过该函数显示出其代表的图像。+ t6 n, v% e) n: [0 G. F. g
2 q s* P( ]8 u4 e# S# p5 @2 Z
(3)批量获取图像 : u6 b9 ^4 f7 X* L- [& `0 v7 f+ [. u" b, a5 [( b+ u- C- u) b- }8 y
在做题的时候,有时会需要读取一个文件夹里的所有图像。输入几十行imread的确是一种方法,不过非常低级。此时应使用批量读取图像的方法。0 j; m" @+ a# |7 i$ I6 w- M; B
) o+ n2 O' O+ j R7 S* y
首先需学习dir函数,可以通过它获取当前文件夹下的文件名等信息。在此列出其几个常用用法: 3 V4 r) }# O6 h( {$ d$ q+ B, E9 F( }9 `" j
filepath=dir('.') %列出当前目录下所有子文件夹和文件 ) F3 y# K; P i: g% C$ M) k9 g filepath=dir('E:\matlab') %列出指定目录下所有子文件夹和文件 V! v0 O0 h8 ^1 ?) \) g& g filepath=dir('*.m') %列出当前目录下符合正则表达式的文件夹和文件% x" M; O6 y/ v$ @9 b$ `
1 ) R$ t! _* M% D9 C' K24 E* V" v$ |* s; n% W# Z1 F* ?
3 ! [6 J. t5 ]/ {: J+ P( E变量filepath用于存放dir函数返回的文件信息。filepath变量不再是一个单纯的数值矩阵,而是一个面向对象的对象矩阵。每个对象包含name、date、bytes等属性。可通过filepath.name调用文件名。! `3 N# W4 T/ W# g
2 U v; |3 P$ G
有关正则表达式的知识在此不详细叙述,上述dir函数第三个用法中的正则表达式*.m表示所有文件名以.m结尾的文件。: }/ Y! D" \3 S/ m3 h$ \- M' b5 F ~
7 p1 @8 |6 j9 i% W( ?
以本校2017年新锐赛题目为例,将文件夹中20个图像统一格式、分别命名为1.jpeg~20.jpeg后,可用如下代码读取:( n( C$ I7 ?+ H/ C% h0 U1 F
7 n6 \: \- q* r/ l7 v% g5 K4 Wfor i=1:20 2 J& K% Q _4 m imageName=strcat('附件1:英文纵切\',num2str(i-1),'.jpeg');1 t. L) r o; d5 d; y4 v* c; `) B
pic(:,:,i)=rgb2gray(imread(imageName));* s% Y7 y5 C! z. N! N) D
end + `# h; z; U$ P3 }1. z2 F; N! v+ N: D
2* F" I7 g+ _* V0 X% t8 Z
3 9 k% E! `: B' M0 \ ?4 0 L) ], X, T9 A/ Z5 s此代码读取了文件夹中的20个数字图像文件并将其转化成了灰度图像存储于三维变量pic中。最高维数字代表第几张图。 ! E, q i- k, T5 @/ R8 H+ l* D# U4 b0 A0 M: g$ @6 [
若不事先手动统一名称,可用如下代码读取: - t1 r W0 |3 d/ k, L$ c $ S, R* V, x7 o' o/ afilepath=dir(‘*.jpeg’); ( m1 J# h! K+ K4 Y$ H
for i=1:size(filepath) 3 g) g# E+ Y! c- c0 N/ \* }
filename=strcat('附件1:英文纵切\’,filepath(i).name); / \$ w) n2 u5 k. M4 T! H$ w2 ]% a
pic(:,:,i)=rgb2gray(imread(filename)); . ]/ [ z- M0 v- S" N' _# \/ o, l; Rend7 s" y) Y- Z. Q2 a \' f5 m7 v
1# ^' n: f7 E6 z, e
2 . [' n- u: h% m4 W8 N d3 " Y; q8 w6 D- X$ j, a49 k' d) q8 c6 |$ m( x
5 1 m, b4 j* ~% u' c: ?% ~; K! M2 O三、数字图像基础操作。1 A: t! C# `% V/ J
0 L4 K" B& p _+ }(1)水平镜像 " y4 F9 I$ @, |2 h3 a5 a; l- a5 X9 d( C6 n* c$ p
代码:. H5 }4 [! E5 m: k+ y* n8 ?/ S0 }
" Y, B% i, w# S( ^5 K
I=imread('1.jpg'); % 读取图像1.jpg2 b1 y4 M D! `( Q1 q: P4 }$ N
subplot(1,2,1); % 画1行2列的子图的第一部分 6 ?- x; z4 |9 @, P) L* Yimshow(I); % 显示图像) K$ p" Z! N# K' p, \( O+ d3 w
title('原图'); % 添加标题“原图” 6 W! a" R/ q9 fI=double(I); % 将I图像中灰度值转化为double类型 2 I" a4 o7 x+ O QH=size(I); % 将I图像大小赋值给H) p$ [" O$ J. l/ W8 G4 d9 s) e
I2(1:H(1,1),1:H(1,2))=I(1:H(1,1),H(1,2):-1:1); % 行坐标不变,列坐标反转2 L( |! I0 A% _2 ?: E, H! G
subplot(1,2,2); % 画1行2列的子图的第二部分 v8 s V1 t, w3 G, y. M' v/ L
imshow(uint8(I2)); % 显示图像 . a5 c, @4 U) M$ q- jtitle('水平镜像'); % 添加标题“水平镜像”7 E5 }" m) w) Q, ]3 t
1+ E1 s- L; r, K, f2 s4 S; J
2 # f. W5 G8 f5 i4 @+ ~$ x3: p( s; u9 x0 ~" F9 \" q7 f9 _) u9 r- e
4 : V" A2 K/ q. ^: ~; u( S5 & I) Z# P+ ]" Z: U/ {4 [6/ V7 t/ [( j' P
7: j: _: w# h/ X, s4 v6 b! v0 f# A
8 % ~& }* y0 V9 S4 w92 ^" {8 `. Z* P! q1 {/ W
10 4 s( |3 } t5 ~" Z结果: ) s# B+ ^9 R) l& I1 Z