标题: 大神整理的一些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
function [g,k,l] = two(x)
error(nargchk(1,1,nargin))
% error(nargchk(1,2,nargin))
if x<=1
g = x;
end
g = 0;
k = nargin;
l = nargout;
for i=1:1:x
g = g + i;
end) T! }/ g' M* {1 \, [
* |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. {
Filename: 'C:\Documents and Settings\Administrator\My Documents\MATLAB\test.jpg'
FileModDate: '30-Sep-2014 10:31:18'
FileSize: 1609315
Format: 'jpg'
FormatVersion: ''
Width: 2336
Height: 1752
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}" |5 R4 `- l) X
# 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