找回密码
 注册
关于网站域名变更的通知
查看: 614|回复: 1
打印 上一主题 下一主题

大神整理的一些MATLAB图像处理笔记

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-12-13 11:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

( ~0 O6 ^4 V9 F7 }% `由于工作需要,开始研究一下MATLAB图像处理相关的知识,图像处理只是matlab应用领域中小小的一部分而已。以前只是听说过MATLAB很强大,但没有系统的学过,如今开始学时,发现matlab确实很不错、很高大上。操作起来很方便,特别是编写程序时,比C语言更简洁。
0 Y, l0 b1 u+ ]! r$ g/ r. ?% e
+ D/ X1 \  L- }/ @7 {7 g0 f很多人都是大学里就学过matlab的,由于是半路出家,所以知识不是很全面,直接拿了一本冈萨雷斯的MATLAB版的书就开始看,下面做一些简单的小记录。/ j* p- n5 a! k' i; c# Q& o

/ K2 G+ k9 M. a% C1. matlab命令基础:
, E0 X7 y% G; u. E. L$ c基础命令:
! J0 j6 k6 b( c' C
2 c4 ?  h& ?$ T4 F+ i6 F- Mclc——清除窗口: E" f8 p. g! H
clear——清除之前赋值过的变量
7 Y# i; E  K) M- Ydisp——打印信息,相当于echo
1 W7 f( H* M+ c9 ^+ @0 a- Bcelldisp——打印元胞数组内容
: b5 m- g  K& B. i( s' D( ~  [who——简单的显示当前已有变量
- {) a. s; ?, L' e7 I8 U+ R" qwhos——显示所有变量及详细内容 whos也可以指定显示某个变量
: `$ x. Z* Z) Ltan/sin/cos/log ——各种数学运算
7 o( b0 A$ x; Z; l3 G# q...——用来续行0 o( @9 N$ x; E( Y% o: s
定义数组——x=1:100
+ a: `% X- O8 n定义矩阵——A=[1,1,2] A=[1 2 2]; 加分号表示不显示命令执行结果 定义空矩阵B=[], w6 I2 `, N# i7 K/ ^
矩阵转置——A=[1 3 5 7]  B=A' 或 B=A.'可以把行向量转换为列向量
3 c0 l8 @: {2 Y7 h/ j5 C* [取元素——A(1)取A中第一个元素  A(1:5)取A中第一到五的元素 9 x1 Z: l. y6 w- K# R& o
                  A(1:end)取第1到最后的元素,产生一个行向量; A(:)产生一个列向量
8 O) |( ]5 U) ~6 X7 \                 A(1:2:end)表示步长为2 步长也可以为负值 如A(end:-2:1)
4 b0 k7 ^2 ?* Z' F! a% F, g& ~linspace——x=linspace(a,b,n)产生含有n个元素的行向量x n个元素线性隔开 并包含a和b3 K( Q* `5 S0 y) k: \
:的活用——A=[1 2 3; 4 5 6; 7 8 9] A(:,3)取整个第三列  A(1:2, 1:3) 取两行三列4 I0 {  ^. P0 m
+
% R, d+ R! Y3 O$ Z) _1 p2 |-
) n, q. D  U6 S. x*——* 表示矩阵与矩阵相乘,满足线性代数上学的矩阵与矩阵的乘法,
7 u4 S# d: M, y3 }3 g# S. ~* K   .*表示矩阵中元素与元素相乘,这两个矩阵的维数必需相同。/和./也一样的道理7 I) y$ c' B6 Q+ U* L5 M; G0 n
1 ^1 n6 t7 p  i
: `) }: s! E: q' ?
length/size/numel的用法:
1 p8 H8 D0 r. J: n, `
( N# Y0 G# Z# b* R* f1 F; r* v' Llength(x) ——返回x的长度 如果x是单个变量 返回1 如果x是矩阵 返回该矩阵行数与列数中的较大者。" f: {4 k# {3 w# N4 y: h( k- [: K
) c3 ]) T7 O/ b, u- _
size(x)      ——当x是单个变量时,返回[1 1] 当x是矩阵是 返回矩阵的行数与列数 可以这样来接受[m n]=size(x)
% T& f6 q- T1 m' i# u
: n% a2 S# p+ F! Gnumel(x)  ——当x是单个变量时 返回1, 当x是矩阵时,返回矩阵元素总个数。# j2 o2 m) W4 A) Q
2 P4 Z6 v& Y  m4 T$ [" Z
/* c# C, A3 e! I7 X0 _8 V
! A. U) i4 G$ S  S7 E
format compact——以紧凑方式显示
% o; c+ e- Y( [& p2 jformat loose  ——以松散方式显示. l- T: p, N* ~2 a0 b& f* p
1 v4 h- z2 O, {
mean函数:
2 G$ H# q3 y7 d% v' k5 f: ]: d1 P# }
2 B% N. h6 \8 X1 l, R3 @    >>如果有这样一个矩阵:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];1 l  }, o! w6 v' P
         用mean(A)(默认dim=1)就会求每一列的均值* ]; r& f3 A" m& M; U2 \, ]& g
         ans =3 h8 m& q4 [! f6 G  C# W
             3.0000    4.5000    6.0000
+ q9 x, c, [7 W, g9 ^/ K% g1 V4 n" \; o8 B! U' L7 U
    >>用mean(A,2)就会求每一行的均值
8 i9 A8 R9 S4 a4 x    ans =. z& N3 G/ N3 v
        2.0000
0 P  [- q6 b; U# Z$ x7 s6 X* {* f" E5 t        4.0000# L" h3 X7 G' ]$ ?
        6.00001 x3 t5 \5 O# N2 [
        6.0000& p$ C" I" T9 U, m

5 u3 I6 ]$ H9 V, V% U/ W   >> mean(A(:)) 求总的平均值2 `1 I( J5 _' d3 l  V

+ t& k" n1 l0 P9 Q% ~& _
. U8 h: }9 F6 w  \( z其他函数:
$ S; Y1 `5 J" o2 m5 b7 L# H4 s3 K% j% t" u- o5 i* x
zeros(M,N)——生成一个M*N的double型矩阵 元素均为0. g' [% o# [% \0 C  U
ones(M,N)——生成一个M*N的double型矩阵 元素均为1# S7 y' e7 A/ W
true(M,N)——生成一个M*N型的logical矩阵,元素均为1' k+ K) ~% R+ z% D
false(M,N)——与上面的true相反
  ~6 ~+ _/ U1 j6 j+ xmagic(M,N)——生成一个魔术幻阵
: z, R. t- i4 {5 J: b" `6 M1 |rand(M,N)——生成一个M*N的矩阵 元素大小在[0-1中均匀分布]! m9 N' G# N( \' D9 |
randn(M,N)——生成一个M*N的矩阵 矩阵元素正态分布 随机数均值是0 方差是1." b( V$ }! O' v+ B& B
plot(X,Y)——画二维图像  D3 T6 T  T" H# m/ ^; z$ h1 @
subplot(m,n,p)——m代表生成图像的行数,n是列数,p代表子图编号0 `* F0 k4 q$ h/ A$ W/ N
plot3(X,Y,Z)——画三维图) u, E. t# I% D8 o7 \
mesh(X,Y,Z)——画三维图
  }" s2 g5 m9 t. Y! ~3 I/ FsuRF(X,Y,Z)——画三维图,并上色: @0 s; x+ U0 o& L/ X
, m5 }/ E" j& P3 R  J
matlab函数设计:8 l- i8 F/ Y7 l# j, x5 f

( s+ `( A& z2 E3 Z7 K2 n.m文件建立的函数文件
7 {- O, i, Z( v; X0 K2 T, m6 Ufunction [A, B] = fun(A, B) //输入A、B两个变量,返回A、B两个变量 一般.m文件名命名为函数名字0 S. L0 a# C' }" Y) ^% Y: s# Y2 E+ s- Y
% xxxxxx 代表注释,在命令窗口中输入help fun可以显示这个注释% A( A/ X8 E: s
- L4 A+ B; H3 A- Q( I- A' d
) u. m  N( V+ h1 ~* K  b
实例:- M! Q4 |6 U- s
  • 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;
  • end7 d3 T( w$ ~% P2 E. H

& i, Q1 j3 j( p& r# q调用时写tow(10),就可以计算1~10的和。
4 @& a* u! K7 c4 m/ }# ^9 B
" B' _$ ?8 Y1 V3 O4 Q9 ]! e9 ^5 J# [
匿名函数:2 N5 E- E% k3 u& E0 G: P

: o% p+ h  @, c$ q+ @6 Nvar = @(x)(x+1)9 R( _& N0 [) C+ o
调用时形如var(1)即可,@后面跟参数列表
6 |, A( P: c+ ~) K& N' V- O. c
+ d* L& v, N2 x6 P- }* q$ q% j6 l. `接受用户输入信息:
" \& B, z5 J# S0 Ct = input('Enter you data:', 's');* n8 O" G$ s4 Y& _( c
t='12.6, x2y, z';
0 h  D3 _9 A1 q3 l[a,b,c] = strread(t, '%f%q%q', 'delimiter', ',') //按指定的格式读入a b c
3 _9 I' U$ c  x  @
  N2 Z. K  M0 Y3 |2 l- P; O+ Ymatlab中,图像大致分为二值图像(0/1)、灰度图像(0-255灰度级)、RGB图像(R、G、B三个分量 三个分量都相同时,所表示的颜色就退化为灰度)、索引图像。
! L+ L! M6 r* J+ C1 [: U& h      灰度、亮度、强度通常是同一个概念。
; w' T& }! \- i% R( N( o      所有图像按照特性分为位图和矢量图,位图常见格式:JPG GIF BMP矢量图:PNG
3 ]. J4 s1 {1 P. n+ v1 P# h$ j      机器视觉又称计算机视觉,试图开发出一种模拟人眼的能力,能够理解自然景物与环境的系统,比较高级哦。6 ~+ T# a4 x# u: A% c- N

/ q3 `) U$ ^. e8 ?% x' Unargin将返回输入到函数的参数个数、nargout用于函数的输出  _+ O$ n# g  {
nargchk用于检查参数数目是否正确margchk(low, high, number),使用实例:
" s$ w, p9 _2 }: a9 f. P8 H8 ^1 Gfunction G = test(X, Y)6 U+ r. {  y" D9 R( e
error(nargchk(1,2,nargin));
+ W' U6 S* a  V! }+ l, r: r% h- @  W% K
% ~( z0 A0 W6 }; Z
2. 图像处理基础:
  l. a+ N) L8 s) h3 O" [1 G; cimread——读入图像A=imread('1.jpg')
# l) [- v5 g0 c! k# Kimshow——显示图像imshow(A, B);  imshow(A, [low high]);
6 _3 p" e: C5 X) Q" u6 v  m1 c                    会将所有小于或等于low的值显示为黑色,大于或等于high的值显示为白色
4 j" Q) t* l$ H                    若B省略,默认的灰度级是256,imshow(A, [])  []表示将low设为A的最小值 将high设为A的最大值
4 [, A0 y  N9 e! a* _                    显示多幅图像:imshow(A), figure,imshow(B)
% x  [9 G+ Y1 X$ `2 [/ F2 z7 `imwrite——保存图像 imwrite(A, '2.jpg')0 ], y# r. J- A- s! \
                     imwrite(A, '2.jpg', 'quality', q) // q在0-100之间(由于JPFG压缩 q越小图像退化越严重)# @* R4 E! [5 Z% X/ S5 U' W
size(A)——显示图像的大小
# o) U. @! Y: h% U+ l4 R# `imfinfo——显示图像的详细信息 imfinfo 1.jpg 也可以K=imfinfo('1.jpg') 就可以使用K.Height K.Width等等信息
1 ~- B, ^8 F! z2 n' w. r                    学会计算图像的压缩比:imgBytes=(K.Height*K.Width*K.BitDepth/8) compress_bytes=K.FileSize
; O4 l( A: e; E+ ^% ~2 k& A                    imgBytes / compress_bytes ==压缩比
3 Z0 x/ ]& ^, [9 m! b* E& c1 N! f. ?. z2 o
                    命令窗口输入:imfinfo test.jpg,显示信息如下:                    # H( n& ^& M6 ]8 o$ L" i; U
! v. K9 r- R8 I: b& y
  • ans =
  •            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: {}
    9 o% j% n7 |& _/ S( d, u
! u. i* z7 \4 d* `, }- K
4 N: r- y% N4 }) g, E* o$ r
double/im2double/mat2gray的区别:
% y7 w+ v1 Y7 E% \9 w4 L. A
# }! P# r) Z3 Z9 P        A=imread('1.jpg');
4 k( t5 \- }3 u7 e! _/ g) r# |7 ~" O& b3 f4 I4 w) S
        A(1,1,:)          ——显示A中第1行第一列像素点(包含红、绿、蓝)三个分量的值
& D8 Z- M+ |' c+ c( ]- k   8 h! j0 H0 ]0 Y1 U6 h
        B=double(A)——转换为double类型 值不会变 注意 使用im2double值会[0-1]6 F, g8 r+ A# X4 z) e- @8 B) n
        im2double   ——若输入是uint8类型 每个值会除以255.   h8 P1 G8 U% C( F9 Q
        mat2gray()   ——可以将double类型转换为归一化的double类型9 O7 S! _' T1 v1 K. c
        区别:' }  K6 l6 Z2 O! t
        im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;如果输入类型是double,输出没有处理;- \* G% Z4 m- I5 m% M

0 u; B! \. f) p4 j$ o6 P        double:返回数值与输入相同的double类型矩阵;
/ I( W9 L# u3 G! i( a
, J1 [7 ?8 v2 e        mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。3 L1 P' p: G4 O  {: D' Q
        在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据。9 u9 u- z$ ~) R- J: g9 t

) I' V2 b4 \2 F9 v8 A; H( C注意:uint8类、uint16类RGB图像取值范围分别是[0, 255]、[0, 65535],而double类范围是[0, 1]# F( k6 T3 D! L8 u, [! k

( e! n4 Q7 `0 [' V( J4 L; XC=[-1,0.5; 2,3]
8 O0 l- l  ^3 W" UB=im2uint8(C)——im2uint8把所有大于1的值转换为255 小于0 的值转为0 其他值乘以255
0 N$ z: ?' T, T+ H2 q% I1 L5 e) D9 Pim2bw          ——得到二值图像 可以先A=mat2gray(B), im2bw(A, 0.5)* ^9 V! i& U* |/ S2 e4 H( j+ c/ u
3 x$ a3 L( z- G
7 S. F! v: |: E0 E
IPT支持的图像的算术函数:: O$ n0 G/ j3 R* V5 S( q
imadd——图像相加
, r# Q0 M7 P0 Z3 S( eimsubtract——图像相减
2 b/ s* @: S' R4 Z) F$ O; {immultiply——图像相乘2 i$ w# ]& z3 C& K0 T: L* v# \
imdivide          ——图像相除
2 r& X. |( U6 Q3 c6 V9 pimabsdiff——计算两幅图像之间的绝对差
3 [. o' Q7 F, S4 d* J- v: ?imcomplement——对图像求补
9 _6 p5 U7 A$ R1 @8 x) h' U& s1 h  zimlincomb——计算两幅或多幅图像的线性组合& L+ g9 j- `& C; e: j4 |# S

( n: p7 H$ G) }: {$ Q, S$ k/ Q) a图像旋转函数:/ ?% y) j; a% _- ]- E9 b' k2 l

1 N& d4 F; n2 f6 h( Uimrotate,matlab默认是逆时针旋转, imrotate参数解释:
6 T$ E4 C1 C/ x3 S+ {4 Y7 c4 D$ O4 b9 w! q! `  v) Q
        angle顾名思义 就是你旋转的角度, method 就是你实现旋转用的是什么方法,有三种  和后面的插值放大缩小是一下就是 最邻近插值法 双线性插值法 三次卷积插值法,英语表示就是  'nearest'    'bilinear'    'bicubic'。
3 ~& ~# k# ^, ~# d+ T        不同的插值方法得到的旋转图像有细微的差别 如果你不选在 matlab默认的是最邻近插值法 那么图像会有一定的失真,这个失真主要是因为matlab在计算每个点的新坐标的时候得到的数值不是整数,要去整所造成的最后说说bbox   这个的意义主要分为2种,也就是说我们在这一项有2个选择 一个是‘loose’ 另外一个是‘crop’
& `2 L! G6 Y) v) E7 {0 D5 P1 {        loose  就是宽松的意思 顾名思义就是说 图像旋转后 系统会给予一个宽松的环境去匹配它,这样你得到的图片就是一个完整的图片
3 s) B9 q. u* b7 e# Z' x; V' u. s# x3 t! G; A) w4 l* |. S1 @
        matlab的解释是 When BBOX is 'loose', B
$ K  T2 N- ?, P& R9 C  F- P" l) w6 @
        includes the whole rotated image, which generally is larger than A.
  a( a: O* m" e# p        crop 就是剪切啦,也就是困扰了大家很久的问题,为什么旋转后图像变小了,因为matlab默认的是crop  超过图片原来大小的部分被crop了# [+ ^9 O! F- {7 r- h" @. S4 l. k/ L
" b1 S8 v& m' r4 X; g9 U; p
  • >> subplot(2,2,1)
  • >> imshow(A)
  • >> subplot(2,2,2)
  • >> imshow(imrotate(A, 30, 'bilinear', 'loose'));
  • >> subplot(2,2,3)
  • >> imshow(imrotate(A, 30, 'bilinear', 'crop'));3 q  m( R: F0 p% v! [8 q5 _

/ T/ n6 y# f$ ?
' j# i9 {. A) d. q1 ~3. 亮度变换与空间滤波:* H5 Z: j! ?5 M. X1 w
1. 亮度- J: ?/ h3 K9 e
    imadjust函数6 ?) ~5 Y$ I. ^# L
    A=imread('1.jpg');
: L4 y; J& c( `3 O, ]    B= imadjust(A, [], [], 0.75); // gamma<1 变亮
  b; ?) ]$ H9 T5 `3 O    imshow(B)+ t. e. N8 m0 u& D" ]

4 \3 P9 s0 L+ g: @0 q  [" C1 Z    C=imadjust(A, [0 1], [1 0]);
0 T& H1 ]9 E" j    效果等价于C=imcomplement(A) 都是求图像的负片 5 i% o. Y+ S" }9 l7 c9 A2 I$ j
2. 对比度拉伸函数' j; v3 @' [# O, u6 j. ^% X" ~  t4 q
     g = 1./(1+(m./(f+eps)).^E) // 加eps是为了防止溢出
/ ]0 s% ]$ V/ E- }3. 直方图
/ L; d4 w  q  @/ `% f8 p8 H    imhist函数:; ]! ^: W' I' ]" Y' g7 L
    h = imhist(f, b) //b是灰度级个数 默认是2567 U& R: Z$ `3 s) P
    numel(f) //得到像素点个数
3 o3 x% v& T7 N# M" F# f; l    B=rgb2gray(A); subplot(121), imshow(B); subplot(122), imhist(B);! [3 ^3 Z1 H1 x
    直方图均衡化:
8 D2 `$ c/ A1 {4 r    histeq函数:
0 I1 @# x. }* |5 ^1 n. k    J=histeq(I)% w6 t, S* x, j1 ], U. |/ c7 z! e' N

4 r1 N' C0 S% `! }7 H$ u) f7 T4 ^* A. s7 Y
实例:4 T$ C: K5 `# X6 ?( B5 J; E1 w) D
  • >> A=imread('test.jpg');
  • >> B=rgb2gray(A);
  • >> imhist(B);//显示直方图
  • >> figure;
  • >> imhist(histeq(B)) //显示均衡化后的直方图
  • >> C=histeq(B);
  • >> imwrite(C, 'xxx.jpg');
    ! M1 `! V8 s# d2 ^) p
+ f* j6 N3 J5 s
" @3 W2 ^" ?( A  ^; {
图像如下所示:
. _5 Z! I, a! X' Q: b% {
( U* {' _9 I* K% j
' z3 a9 B2 L; e4 i; P+ ?+ m* _- P# |3 m0 G$ |9 K4 |* m% e

: q* Y; {! @# v9 U* I8 B" u  B: d) ^( O8 |# {+ Q
/ p- I9 G& C+ o- d! e2 I
4. 空间滤波:0 a, {0 X; b5 W& L8 b5 ?
3 ?* k0 n; U6 d+ q
    线性空间滤波:imfilter函数
& \( H4 ^+ p; u) W: o    g=imfilter(f,w,filtering_mode, boundary_options, size_options);
5 R6 \# O5 o! Z( Y0 J1 i( f8 ~    //filtering_mode=corr/conv size_options=same/full
  b  A2 }# k2 t0 H1 M" M    通用语法为 g = imfilter(f, w, 'replicate');- l1 b( n, B/ ^: H9 Y- ^
    非线性滤波:colfilt函数
" u7 Z$ J- q: O* q0 E8 N! Q
& C  u5 ^5 _7 x' R    IPT中的线性滤波器:
6 h6 I" f- i* }' I' ?1 C9 k& z: S      fspecial函数用来生成滤波掩膜w
1 W! Y+ S5 r: Q      w = fspecial('type', pARM) //type表示滤波器类型/ Z4 e. F' N3 a4 b6 U
      type值可以是:average disk gaussian laplacian log motion prewitt sobel unsharp4 k9 t4 ?, s5 e' s

9 H8 i9 p+ i$ R4 |- e* x8 M- c实例:
( [% j- ^1 ?' }# P: k  r- \使用拉普拉斯算子来增强图像,包括锐化,同时应该保留其灰度色调
- w( r- b6 K, B9 J) h% w. t% m. `- Y$ Y
test_shape.m
& y8 L# a! a) V' `: R
  • function [] = test_sharp(A)
  • % Test Sharp
  • B= im2double(A);
  • w= fspecial('laplacian', 0);//laplacian时 第二个参数默认是0.5
  • C= imfilter(B, w, 'replicate');
  • D= B-C;
  • imwrite(D, 'out.jpg');
  • 最后对比A与C的效果  发现图像明显更为清晰了。。。
  • 可以直接用unsharp选项,效果与上面的差不多
  • A=imread('test.jpg');
  • w = fspecial('unsharp')
  • B=im2double(A);
  • C=imfilter(B, w, 'replicate');
  • imwrite(C, 'out.jpg');
    4 t; K2 k9 B# ]6 C  ~
) E* H; ~+ G$ x1 x
上面使用拉普拉斯算子产生的w=[0 1 0; 1 -4 1; 0 1 0]; 中心为-4,现在我们手工指定中心为-8的情况如下:, l/ m' z+ g1 U+ \5 g
  • function [] = test_sharp(A)
  • w4 = fspecial('laplacian', 0);
  • w8 = [1 1 1; 1 -8 1; 1 1 1];
  • A = im2double(A);
  • A4 = A - imfilter(A, w4, 'replicate');
  • A8 = A - imfilter(A, w8, 'replicate');
  • imwrite(A4, '4.jpg');
  • imwrite(A8, '8.jpg');
    6 \$ I" ?. a% c4 {6 ]) {% ]

+ U3 R& [% L+ L% }# G2 `7 }* R3 S: q) e8 z
会发现图像锐化效果更好,图像更清晰。0 O" A2 v. Y9 x0 n$ N% j- A

* U3 X" y# ]- y$ C( G) J+ n    IPT中的非线性滤波器:
* U8 l# E# I, w7 V& k6 ^5 i0 C2 t$ j0 s8 K    ordfilt2函数  g = ordfilt2(f, order, domain)/ w% V5 u% _4 S3 R, [: l3 t8 o. X
    中值滤波medfilt2, V/ g% a( ?) y% |' v
    图像中加入噪声:格式:J = imnoise(I, type, parm)
/ B: S( Q9 B% n9 V) I  K
4 r* {/ F6 A, ^5 Q2 [* M8 C    >> A=imread('test.jpg');; o. K  o: X3 w9 N2 D
    >> B = imnoise(A, 'salt & pepper', 0.02);
$ C. M) P9 C3 ?; X; o+ d+ R' \    >> C=rgb2gray(B);& i# i/ E. q) N( m" {* }
    >> D=medfilt2(C, [3 3]);//中值滤波2 y) e1 r( I* e9 p
    >> imwrite(D, 'xxx.jpg')
( L& q& ^- s$ }' U* V3 d% H0 }
% z- q; l* N4 u+ j& c, v. _0 n1 o" n
4. 彩色图像处理' E9 A4 I  n( V
>> A = imread("test.jpg");- _5 K' W8 N- Y$ I1 [& u1 B, `
%获取图像R、G、B每个分量
1 L* a7 u+ |& o>> R = A(:,:,1);
- \$ L( x( t6 K. x>> G = A(:,:,2);& h3 v  h, J" Y7 r9 ?
>> B = A(:,:,3);
  n- j) Q3 S3 o( k" p3 Y+ Q>> D = cat(3, R, G, B); //cat组合成图像
3 q% q2 d/ ~% ^1 M, C! o' |. z5 U* L- \, i9 J& t9 O
  • clear
  • rgb=imread('xxx.jpg');
  • rgb_r=rgb(:,:,1);
  • rgb_g=rgb(:,:,2);
  • rgb_b=rgb(:,:,3);
  • [x y z]=size(rgb);
  • zero=zeros(x, y);
  • R=cat(3,rgb_r,zero,zero);
  • G=cat(3,zero,rgb_g,zero);
  • B=cat(3,zero,zero,rgb_b);
  • RGB=cat(3,rgb_r,rgb_g,rgb_b);
  • subplot(2,2,1),imshow(R),title('红色分量');
  • subplot(2,2,2),imshow(G),title('绿色分量');
  • subplot(2,2,3),imshow(B),title('蓝色分量');
  • subplot(2,2,4),imshow(RGB);- [3 a2 t+ E! ^

" {) Z% @# K% Z) j$ P; t' Q: J3 t) k& J% c% L3 u- p
" D( _4 u6 E1 ~( R8 l
: _- ~2 M, n# T! _4 A( f( i$ @9 P

该用户从未签到

2#
发表于 2019-12-13 19:26 | 只看该作者
给大神点个赞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 23:08 , Processed in 0.187500 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表