EDA365电子论坛网

标题: 大神整理的一些MATLAB图像处理笔记 [打印本页]

作者: thinkfunny    时间: 2019-12-13 11:01
标题: 大神整理的一些MATLAB图像处理笔记
! W) B) X7 v2 ?( F
由于工作需要,开始研究一下MATLAB图像处理相关的知识,图像处理只是matlab应用领域中小小的一部分而已。以前只是听说过MATLAB很强大,但没有系统的学过,如今开始学时,发现matlab确实很不错、很高大上。操作起来很方便,特别是编写程序时,比C语言更简洁。
1 y/ g% M. U: b3 w
  c, ^8 c7 |1 s9 X4 d% W很多人都是大学里就学过matlab的,由于是半路出家,所以知识不是很全面,直接拿了一本冈萨雷斯的MATLAB版的书就开始看,下面做一些简单的小记录。
  o2 h0 M5 z4 D( Z6 c/ [
+ V! D: I* y, _) b' T  r1. matlab命令基础:
7 }- D( `- b- o% L( ~基础命令:/ D: e7 P" `8 `3 |

5 ~' A/ G% c: j$ e2 R' n- kclc——清除窗口" d( B' I* A. p  e. T
clear——清除之前赋值过的变量7 H- {3 E5 e+ d8 ~
disp——打印信息,相当于echo
2 _0 ]) a( N+ H" l: Mcelldisp——打印元胞数组内容
* `0 `! W% i  y$ @who——简单的显示当前已有变量: F. w, ~4 u, `9 R8 M
whos——显示所有变量及详细内容 whos也可以指定显示某个变量% U5 t+ }" _4 F8 l9 x8 C# l
tan/sin/cos/log ——各种数学运算3 e! D( S$ p& A7 x. K: K2 C
...——用来续行
) l( |# w# z; k, b定义数组——x=1:100- _) K$ K" _  S0 z; t8 C
定义矩阵——A=[1,1,2] A=[1 2 2]; 加分号表示不显示命令执行结果 定义空矩阵B=[]
* x/ E2 n1 E6 A矩阵转置——A=[1 3 5 7]  B=A' 或 B=A.'可以把行向量转换为列向量
8 w* G/ J% \  t0 j+ q( ]8 C取元素——A(1)取A中第一个元素  A(1:5)取A中第一到五的元素
2 g5 c4 L! M. v# x0 J                  A(1:end)取第1到最后的元素,产生一个行向量; A(:)产生一个列向量
) q! D) [1 O9 v- Z: i4 W$ l                 A(1:2:end)表示步长为2 步长也可以为负值 如A(end:-2:1)
7 O( f7 Y# F6 o' b5 B! Ulinspace——x=linspace(a,b,n)产生含有n个元素的行向量x n个元素线性隔开 并包含a和b
! n; x: [6 E  M6 o9 D:的活用——A=[1 2 3; 4 5 6; 7 8 9] A(:,3)取整个第三列  A(1:2, 1:3) 取两行三列
, {; w6 x  ?: V5 w+
9 J5 O* A1 Q& u! [; T/ V-' p" e( ~+ |$ ^: V5 }
*——* 表示矩阵与矩阵相乘,满足线性代数上学的矩阵与矩阵的乘法," D8 _( R% g: N# f% V3 n. ?+ Z  g
   .*表示矩阵中元素与元素相乘,这两个矩阵的维数必需相同。/和./也一样的道理
. H, c. @/ O# g! P- a* u7 T5 C
. V8 Y2 x# L8 G1 Y8 b1 g1 e/ Y8 \5 {1 y" E7 Q/ c+ ~' L. `$ U
length/size/numel的用法:
" |3 a* y% N/ r- h" A- O0 A, V
- R0 e" j, N8 A8 Slength(x) ——返回x的长度 如果x是单个变量 返回1 如果x是矩阵 返回该矩阵行数与列数中的较大者。$ T" ~( l  s8 l4 d# a
; F2 [. [* j  `: X; T6 n9 J/ G
size(x)      ——当x是单个变量时,返回[1 1] 当x是矩阵是 返回矩阵的行数与列数 可以这样来接受[m n]=size(x)& _0 l- u# p; H+ p0 \
) ]; ?& r0 V$ ]( M2 q! Q
numel(x)  ——当x是单个变量时 返回1, 当x是矩阵时,返回矩阵元素总个数。
( X$ s' N* ^0 C1 W6 w7 Z8 r
7 w5 z) y+ g$ P# G/
/ O) Y2 t% s* `' B! S- h, ^# {8 x' a- e1 C
format compact——以紧凑方式显示# V  a4 O* I+ @/ o) }5 e4 }. \% ]
format loose  ——以松散方式显示/ p/ ]; a& l+ A' j; d

( h) u* u9 g8 T( j- imean函数:8 h0 O. Z$ X% w. w( _9 P: X6 R. r5 M

' j, e0 J/ [& h  a% f( I    >>如果有这样一个矩阵:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
  [4 [# m1 y8 K1 B" f  Y         用mean(A)(默认dim=1)就会求每一列的均值! P2 v8 w( u- C
         ans =7 |# [# o  @/ x: }( z3 p
             3.0000    4.5000    6.0000* _: T/ `9 Z& W9 j, q& P
- |; U# D1 j  l$ A9 c8 E4 Q
    >>用mean(A,2)就会求每一行的均值 , ^7 {( p; }8 U
    ans =
# `( |  C  F% e        2.0000
5 ]% b9 ]3 X, n& l        4.0000
; O- n3 A& |. ^. l% g        6.0000
7 p0 k8 h# e; T9 Q. E9 Y0 C8 g' {        6.0000
9 ?# K) i. R! O! B& n
6 K* M6 s% }! ~3 a   >> mean(A(:)) 求总的平均值
7 x# {: Y" b, j
8 [; |; w! J8 c) J$ J! f- |5 I  A# n( L' i6 ^! o. Q# d
其他函数:
% O5 T5 b* _* m( E
- Q! \0 o1 k; V* g9 @zeros(M,N)——生成一个M*N的double型矩阵 元素均为0
* v3 t4 s2 o1 r2 M# O# P$ y2 Aones(M,N)——生成一个M*N的double型矩阵 元素均为12 _4 X+ p8 F, t5 ^3 G& O& O+ i! z
true(M,N)——生成一个M*N型的logical矩阵,元素均为1- b! m6 x) Y' Q' W% d- R
false(M,N)——与上面的true相反
+ U* e$ J- }& M+ d; l0 {magic(M,N)——生成一个魔术幻阵
# m* @1 Y9 A; Brand(M,N)——生成一个M*N的矩阵 元素大小在[0-1中均匀分布]
1 G- K8 T% P8 U, l$ m" O3 e4 zrandn(M,N)——生成一个M*N的矩阵 矩阵元素正态分布 随机数均值是0 方差是1.' y0 Q1 @6 D" O3 E8 b
plot(X,Y)——画二维图像
7 Z% U" j! q5 y! Gsubplot(m,n,p)——m代表生成图像的行数,n是列数,p代表子图编号
+ k" S5 T! c5 f2 L' [9 w% t1 gplot3(X,Y,Z)——画三维图
% l' `# P7 n8 N; xmesh(X,Y,Z)——画三维图
7 j1 c$ i) W6 |5 o+ V) \surf(X,Y,Z)——画三维图,并上色
: m. D4 y  Q5 y; {3 r: Z: d! T! P) m" F( t2 l2 d9 B7 H1 K
matlab函数设计:# F/ j- q6 T4 S

- z  s' f/ @# @  Q: @' D0 C.m文件建立的函数文件+ S) r! p. ?  S. n' S
function [A, B] = fun(A, B) //输入A、B两个变量,返回A、B两个变量 一般.m文件名命名为函数名字0 X# p  S7 x5 x, ~! c. _
% xxxxxx 代表注释,在命令窗口中输入help fun可以显示这个注释& c% X- y( ^5 b5 h$ c
" D, P1 n' g0 T# h

0 C1 h0 H* Q  x  E' G0 F$ S实例:; b! \9 O6 }: r: J
* |1 w0 w) U9 L
调用时写tow(10),就可以计算1~10的和。! e: Q# ?- r8 `: |' z! ]
+ L) b; V) F. R6 B
8 I) f  W& D6 `& L
匿名函数:8 X* M4 Q: r: N% b/ \4 z

% A5 b5 r. i, B( U6 F7 evar = @(x)(x+1), p0 g, s. m$ v9 }3 X
调用时形如var(1)即可,@后面跟参数列表0 L4 M$ T: B; _* r# N

$ B$ o' J2 ]9 s- [接受用户输入信息:
- G  S5 L$ r+ [5 _' k' |t = input('Enter you data:', 's');
6 W0 h$ y9 \7 P7 C& T1 ht='12.6, x2y, z';2 o* N: [5 n8 E3 S+ h
[a,b,c] = strread(t, '%f%q%q', 'delimiter', ',') //按指定的格式读入a b c
% s) Z  l3 g: \& S% X
" y7 ?/ j( I) V; G7 R% Amatlab中,图像大致分为二值图像(0/1)、灰度图像(0-255灰度级)、RGB图像(R、G、B三个分量 三个分量都相同时,所表示的颜色就退化为灰度)、索引图像。8 W& R+ V& ?  X1 `6 ]
      灰度、亮度、强度通常是同一个概念。/ g6 I3 Q$ M! Q
      所有图像按照特性分为位图和矢量图,位图常见格式:JPG GIF BMP矢量图:PNG6 L$ A! J8 t3 o* _; Q4 J0 ?
      机器视觉又称计算机视觉,试图开发出一种模拟人眼的能力,能够理解自然景物与环境的系统,比较高级哦。" D: X6 ?: p* Z& k  S5 K
# |( i3 ^9 I2 s; d/ R+ Y$ U
nargin将返回输入到函数的参数个数、nargout用于函数的输出, B8 j8 A* X9 {% t! g
nargchk用于检查参数数目是否正确margchk(low, high, number),使用实例:/ A$ t. X8 A3 j. R" u3 Q# w
function G = test(X, Y)# b) d1 k4 @; v: u; u
error(nargchk(1,2,nargin));/ k" v8 _  j% B) ^1 A. {

7 n# b; d' a7 A# e# ^2 F7 E1 A  b! J% q2 ?( ~+ v" r# w& X8 }
2. 图像处理基础:) e: ~/ T9 u* T: O- a5 h
imread——读入图像A=imread('1.jpg')
( K& _! @  [/ [9 qimshow——显示图像imshow(A, B);  imshow(A, [low high]);
' B% B2 [1 t* \. L0 \& m                    会将所有小于或等于low的值显示为黑色,大于或等于high的值显示为白色! c+ Y  s  v8 z  b/ ?+ M4 ?
                    若B省略,默认的灰度级是256,imshow(A, [])  []表示将low设为A的最小值 将high设为A的最大值
5 m* t* p% ~! Z/ p1 J: x# A                    显示多幅图像:imshow(A), figure,imshow(B)
$ c  [% r0 T. x* q7 o( q+ u3 Jimwrite——保存图像 imwrite(A, '2.jpg')& ], j5 x% h/ i& r) J# i
                     imwrite(A, '2.jpg', 'quality', q) // q在0-100之间(由于JPFG压缩 q越小图像退化越严重)
" B, E+ P& O7 l4 X! Msize(A)——显示图像的大小
( f0 V- T0 s0 D9 {. m6 |7 G( K- fimfinfo——显示图像的详细信息 imfinfo 1.jpg 也可以K=imfinfo('1.jpg') 就可以使用K.Height K.Width等等信息
$ E3 s) G; O2 M, Y' g' }                    学会计算图像的压缩比:imgBytes=(K.Height*K.Width*K.BitDepth/8) compress_bytes=K.FileSize* E: g6 @# E9 z& Y1 ~' u5 H. d
                    imgBytes / compress_bytes ==压缩比
4 x/ r) }: J, ]# Z; C
4 w) z' \1 N8 I$ F, e0 p                    命令窗口输入:imfinfo test.jpg,显示信息如下:                    
( ?4 V+ C6 M% v3 s8 E9 U8 L7 [3 r' u. X' J
# k# a' v- U. \/ l% O9 o( Q" X
: e( t' r- }. J9 g" z3 M* p
double/im2double/mat2gray的区别:
+ W* A# h! X  K  i! ~# k" s/ k( E0 e% `- ~3 Q8 Y. a
        A=imread('1.jpg');
7 d1 B  O1 R9 @* n9 h/ P* W+ U7 v; f/ E0 s. Y6 s* ?' ?( M
        A(1,1,:)          ——显示A中第1行第一列像素点(包含红、绿、蓝)三个分量的值
, B9 @% \8 E2 q) e: A( I3 {% y+ H   5 ^. L7 e0 l  D! K* q
        B=double(A)——转换为double类型 值不会变 注意 使用im2double值会[0-1]# W. h8 R0 Q  Y, I
        im2double   ——若输入是uint8类型 每个值会除以255.
7 j) g' _6 Y3 [5 p  r% W& E4 r        mat2gray()   ——可以将double类型转换为归一化的double类型
8 ]7 |, {5 V$ M8 x$ h        区别:- U9 V( t4 G, i5 I7 s3 z5 p2 |9 s5 ~
        im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;如果输入类型是double,输出没有处理;( x2 L- Y" |* \+ q1 w, j& [

5 `. \- L8 d& r8 }4 `  C        double:返回数值与输入相同的double类型矩阵;
- r2 I$ S/ D! q
$ v& z9 E+ ^9 T$ h        mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。
; k. t7 ?) R9 v+ ]) P2 @6 J        在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据。; S2 _" f& |/ ~8 S7 q$ q. O- P8 r
- W; Y- w  H# i: @+ O) M, d
注意:uint8类、uint16类RGB图像取值范围分别是[0, 255]、[0, 65535],而double类范围是[0, 1]
( A2 k$ M3 d2 D% H8 f8 c4 B
. z1 {, o. m4 I, \7 y: e' FC=[-1,0.5; 2,3] 1 `3 {  y  ?( A! S5 E, @& p* z* H! u
B=im2uint8(C)——im2uint8把所有大于1的值转换为255 小于0 的值转为0 其他值乘以255
; g7 a: c, J& G5 m: ^4 Nim2bw          ——得到二值图像 可以先A=mat2gray(B), im2bw(A, 0.5)% X9 d% W; z7 T& c/ m

( l% O4 Z! q6 |9 ?' P+ m
9 m! Q2 y# o3 h  `9 u) }IPT支持的图像的算术函数:1 J/ j# M+ ^% R" W* X# S
imadd——图像相加+ W' E& c; G; m7 N  O2 i
imsubtract——图像相减
) U' B  z; ]! Yimmultiply——图像相乘0 r8 |! L9 {9 [5 f8 z9 C
imdivide          ——图像相除
8 v3 F+ F# P9 b6 W- X1 b: Wimabsdiff——计算两幅图像之间的绝对差
/ Z4 \4 r6 @6 |- o2 M- iimcomplement——对图像求补
  E$ d* A6 ~6 Q) E+ q- i. mimlincomb——计算两幅或多幅图像的线性组合
5 S" j7 J* r4 D# `. e$ J8 E% `# F" d" v5 {
图像旋转函数:
0 z1 \9 {" h3 D3 C- p: I' f
$ e8 q8 S7 n$ Oimrotate,matlab默认是逆时针旋转, imrotate参数解释:
  p9 e/ r$ f" @+ n- _
1 \# f, l  N4 F( W7 F        angle顾名思义 就是你旋转的角度, method 就是你实现旋转用的是什么方法,有三种  和后面的插值放大缩小是一下就是 最邻近插值法 双线性插值法 三次卷积插值法,英语表示就是  'nearest'    'bilinear'    'bicubic'。
: a& W  z! D8 K- W2 w1 l% E% R        不同的插值方法得到的旋转图像有细微的差别 如果你不选在 matlab默认的是最邻近插值法 那么图像会有一定的失真,这个失真主要是因为matlab在计算每个点的新坐标的时候得到的数值不是整数,要去整所造成的最后说说bbox   这个的意义主要分为2种,也就是说我们在这一项有2个选择 一个是‘loose’ 另外一个是‘crop’: v! Q; C9 M) Z4 z
        loose  就是宽松的意思 顾名思义就是说 图像旋转后 系统会给予一个宽松的环境去匹配它,这样你得到的图片就是一个完整的图片
9 o- P/ D$ ^8 `: N% q6 X0 w( V# P' N$ [2 E" e& v2 G- _
        matlab的解释是 When BBOX is 'loose', B' `' F8 s5 F* P

8 M) o1 I: k; l& a$ g  V  Z3 ?        includes the whole rotated image, which generally is larger than A." k* `# ]1 K+ p0 m- A/ d3 g+ c6 O
        crop 就是剪切啦,也就是困扰了大家很久的问题,为什么旋转后图像变小了,因为matlab默认的是crop  超过图片原来大小的部分被crop了& W$ @3 l; F' L6 L* {6 A
; A7 S9 f9 _+ L% B* e1 ~: {0 h. G
) x' m( f1 E2 R3 o

; |8 g8 t" O0 {3. 亮度变换与空间滤波:; _: v; q# V( w6 R. {) v- Z
1. 亮度$ K8 a+ o, `. q( b
    imadjust函数+ I& o& _% P& N# D; }# q
    A=imread('1.jpg');
; I4 f) z) i* y& [0 M- C    B= imadjust(A, [], [], 0.75); // gamma<1 变亮+ e/ t8 c1 E* `- u
    imshow(B)+ _) v5 H7 n' v- G
1 v1 U5 {8 B2 ]  @1 ?
    C=imadjust(A, [0 1], [1 0]);
+ C( n( o% p) W( C* ~: L    效果等价于C=imcomplement(A) 都是求图像的负片
% \# F5 X4 I& H& G, d0 Y2. 对比度拉伸函数
1 r9 c: E* F6 m0 L     g = 1./(1+(m./(f+eps)).^E) // 加eps是为了防止溢出3 u4 H( m1 z$ @& R4 s* f4 Y
3. 直方图; u1 X& s; _8 Q& h
    imhist函数:0 k! D# j! `3 M6 a, q
    h = imhist(f, b) //b是灰度级个数 默认是256, C& Y4 E0 p. S$ C" A. K0 K% ]: F- E
    numel(f) //得到像素点个数
# J/ o2 Q$ Q/ a( w    B=rgb2gray(A); subplot(121), imshow(B); subplot(122), imhist(B);
/ U7 z, I- a6 M& G9 s3 j    直方图均衡化:
" f) `$ B$ s2 ~+ N3 _% @  {6 m    histeq函数:
7 u! Z' m  W" M) R    J=histeq(I). H/ ~& o/ F, Q+ J5 @% x
- g7 V# p9 j- z2 ~
. u5 L' A- o! h6 Y
实例:% S$ B+ F, L, B, F8 K' h
+ y: h( q0 D! y- v% o
  E  i; _. h- r5 C4 d) p9 ~  Z
图像如下所示:
' }; P! d  f" |$ U2 ]* L* E) S" f* O6 `# H4 g# |

) y; S6 X4 L+ b" D( v! R- F$ l0 ]* a" {9 G

* ]" a7 U. A$ X: {7 P) e' b" L3 |. g
& d3 d- F* E6 _- x2 j
4. 空间滤波:4 S' a4 }/ z6 w4 V0 Q" p$ P3 I

7 g6 h1 I+ U  x2 X+ B9 o$ ^: j6 H9 o5 \    线性空间滤波:imfilter函数1 e# N! k, I. B- l) l& v; S
    g=imfilter(f,w,filtering_mode, boundary_options, size_options); + S6 J3 Y* |) o; L9 l& O
    //filtering_mode=corr/conv size_options=same/full
; w7 [& B: |6 j' P. |% [) L    通用语法为 g = imfilter(f, w, 'replicate');
" W: P# [4 P  D7 Y) `" U4 L    非线性滤波:colfilt函数
3 p3 T# \9 Z# g) @9 R6 i& G, ~- `1 E1 ^
( q' t2 y# e! E3 k0 ?! F    IPT中的线性滤波器:
# k; n* |: {( I. Q8 m      fspecial函数用来生成滤波掩膜w% G/ A$ F9 l9 ^+ e
      w = fspecial('type', parm) //type表示滤波器类型
; _% x- o0 m* A5 ~* V# ?      type值可以是:average disk gaussian laplacian log motion prewitt sobel unsharp, _7 U9 r. q! G: ~8 g: P, Y

: f; A( n* Q/ p2 t实例:
6 Y2 c: x9 O7 ^2 s' u9 m) x8 Q  ^使用拉普拉斯算子来增强图像,包括锐化,同时应该保留其灰度色调6 w4 u% M2 n+ V2 [" G  _% a% W

9 t; ]6 _. G% e' h" I7 Btest_shape.m) r8 K5 r7 x" o1 O/ A4 K
; s/ J$ R% C- K
上面使用拉普拉斯算子产生的w=[0 1 0; 1 -4 1; 0 1 0]; 中心为-4,现在我们手工指定中心为-8的情况如下:
% H5 d: M$ y* h6 Y! I
2 e2 t+ y0 B  Y# ~# @) [3 X5 K; n+ w2 O) Y
会发现图像锐化效果更好,图像更清晰。
  z9 V/ U$ K  c- u, j
, V, J3 t/ |7 _: C( i    IPT中的非线性滤波器:' j7 `7 c8 s4 h2 ~9 s
    ordfilt2函数  g = ordfilt2(f, order, domain)
- ^7 H- f8 ~- M; u: z    中值滤波medfilt2
2 u1 f& M- W( }    图像中加入噪声:格式:J = imnoise(I, type, parm): L7 o' ]$ S0 L1 M* O. b) f

' M! ]2 `3 j2 _# U' m+ p& V    >> A=imread('test.jpg');, p, J! z9 E3 l. }6 ~5 D
    >> B = imnoise(A, 'salt & pepper', 0.02);) b$ U0 D$ \: E4 ^: l
    >> C=rgb2gray(B);
1 s4 q/ L. G4 B    >> D=medfilt2(C, [3 3]);//中值滤波' |# V  Q( e3 j3 [; G+ [
    >> imwrite(D, 'xxx.jpg')
* t- i# C7 t1 }" D( {) q
: e* I) O, s* |
* a' e* l: E5 F$ D& v% n4. 彩色图像处理* M0 \, p, @- [% s; |
>> A = imread("test.jpg");, y, f1 i6 T. u$ ?, w
%获取图像R、G、B每个分量( O# L9 N9 N* w6 ]- Y- ^5 Z
>> R = A(:,:,1);, o( X+ h1 Q) E7 w5 m6 D  a
>> G = A(:,:,2);
" a3 C6 P, \0 X* x4 S( }>> B = A(:,:,3);
# r0 }: ]$ w3 p  X7 f>> D = cat(3, R, G, B); //cat组合成图像
$ O( U& F" m2 N' K3 X
+ ~( v3 Q# y; V  K0 |' z$ s5 g% V" A4 ]$ g4 |- Q- X

( B+ s5 t! h% T6 @
, }& J7 g0 Z! v. ?' N' r; N' U
) m3 @" u, b/ V$ d
作者: WNSKS    时间: 2019-12-13 19:26
给大神点个赞




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2