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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
9 o5 ?, ~' C* p7 o( O  x  T1 B  K; B
由于工作需要,开始研究一下MATLAB图像处理相关的知识,图像处理只是matlab应用领域中小小的一部分而已。以前只是听说过MATLAB很强大,但没有系统的学过,如今开始学时,发现matlab确实很不错、很高大上。操作起来很方便,特别是编写程序时,比C语言更简洁。, i% X# I4 v' P$ N

2 ^2 G3 l- k& i1 ?0 P很多人都是大学里就学过matlab的,由于是半路出家,所以知识不是很全面,直接拿了一本冈萨雷斯的MATLAB版的书就开始看,下面做一些简单的小记录。7 n. q1 j; X9 h6 o1 K$ i! C7 I! n

4 {8 T: B$ P/ I) ~' `2 H6 T2 K: f% m1. matlab命令基础:) B: V. d0 J! Y! R3 F, h
基础命令:
! C; i& K. O. y5 j: p8 _# i: C' K  M& e; U" H6 u9 m  l! g
clc——清除窗口
4 O) P  _) {0 {9 [0 b9 t2 Fclear——清除之前赋值过的变量) B# v+ i1 T9 a3 q4 o0 e) T8 Y
disp——打印信息,相当于echo
* {/ e, t6 M# E/ w' t5 Z! E2 }# acelldisp——打印元胞数组内容
9 ]: J! E8 _. ~  W& i. Hwho——简单的显示当前已有变量
& t% z1 F8 z3 Iwhos——显示所有变量及详细内容 whos也可以指定显示某个变量
- ?3 g' i, j( {7 p2 k1 Wtan/sin/cos/log ——各种数学运算
$ y  W. ?# C' x9 Z: b  }...——用来续行
+ {. S* l. U2 W- C2 G定义数组——x=1:100
( I* ?0 I1 K! i# i0 [* `- o定义矩阵——A=[1,1,2] A=[1 2 2]; 加分号表示不显示命令执行结果 定义空矩阵B=[]8 L/ w: U; `( \  c
矩阵转置——A=[1 3 5 7]  B=A' 或 B=A.'可以把行向量转换为列向量
0 i. S" L0 n9 u) b6 `2 X& T+ k/ j4 z取元素——A(1)取A中第一个元素  A(1:5)取A中第一到五的元素
1 s3 ?+ R0 O, W6 @                  A(1:end)取第1到最后的元素,产生一个行向量; A(:)产生一个列向量
) q4 I5 k: s6 y: I* e                 A(1:2:end)表示步长为2 步长也可以为负值 如A(end:-2:1)
" ^8 r+ f) @5 K2 o. Clinspace——x=linspace(a,b,n)产生含有n个元素的行向量x n个元素线性隔开 并包含a和b$ [9 @2 {" G: c" e( y  L( W
:的活用——A=[1 2 3; 4 5 6; 7 8 9] A(:,3)取整个第三列  A(1:2, 1:3) 取两行三列' J# _8 o6 [$ |0 U7 j
+- Z( L6 ~8 u" A% Y" u* k) U0 v/ b
-4 V7 e& N, Q4 N1 u$ [
*——* 表示矩阵与矩阵相乘,满足线性代数上学的矩阵与矩阵的乘法,0 `' M9 y  u- B
   .*表示矩阵中元素与元素相乘,这两个矩阵的维数必需相同。/和./也一样的道理
( G2 A# m8 g$ |2 ?7 R5 G: @( H7 o4 P; J# T
, g( U# K; @- e5 n: R: v
length/size/numel的用法:
$ E6 B- Q# W$ `9 r+ n0 b2 B9 R# h# `) ], h1 R
length(x) ——返回x的长度 如果x是单个变量 返回1 如果x是矩阵 返回该矩阵行数与列数中的较大者。1 T  r2 g7 N! G# r6 C& ?1 @
  C5 V  u) l" d+ [
size(x)      ——当x是单个变量时,返回[1 1] 当x是矩阵是 返回矩阵的行数与列数 可以这样来接受[m n]=size(x): a4 Q7 m0 g' X5 d

* Q; l3 t& L& a( L7 Inumel(x)  ——当x是单个变量时 返回1, 当x是矩阵时,返回矩阵元素总个数。7 A0 a/ Q: Z) U+ J, |" d

3 Y! ~. M3 m/ N/ ?6 S8 S// a# K3 j1 X, F- ?( X' F

6 J  o. g# M) J8 G, u: D" j8 vformat compact——以紧凑方式显示+ j0 Y% V4 }( r! X+ b! F( ]
format loose  ——以松散方式显示
! C+ m! D9 j: Q6 `
: G( u4 p4 p. s8 Y( G. C, mmean函数:- \8 g2 S  C% i5 Q& h5 C+ b

: w" \( n1 \+ x: Z    >>如果有这样一个矩阵:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];9 c2 v0 ^+ V" L+ n
         用mean(A)(默认dim=1)就会求每一列的均值9 U' K" _0 g7 {! z% W0 q7 {6 i. |8 A
         ans =, j! K+ Z/ ~) G& b; m( c
             3.0000    4.5000    6.0000/ R3 w- Y) T1 A* T* b& M, x: N# N

: A5 [- f6 A$ z9 g5 |$ L: ?    >>用mean(A,2)就会求每一行的均值
& b( r: }7 A7 \9 x9 c, S# v9 v    ans =
7 V" y* V* |% S0 b7 R6 n        2.0000
1 `$ Z1 O4 h/ i7 ?) }0 C        4.0000$ o8 Y/ H7 Y, u4 }; \& [3 b
        6.0000
& H* \: s1 ?$ N7 o) {5 X        6.0000
4 n1 O0 }4 n3 J& ?2 b: I% p# x! A5 r' |. ?1 g+ j1 [* I
   >> mean(A(:)) 求总的平均值9 Q+ x9 J* i8 j; j+ v" C

* |0 q1 H# M, f4 `8 u) s' q) q& b  y$ `) Z3 y7 }# P% A7 K
其他函数:7 L: w8 N3 C5 _2 y6 |

- L/ |: p# M" zzeros(M,N)——生成一个M*N的double型矩阵 元素均为00 V- J8 u0 q: \4 m
ones(M,N)——生成一个M*N的double型矩阵 元素均为1
9 U1 \+ f2 |% N2 l5 A* M6 Mtrue(M,N)——生成一个M*N型的logical矩阵,元素均为1# `( X% z2 J" t: H3 y6 j
false(M,N)——与上面的true相反
+ Z6 X7 Q, [; w9 u# i2 g- |0 Bmagic(M,N)——生成一个魔术幻阵) }3 D2 [$ D# k% W4 H4 L( f4 q
rand(M,N)——生成一个M*N的矩阵 元素大小在[0-1中均匀分布]
4 N% ?1 E* `6 W4 J1 Z) @( hrandn(M,N)——生成一个M*N的矩阵 矩阵元素正态分布 随机数均值是0 方差是1.7 y# u  z( M8 l! e: e
plot(X,Y)——画二维图像
* z, r: {2 q+ u/ _" x2 E* m7 w, Gsubplot(m,n,p)——m代表生成图像的行数,n是列数,p代表子图编号( Q( Y1 a  ~9 ~, v+ N' d- }
plot3(X,Y,Z)——画三维图
/ M& q% z. a4 T: W0 Ymesh(X,Y,Z)——画三维图
/ N/ n& \  y8 r+ ]  WsuRF(X,Y,Z)——画三维图,并上色  p+ A- T% h/ u& g3 W

3 [- @" g$ q: D1 V8 ^; B( \matlab函数设计:
3 D5 J* S  Q! m% C! p0 ]# m$ }7 M/ L7 \4 L5 S5 O
.m文件建立的函数文件
0 n# B1 D1 l5 Y, Rfunction [A, B] = fun(A, B) //输入A、B两个变量,返回A、B两个变量 一般.m文件名命名为函数名字
2 k' E0 r* a$ r6 q* K8 R* @% xxxxxx 代表注释,在命令窗口中输入help fun可以显示这个注释2 S, v+ w. A7 n: R
8 a+ v7 w5 K9 ^; F2 P  p* r
1 b/ O( c. j$ K- h
实例:
* z' E: L2 f+ I" P* d* F
  • 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
    % V! |; X3 G2 {3 D
3 G  P4 r/ V( l2 H3 t; i
调用时写tow(10),就可以计算1~10的和。2 e9 d# u- ^" i) S; m2 `/ Y
0 x. _0 b+ k6 O* U1 w
: c9 j6 f) G, {
匿名函数:, Q. q) ?9 i4 ]& W$ X
* Y3 l9 H, P. E: e
var = @(x)(x+1)- }! V9 Q  m0 T
调用时形如var(1)即可,@后面跟参数列表
, P# E8 `, g! @+ d' r3 q7 F' p4 n
' a9 Q; ~* }2 \% ^0 A9 @4 N9 g- L接受用户输入信息:
6 ?; S) u5 |& i& f* A$ `! G: c2 O" bt = input('Enter you data:', 's');0 x+ K5 q6 B( Z9 O7 p5 a, e, D) H
t='12.6, x2y, z';
6 Z! w) [* H, _2 \2 ?[a,b,c] = strread(t, '%f%q%q', 'delimiter', ',') //按指定的格式读入a b c2 w" H! y* m; i  B/ z4 V

2 I: m8 b  ]7 w+ j' h9 }. d+ xmatlab中,图像大致分为二值图像(0/1)、灰度图像(0-255灰度级)、RGB图像(R、G、B三个分量 三个分量都相同时,所表示的颜色就退化为灰度)、索引图像。
, b1 E/ l0 W, H# s3 w      灰度、亮度、强度通常是同一个概念。5 Y. W2 k. H" A8 {
      所有图像按照特性分为位图和矢量图,位图常见格式:JPG GIF BMP矢量图:PNG! |8 D- }1 |; j
      机器视觉又称计算机视觉,试图开发出一种模拟人眼的能力,能够理解自然景物与环境的系统,比较高级哦。5 b! d, F- n  C  M7 Q8 I
  }( v; C( y, S0 z9 x$ w6 v" X
nargin将返回输入到函数的参数个数、nargout用于函数的输出+ u5 G6 |) d) {! P& K0 X' |
nargchk用于检查参数数目是否正确margchk(low, high, number),使用实例:, m$ R, Z' N9 v% v) ]
function G = test(X, Y); i! A. N/ l' n& H) ?
error(nargchk(1,2,nargin));# H) Z6 X1 V0 n; x1 j9 a

0 K. u3 U3 c! B, q$ a! A% o- \" k- C/ y% j! Q; ~2 a; y
2. 图像处理基础:
/ Q& e3 v: |- P2 U0 `5 Rimread——读入图像A=imread('1.jpg')% L% a3 c3 `6 c4 i! L  F
imshow——显示图像imshow(A, B);  imshow(A, [low high]);. C/ U# ]) K; w# T
                    会将所有小于或等于low的值显示为黑色,大于或等于high的值显示为白色
* T; Q3 B. I1 ^                    若B省略,默认的灰度级是256,imshow(A, [])  []表示将low设为A的最小值 将high设为A的最大值( q$ _% c+ h. z+ t4 a& E
                    显示多幅图像:imshow(A), figure,imshow(B)2 T1 N8 b- y) g
imwrite——保存图像 imwrite(A, '2.jpg')% i( f+ s: F4 s; N% K- `* b
                     imwrite(A, '2.jpg', 'quality', q) // q在0-100之间(由于JPFG压缩 q越小图像退化越严重)4 U& s9 Z5 C% p+ C- D
size(A)——显示图像的大小
, |8 ]- D; ^. M( ?imfinfo——显示图像的详细信息 imfinfo 1.jpg 也可以K=imfinfo('1.jpg') 就可以使用K.Height K.Width等等信息6 r3 W9 u3 F7 v8 L. i4 Y+ R
                    学会计算图像的压缩比:imgBytes=(K.Height*K.Width*K.BitDepth/8) compress_bytes=K.FileSize. u; \  f  M3 \4 \9 M, a$ f
                    imgBytes / compress_bytes ==压缩比
3 u) M5 F  F$ P( f( z
; p# b  ~) S& [$ K) ^( u4 ^! a4 k                    命令窗口输入:imfinfo test.jpg,显示信息如下:                    
% W2 P$ F9 C! q# R: g1 b3 @0 c
- O- |/ w1 C9 l/ M
  • 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: {}% x7 L6 z+ S; y6 }( _) W2 o

1 l) P2 F  K8 f) i9 Y+ d' F" B) b# Z4 K# }
double/im2double/mat2gray的区别:
) H8 w* _- {9 S/ N! E& t6 i; w0 ?: J! E+ Z3 l: [$ k
        A=imread('1.jpg');
6 c6 g2 t( w, D5 |
1 x% W6 ]2 t. Z' g# A        A(1,1,:)          ——显示A中第1行第一列像素点(包含红、绿、蓝)三个分量的值
' _/ g, y( e% n4 Q+ B   
1 i) x0 y- l) Q- Q0 i6 _# L        B=double(A)——转换为double类型 值不会变 注意 使用im2double值会[0-1]
5 l$ j% f$ e" U0 i        im2double   ——若输入是uint8类型 每个值会除以255.
# q5 W5 e+ |. N% ~  h; A$ K  _        mat2gray()   ——可以将double类型转换为归一化的double类型: }& a8 w# S- N; M
        区别:) }( Q# X2 y; @- ^( x) h
        im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;如果输入类型是double,输出没有处理;6 V# H; x, p' t7 n) N; y" i( t

% R: B8 ?3 V: L  K: G2 _9 i" {        double:返回数值与输入相同的double类型矩阵;) m4 T: ]+ |) P
0 ^) y) F# B; Z  `0 D% j' g
        mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。
& J6 i9 b+ a7 o% K        在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据。0 Z" M/ n. B- B! F

  Z) W' q$ ]7 p7 C# m  K2 b2 x3 k) J注意:uint8类、uint16类RGB图像取值范围分别是[0, 255]、[0, 65535],而double类范围是[0, 1]
; {: _1 S$ l2 h
. H4 c3 P& j5 {6 Q$ _) Q3 e8 pC=[-1,0.5; 2,3] ' @& v: C. |; q. V, m
B=im2uint8(C)——im2uint8把所有大于1的值转换为255 小于0 的值转为0 其他值乘以255. N' \# s) K* C7 q$ a1 {
im2bw          ——得到二值图像 可以先A=mat2gray(B), im2bw(A, 0.5): [! \5 w2 _8 k: k6 ]
5 V! ^" D0 D! l2 s+ I" Y$ w& ]

4 V3 Z! R' Q) M8 @IPT支持的图像的算术函数:1 z. _# u1 b( N) Y- o8 B6 H
imadd——图像相加
& T; [" k: w; B4 j/ p* \; Q9 Zimsubtract——图像相减2 h/ H* w# f- [* m
immultiply——图像相乘
+ l+ N! ~7 y; U. d' L8 T. oimdivide          ——图像相除% x8 [/ f6 ]; C5 ^! r: Y
imabsdiff——计算两幅图像之间的绝对差3 d2 R0 T5 o1 e7 q& c9 ]$ A
imcomplement——对图像求补* D& N: D7 h/ V' c8 I6 ]' J3 ^- A
imlincomb——计算两幅或多幅图像的线性组合
1 w/ v+ i. ?# d3 g$ u, a5 U, X+ o6 W! E9 }' w( M! @
图像旋转函数:
8 P) d0 L8 Y1 M- r
% k: T  v7 `* `5 I$ c+ aimrotate,matlab默认是逆时针旋转, imrotate参数解释:: X" [+ I& R, Z: t& a4 P

- L) K. @5 I& S8 k) S        angle顾名思义 就是你旋转的角度, method 就是你实现旋转用的是什么方法,有三种  和后面的插值放大缩小是一下就是 最邻近插值法 双线性插值法 三次卷积插值法,英语表示就是  'nearest'    'bilinear'    'bicubic'。
1 G' u. B7 `: z1 H        不同的插值方法得到的旋转图像有细微的差别 如果你不选在 matlab默认的是最邻近插值法 那么图像会有一定的失真,这个失真主要是因为matlab在计算每个点的新坐标的时候得到的数值不是整数,要去整所造成的最后说说bbox   这个的意义主要分为2种,也就是说我们在这一项有2个选择 一个是‘loose’ 另外一个是‘crop’0 l' p0 z' A1 W7 t/ U  d. D2 D6 v
        loose  就是宽松的意思 顾名思义就是说 图像旋转后 系统会给予一个宽松的环境去匹配它,这样你得到的图片就是一个完整的图片 ! I! X) @& e/ T

" S; w, h! G/ u3 N1 H0 ^# O        matlab的解释是 When BBOX is 'loose', B; ?& Q. G5 H& R0 ^( T

& V. {+ Z: t+ `  `: q+ L% P1 ?" b        includes the whole rotated image, which generally is larger than A.$ ?2 s% y# G  C1 T6 z/ u
        crop 就是剪切啦,也就是困扰了大家很久的问题,为什么旋转后图像变小了,因为matlab默认的是crop  超过图片原来大小的部分被crop了
! z4 {+ ]6 P- a4 O7 D0 E* t4 P5 c6 h  r4 ~* y. W) R0 i
  • >> 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'));9 l; [% N. G2 \
6 `4 j5 x+ r. C* K9 K8 z/ a

2 N: }7 `+ {/ I/ d3. 亮度变换与空间滤波:
  N' x: z; x# T  m4 }3 N1. 亮度# ]8 R" W3 r/ e: _: \5 Z- j
    imadjust函数+ X/ w0 \  h( P4 h: u5 Z
    A=imread('1.jpg');0 P% g9 S4 q- C' n. i
    B= imadjust(A, [], [], 0.75); // gamma<1 变亮( p" `. j0 M7 ?  b9 z( \8 l
    imshow(B)2 w5 R5 a9 \, |7 b6 ?$ d5 v
7 G* X- A1 a8 E4 Q4 N& [7 A" u; b7 T
    C=imadjust(A, [0 1], [1 0]);
0 \% m3 Y! S' {( p    效果等价于C=imcomplement(A) 都是求图像的负片
9 r' }# ~: _5 _- H2. 对比度拉伸函数
# [8 y. `3 i$ h     g = 1./(1+(m./(f+eps)).^E) // 加eps是为了防止溢出5 S' x- l9 W0 @4 w. _4 I
3. 直方图
' l" j9 L# l4 M$ Z1 c/ H$ i+ X    imhist函数:! l# Z& ~+ Z# |6 @+ Q$ W
    h = imhist(f, b) //b是灰度级个数 默认是256
5 a, V) R4 b4 @/ h; b9 \6 d& X- \' d    numel(f) //得到像素点个数" \7 C4 H) n! g- C
    B=rgb2gray(A); subplot(121), imshow(B); subplot(122), imhist(B);
" [( k+ d7 ]  Q    直方图均衡化:
8 `/ }, g2 Y; }( j$ y    histeq函数:
# y6 |2 u; T& v: ~+ Y    J=histeq(I)
" p! h5 I( m6 ^1 @8 H5 G) B+ }( @, A. Y' `: [+ L! E: G
9 l3 D2 \3 z7 h8 B* Z
实例:
# I+ j$ Y3 U$ @
  • >> A=imread('test.jpg');
  • >> B=rgb2gray(A);
  • >> imhist(B);//显示直方图
  • >> figure;
  • >> imhist(histeq(B)) //显示均衡化后的直方图
  • >> C=histeq(B);
  • >> imwrite(C, 'xxx.jpg');
    6 N9 E, g( p4 h" f
/ i2 v  h$ e2 k

8 v1 g" z6 O0 N; u2 G图像如下所示:% h& q0 i( h: t9 c3 _: M
, w) k; f9 G$ G6 C
# J3 _' Z& T5 _; g9 q+ p

1 n& U- k) ^. M9 |6 L4 _, |
. M. B  @  I+ D: t5 D' r) }7 z8 h) E* t' U: r) K
0 |* m2 J* P7 V% }
4. 空间滤波:' Q3 Y9 I% Y; X- W) K

& P) k9 v8 a* e7 I* [1 a$ w    线性空间滤波:imfilter函数
- H) M7 X& ^+ j( b    g=imfilter(f,w,filtering_mode, boundary_options, size_options);
  I8 h4 z% n: Z7 s5 u; S    //filtering_mode=corr/conv size_options=same/full
, H/ G( Z# l, T3 }$ X    通用语法为 g = imfilter(f, w, 'replicate');6 f' b9 p+ E5 C6 A6 L; I
    非线性滤波:colfilt函数  H, K: A/ {6 }( F- f( t
$ B" c2 T/ _  F( M- [3 I
    IPT中的线性滤波器:/ n- |% \( R/ r& }# P4 i# _
      fspecial函数用来生成滤波掩膜w$ b  X1 y" E+ M4 N
      w = fspecial('type', pARM) //type表示滤波器类型9 ?) j. D1 I! Q! r; Z
      type值可以是:average disk gaussian laplacian log motion prewitt sobel unsharp$ U, p9 U$ t9 ~+ y

0 e, h9 i6 C% h实例:
% t% [5 {1 }9 \4 t  M! {; ?8 F使用拉普拉斯算子来增强图像,包括锐化,同时应该保留其灰度色调8 v# z* j. |$ ~
! z: O9 ?0 [0 H) w
test_shape.m
# W4 E4 c' N$ Q0 Z
  • 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');
    : F8 M! O* M$ u% I. b
& \  c! [: O$ b6 E) U$ ?) |' @
上面使用拉普拉斯算子产生的w=[0 1 0; 1 -4 1; 0 1 0]; 中心为-4,现在我们手工指定中心为-8的情况如下:
6 a3 Z: d) D8 x* x5 ?
  • 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');
    9 [) i: S7 A. N& S! c# Z
+ T; \1 _! X- s; D# b

0 Q- U( V. J4 ]5 g; w5 A  g会发现图像锐化效果更好,图像更清晰。3 [  r; d& z6 e$ L5 Y" u
# Z. z1 O: T. O: g1 ?4 w' D0 f6 \
    IPT中的非线性滤波器:
+ ^$ Z3 x& O- r# K6 {    ordfilt2函数  g = ordfilt2(f, order, domain)/ c4 L* R- G$ s3 j* J
    中值滤波medfilt28 @. T$ e% W+ L! W3 v( ?3 s
    图像中加入噪声:格式:J = imnoise(I, type, parm)
; m; b7 k# c  Q; Z) S( T2 P6 U4 T- A
    >> A=imread('test.jpg');
7 W5 S9 F9 x" e% A8 B# M1 d& }    >> B = imnoise(A, 'salt & pepper', 0.02);
3 m) C; w8 Y# X  y3 Q: b/ v( `    >> C=rgb2gray(B);; \5 m9 P/ X4 r7 Y0 E! V+ `
    >> D=medfilt2(C, [3 3]);//中值滤波5 \9 S5 }' C! w0 n
    >> imwrite(D, 'xxx.jpg')+ J$ M+ N1 H& @6 `
" X) r4 d" v- ~0 V9 m

4 W# Q* x0 V+ ?  D2 C' J" d4. 彩色图像处理- V4 o2 w3 ~6 d9 S! r) H2 |
>> A = imread("test.jpg");* r6 B8 }. A( V% y  Y+ p8 ^
%获取图像R、G、B每个分量
; }# A% S/ t, V/ S( ~8 }>> R = A(:,:,1);3 f  m" D* S- R& k( ~
>> G = A(:,:,2);
8 D/ |. ~8 ?9 D6 b: m4 T" `>> B = A(:,:,3);
+ {) T  d0 W! w6 ]5 C" J>> D = cat(3, R, G, B); //cat组合成图像
" F, u! g# ~9 H" E0 o2 m! a( ^+ m! {7 U
  • 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);, g  O  F; ^) C* X* L
) {" o' J/ M' r4 U1 n

& i2 v5 Q& E1 S4 ~
  c0 ~; L2 ]- q- f1 V/ y$ \; K. m" Y# l/ S* e* _- [# t8 q: c

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-31 19:05 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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