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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
' e9 _6 R% ~* E, o
由于工作需要,开始研究一下MATLAB图像处理相关的知识,图像处理只是matlab应用领域中小小的一部分而已。以前只是听说过MATLAB很强大,但没有系统的学过,如今开始学时,发现matlab确实很不错、很高大上。操作起来很方便,特别是编写程序时,比C语言更简洁。3 w2 }; ]) \2 |. g
- m* ^9 q. A! f/ X8 e' r
很多人都是大学里就学过matlab的,由于是半路出家,所以知识不是很全面,直接拿了一本冈萨雷斯的MATLAB版的书就开始看,下面做一些简单的小记录。8 z' z/ M* W6 O* P: K! {4 l7 |

. d) b3 c" X: X" X+ K0 v3 V/ D4 A1. matlab命令基础:1 h1 L2 i9 N% S/ I2 L( c% c
基础命令:! {9 c* M% y# i, z0 H6 x( @, o

! C3 n: w5 l& F4 f9 q; Nclc——清除窗口
- K. S: g# P$ f  b0 m+ T6 t) Kclear——清除之前赋值过的变量; ?  Y; U6 K: D) m8 V! D6 a
disp——打印信息,相当于echo2 M( @* c! `5 X
celldisp——打印元胞数组内容
# J6 L7 `! d( p9 l5 ?% s0 d3 Uwho——简单的显示当前已有变量* S" N  i2 S' d' @( M* o  f
whos——显示所有变量及详细内容 whos也可以指定显示某个变量. x1 ~7 ^" Z8 T. ]8 l; {- N4 h
tan/sin/cos/log ——各种数学运算
' \- ^9 i0 V- s3 z3 `5 H...——用来续行
" L  h) b+ S' v2 P% r" s- D定义数组——x=1:100% u* z# J; c0 s/ Y
定义矩阵——A=[1,1,2] A=[1 2 2]; 加分号表示不显示命令执行结果 定义空矩阵B=[]3 |3 [1 h- |5 h1 \/ @
矩阵转置——A=[1 3 5 7]  B=A' 或 B=A.'可以把行向量转换为列向量, I7 i- A0 R, M5 Q8 T9 V3 ]
取元素——A(1)取A中第一个元素  A(1:5)取A中第一到五的元素 1 v- s/ E+ e1 h- T. A3 ^) P0 K
                  A(1:end)取第1到最后的元素,产生一个行向量; A(:)产生一个列向量$ i' Z- W1 E) t6 O: W, f  k
                 A(1:2:end)表示步长为2 步长也可以为负值 如A(end:-2:1)
! _2 D1 Z8 ?- D- m. M4 F( e7 Klinspace——x=linspace(a,b,n)产生含有n个元素的行向量x n个元素线性隔开 并包含a和b: f1 D) P& ~9 \; y, d5 h
:的活用——A=[1 2 3; 4 5 6; 7 8 9] A(:,3)取整个第三列  A(1:2, 1:3) 取两行三列
8 i. Z3 d, D9 `$ s9 {2 ]" R+$ v! q: n* H& w' T# Y
-
- ^7 D/ A+ e# K$ t*——* 表示矩阵与矩阵相乘,满足线性代数上学的矩阵与矩阵的乘法,
* x( C- o5 V7 b) C8 [5 d' ?   .*表示矩阵中元素与元素相乘,这两个矩阵的维数必需相同。/和./也一样的道理5 l' C" W! w7 T: V/ o4 C

" m8 f* c6 t1 C" s! K2 ^8 S8 ]' d* C/ z1 }+ V
length/size/numel的用法:% ~( J& i. r  S5 }
; F: Z& U3 w3 q' n& Q8 e) a
length(x) ——返回x的长度 如果x是单个变量 返回1 如果x是矩阵 返回该矩阵行数与列数中的较大者。
- K5 ]$ k& F' m& r& Z( X6 l& L5 ]0 T) C
size(x)      ——当x是单个变量时,返回[1 1] 当x是矩阵是 返回矩阵的行数与列数 可以这样来接受[m n]=size(x)  W' B0 C( w4 V9 \' k2 `
3 v2 m2 D5 ?- _
numel(x)  ——当x是单个变量时 返回1, 当x是矩阵时,返回矩阵元素总个数。
( Z/ H- [: j4 `* U, N! r2 I
) D) ]* i' m. s0 M: @" v/
4 I' H, j( N( P# I- {% o% q$ R; g, S7 _) L; e* Q
format compact——以紧凑方式显示% u2 h9 q. e! R9 `3 }  ?
format loose  ——以松散方式显示) c! l  c( S) x. m/ c+ V

, z5 H, X5 ^9 i' emean函数:* N. J" f7 K' }# H
9 E5 q! {, {, x
    >>如果有这样一个矩阵:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];) F+ S! P7 K' R4 |# i7 c$ h) o7 a# j* f
         用mean(A)(默认dim=1)就会求每一列的均值" ~, |4 U5 S4 P. l  v. l
         ans =; v( F: [+ }8 O
             3.0000    4.5000    6.00006 n3 T) [: w( x& |6 d
2 R- o- D; B) W1 |5 V8 n
    >>用mean(A,2)就会求每一行的均值
/ e) P8 [* }6 e; e& A    ans =2 g8 p% @9 ?6 y8 X" a  l/ T5 w' U
        2.0000: F6 i6 v( x  h6 n; @+ G8 C$ `: a$ T& y
        4.0000
5 \* _2 B5 ]: K        6.0000' g. B, I+ T3 r% P6 f
        6.0000
( Q1 b+ r5 {: Z$ s5 Z8 I7 l0 d( O2 G0 v$ v1 k
   >> mean(A(:)) 求总的平均值& X6 {& h1 B# q+ Y1 |* N; Q: D
) Z* w$ O8 Y' N/ t0 q

4 ^+ V1 Y2 K; o; d/ Y其他函数:
5 F4 R8 N4 u3 @4 X4 o! i$ Q9 t3 x4 @2 `0 n; a! b7 o
zeros(M,N)——生成一个M*N的double型矩阵 元素均为0
% Y) P3 `  ~5 o! I* L- @( Q4 Iones(M,N)——生成一个M*N的double型矩阵 元素均为1( ^( B! k8 ~; u$ L& ^
true(M,N)——生成一个M*N型的logical矩阵,元素均为18 i( y" o; `. J9 X
false(M,N)——与上面的true相反: I0 w9 P4 }" W9 n$ ~, W; Y% T: S
magic(M,N)——生成一个魔术幻阵8 o5 X0 t9 ~) O( I; |+ q
rand(M,N)——生成一个M*N的矩阵 元素大小在[0-1中均匀分布]
! o$ J2 e3 q& `. U5 ^. b  prandn(M,N)——生成一个M*N的矩阵 矩阵元素正态分布 随机数均值是0 方差是1.
/ B% O: k1 j( Tplot(X,Y)——画二维图像0 r- Q# P1 p  [
subplot(m,n,p)——m代表生成图像的行数,n是列数,p代表子图编号* L" B3 q" b+ w" U8 `
plot3(X,Y,Z)——画三维图
; n0 i- _) y1 x# L; z0 _, F* d2 q5 Rmesh(X,Y,Z)——画三维图
- @; `' o+ t% D- _) v) ]! c/ F1 WsuRF(X,Y,Z)——画三维图,并上色6 F% D+ k' |1 g: o8 e" S, }& N1 q
/ J- K+ H9 u. V4 w( Z3 s
matlab函数设计:
$ u& W! ?, c2 c: q$ ?- [4 j, ~# L7 v& ]9 W8 ]+ D6 p
.m文件建立的函数文件5 F) J1 H+ S- k! c% \. w  }
function [A, B] = fun(A, B) //输入A、B两个变量,返回A、B两个变量 一般.m文件名命名为函数名字
% D- H5 j! |$ _3 S2 W) N+ w% xxxxxx 代表注释,在命令窗口中输入help fun可以显示这个注释  G3 g4 R" c% B* }/ ^/ E
6 P. ?% m; `9 }3 n/ p* ~9 L$ C
+ @' }+ F( }8 d: {
实例:$ v2 J7 J# _. R5 _' j4 ]( u
  • 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
    ) ~* Y: C! a+ ?/ }9 i
: [) Y% ~  i6 M+ w" v) R$ M$ v9 Z
调用时写tow(10),就可以计算1~10的和。( m8 a. t7 L# v
' [+ B2 [# g9 N

, X5 ]! r3 S+ \6 Y9 \! H" d1 F匿名函数:8 d- I1 H. |; q

! j5 R+ {& g/ ]var = @(x)(x+1)
4 w% \. `2 \! f+ w# ~调用时形如var(1)即可,@后面跟参数列表$ Y- z0 ~  u6 E  f( k$ L% D  z4 {

9 O( o% w. s' Z! n) ?; ~1 K" `2 I接受用户输入信息:
' S$ A2 V( y) e4 y3 }/ N7 Pt = input('Enter you data:', 's');0 J2 L% K/ F% Z+ h
t='12.6, x2y, z';
! C6 A+ A) a. ~9 V! @+ O9 _, \& ][a,b,c] = strread(t, '%f%q%q', 'delimiter', ',') //按指定的格式读入a b c
) r0 @% \9 g  R5 X4 M. G( v4 p6 x0 S
, @. |  x3 L( P; x2 qmatlab中,图像大致分为二值图像(0/1)、灰度图像(0-255灰度级)、RGB图像(R、G、B三个分量 三个分量都相同时,所表示的颜色就退化为灰度)、索引图像。
" I  i  B- M! {. @      灰度、亮度、强度通常是同一个概念。
2 Z- T/ ^8 V, B8 \- J      所有图像按照特性分为位图和矢量图,位图常见格式:JPG GIF BMP矢量图:PNG! h+ g( Z9 B2 z; w4 f& k4 C
      机器视觉又称计算机视觉,试图开发出一种模拟人眼的能力,能够理解自然景物与环境的系统,比较高级哦。! w6 c; \7 G. h8 u' r; H" P9 b
( h0 D* J/ A  p  a4 D
nargin将返回输入到函数的参数个数、nargout用于函数的输出
1 d0 m% R7 U. Z  Inargchk用于检查参数数目是否正确margchk(low, high, number),使用实例:, n' c' q) g9 \
function G = test(X, Y)
8 u* j: G* E+ ?+ Xerror(nargchk(1,2,nargin));
* _5 z# a8 h* U) P! V
3 w8 _9 n. Y$ p! X& k; u+ R$ J( X) O) S, U* B
2. 图像处理基础:0 n5 @5 ~/ b: k" P. X. L2 k4 J' ]
imread——读入图像A=imread('1.jpg'). |( n2 L& W$ i: d
imshow——显示图像imshow(A, B);  imshow(A, [low high]);
7 |1 e) M5 P: O% @5 D5 o% A3 Y" l- Q                    会将所有小于或等于low的值显示为黑色,大于或等于high的值显示为白色9 j& g6 `5 i" {+ T
                    若B省略,默认的灰度级是256,imshow(A, [])  []表示将low设为A的最小值 将high设为A的最大值7 [9 m1 p  Y  w8 a1 P& B
                    显示多幅图像:imshow(A), figure,imshow(B)
* `$ w: |- c" |4 r  Gimwrite——保存图像 imwrite(A, '2.jpg')
! R  c( t$ ~9 l0 x' C2 F                     imwrite(A, '2.jpg', 'quality', q) // q在0-100之间(由于JPFG压缩 q越小图像退化越严重)
, {9 w+ j* Q/ Z9 f* M5 msize(A)——显示图像的大小) l- ]8 z* U- j: C+ M
imfinfo——显示图像的详细信息 imfinfo 1.jpg 也可以K=imfinfo('1.jpg') 就可以使用K.Height K.Width等等信息
' a3 e. ?. C; o3 {6 c9 N3 O& ?                    学会计算图像的压缩比:imgBytes=(K.Height*K.Width*K.BitDepth/8) compress_bytes=K.FileSize
- c) a& L: b9 w8 A- N  }, ?9 j                    imgBytes / compress_bytes ==压缩比, B& H9 x' {8 l7 C* K9 G5 d, _! R
! t3 P3 _, E2 u% H9 q' w
                    命令窗口输入:imfinfo test.jpg,显示信息如下:                    ' i% c  V3 R7 H

4 L; F5 F8 u1 i$ B6 h7 K7 x
  • 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: {}* ~$ v& K& Q  t& u! v; K

1 j6 p( }8 I6 l
. d" A5 ?) n- [5 V1 W+ s* y3 bdouble/im2double/mat2gray的区别:
' z' X. c2 B  ~- T4 p; u7 S
* I" p  P* q( S) d/ T: j        A=imread('1.jpg');% s( n( W& |, D; v$ P6 A4 |
% M, n/ l% J- Y1 K% k
        A(1,1,:)          ——显示A中第1行第一列像素点(包含红、绿、蓝)三个分量的值0 P" t4 `3 ~  m1 D3 m8 Z1 q
   
! e1 \3 S: D# P        B=double(A)——转换为double类型 值不会变 注意 使用im2double值会[0-1]
! u+ s. _7 [4 E+ b8 I1 }5 T0 s+ M        im2double   ——若输入是uint8类型 每个值会除以255.
  x8 n4 v& p* e7 t* q2 A        mat2gray()   ——可以将double类型转换为归一化的double类型
5 L- T' k0 E' J% K" y4 y        区别:1 i: k' H- c5 D! _' g5 d- e/ E
        im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;如果输入类型是double,输出没有处理;
) A3 w' V7 \& |7 [' E" r7 S+ s
. Q8 Z5 I8 ~6 A1 C* [% [* }- P        double:返回数值与输入相同的double类型矩阵;# x! d4 R' f& i8 H/ f! `- M0 g
) z0 y, b+ W$ G0 L& {3 n
        mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。7 X1 ~/ U1 e' {: ?) I0 Q2 f% G
        在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据。7 V# j; j' O; p* @
0 J6 B) z& g$ _( {/ ]- i
注意:uint8类、uint16类RGB图像取值范围分别是[0, 255]、[0, 65535],而double类范围是[0, 1]
! ~) R) M# A: Q- q2 M+ s2 l. M; u
C=[-1,0.5; 2,3]
5 z# d2 B4 s" h- eB=im2uint8(C)——im2uint8把所有大于1的值转换为255 小于0 的值转为0 其他值乘以255
# m; {+ M7 b; e: K, L# uim2bw          ——得到二值图像 可以先A=mat2gray(B), im2bw(A, 0.5)2 S- Q3 P" Q% u5 l; P; t

+ R+ C; \/ n6 G; S0 C5 {
3 f6 ?8 d  W* t# Z3 K( zIPT支持的图像的算术函数:3 v4 d3 Z1 z9 d: S- N' o$ V% P6 n
imadd——图像相加
- ^1 y1 E& h0 H) bimsubtract——图像相减; J6 t0 U+ p# a+ W; H
immultiply——图像相乘5 P1 F: w/ t* N- h) l
imdivide          ——图像相除
" S/ c  Q, H( eimabsdiff——计算两幅图像之间的绝对差* N. o# ?+ y% f0 {7 S8 X0 g
imcomplement——对图像求补
6 \& [' s( B7 }" c& Rimlincomb——计算两幅或多幅图像的线性组合  [/ u) Q8 V* n- `3 V4 Q" d, ]

* h& T4 B# \8 V图像旋转函数:' \2 i' e& ~4 q) a9 H* B
9 f2 h( {. `$ p! H; i% Y1 [
imrotate,matlab默认是逆时针旋转, imrotate参数解释:$ q$ D# b* D  g' u1 N2 Z
6 J. s" H. Z7 ~
        angle顾名思义 就是你旋转的角度, method 就是你实现旋转用的是什么方法,有三种  和后面的插值放大缩小是一下就是 最邻近插值法 双线性插值法 三次卷积插值法,英语表示就是  'nearest'    'bilinear'    'bicubic'。" q) }/ r, n0 T% {+ d4 n
        不同的插值方法得到的旋转图像有细微的差别 如果你不选在 matlab默认的是最邻近插值法 那么图像会有一定的失真,这个失真主要是因为matlab在计算每个点的新坐标的时候得到的数值不是整数,要去整所造成的最后说说bbox   这个的意义主要分为2种,也就是说我们在这一项有2个选择 一个是‘loose’ 另外一个是‘crop’
/ L! ]# O9 t1 A  @  c        loose  就是宽松的意思 顾名思义就是说 图像旋转后 系统会给予一个宽松的环境去匹配它,这样你得到的图片就是一个完整的图片 $ B% E+ L# Y; |
& N/ E$ w4 f" L# s+ H9 s3 }
        matlab的解释是 When BBOX is 'loose', B# {$ R4 K! @# G/ G* D

% G5 h/ K9 ]9 Q+ Z* ^9 }        includes the whole rotated image, which generally is larger than A.
& c0 b, Q# y7 E0 t- ], k  u+ e        crop 就是剪切啦,也就是困扰了大家很久的问题,为什么旋转后图像变小了,因为matlab默认的是crop  超过图片原来大小的部分被crop了4 s3 h9 [# G) L# x
( T8 K/ ~5 n5 ]5 _5 Z& o) R
  • >> 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'));  Z2 E% _: ]5 f* Q# _
) E, {3 e3 o! d

; o, X8 \! N. u8 s# f0 g" I& P3. 亮度变换与空间滤波:- \. \9 ~( `" n) P
1. 亮度
7 a8 S5 f$ e4 k- f4 s    imadjust函数7 R9 t; ~0 _7 I! I& d. g2 u
    A=imread('1.jpg');% H. q3 E  r4 g, z6 R
    B= imadjust(A, [], [], 0.75); // gamma<1 变亮7 f( h% Y3 u/ Y' g
    imshow(B)6 s: C' W5 ?: y2 m
) V" h0 m& q) ^# E0 ?% @: G
    C=imadjust(A, [0 1], [1 0]);5 O+ a0 J9 ^/ \& J2 t
    效果等价于C=imcomplement(A) 都是求图像的负片 ) H5 U, G1 Z; G& C
2. 对比度拉伸函数
" J/ p( ]# i# v' n2 [     g = 1./(1+(m./(f+eps)).^E) // 加eps是为了防止溢出
, J8 p+ G  v) G1 u( N# Y3. 直方图# a9 K# L. y! _. }* f, b
    imhist函数:& j: e# ~" \8 S* d2 T* A
    h = imhist(f, b) //b是灰度级个数 默认是256' ~1 l- ?0 c) |  d1 t( v, Z9 R
    numel(f) //得到像素点个数9 Z8 z2 \! a" m$ A5 o( f
    B=rgb2gray(A); subplot(121), imshow(B); subplot(122), imhist(B);* X, s5 V4 S+ X  W
    直方图均衡化:1 q2 k/ ]9 [1 t0 E! @. i' b
    histeq函数:* J* Z  \2 W/ h( Q2 d3 ?3 ~
    J=histeq(I)  F+ e- l$ a, a3 `& w0 v
7 m8 t3 ^$ X) B6 N6 T1 L
& h0 E% u6 g" w6 o
实例:8 B1 q9 H5 a: S  e( f
  • >> A=imread('test.jpg');
  • >> B=rgb2gray(A);
  • >> imhist(B);//显示直方图
  • >> figure;
  • >> imhist(histeq(B)) //显示均衡化后的直方图
  • >> C=histeq(B);
  • >> imwrite(C, 'xxx.jpg');3 }/ b# [8 n2 L3 u1 w  W% V5 i% ]$ @
6 J. Z5 t4 A7 h4 S. \  c# ?, N

* J& o. }- i% r5 {9 w" K图像如下所示:
4 i8 x8 h# q2 o; F1 O
) s; F( M5 t! U, b+ |4 b, M9 N / K3 U$ ^3 ]- {7 l
7 I4 x$ I' i* M- Y6 W

* ], W- {) Y( v3 M
# N) `5 w* K2 v' K3 t8 \
  s( l- z( {4 G# p0 {4. 空间滤波:
& `( W0 \0 m& {
9 `) G$ I3 \% g* s5 h6 R/ ^    线性空间滤波:imfilter函数
4 S) w3 s" z- [) `8 b0 k, {    g=imfilter(f,w,filtering_mode, boundary_options, size_options); " r# |, G: {0 T
    //filtering_mode=corr/conv size_options=same/full: s3 ~# D5 f* D1 O6 a' g. u; ]9 ~
    通用语法为 g = imfilter(f, w, 'replicate');5 G5 T9 m8 r7 v; x8 c$ r
    非线性滤波:colfilt函数
# V2 l* ~! `% d4 s, g
- e3 Y# A  q+ j2 D2 c3 N3 T2 v& J    IPT中的线性滤波器:. A- A1 r7 \: c- n* b0 w/ X
      fspecial函数用来生成滤波掩膜w
3 }/ _" q- t: ~& k% ]6 i      w = fspecial('type', pARM) //type表示滤波器类型
- N' @0 @# ~  [0 N4 v+ Q' S      type值可以是:average disk gaussian laplacian log motion prewitt sobel unsharp
. l5 z9 @+ [% S* h4 F1 k' y( z
9 o3 ?3 B* [3 Y* h$ g9 C' A* \实例:- G' J5 V5 j  g/ q2 m
使用拉普拉斯算子来增强图像,包括锐化,同时应该保留其灰度色调+ _4 s/ x3 H' E& {. e
" G! w5 J$ M; g* L
test_shape.m
8 }! l9 C% H# b. C
  • 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');
    , s$ B" X6 b( Q8 }6 X
' D3 N- L9 H- t' [6 D7 S7 {  H/ q
上面使用拉普拉斯算子产生的w=[0 1 0; 1 -4 1; 0 1 0]; 中心为-4,现在我们手工指定中心为-8的情况如下:
* ~: `; @& M4 I; b+ [
  • 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');
    & Q8 {( M8 x2 R: |$ N

- g! v( i/ K* i% ]6 q# U' ]; f' Y6 @* a5 M( N% Q" J$ A
会发现图像锐化效果更好,图像更清晰。
- B- `) g+ V- Y, K
7 V% e( R# w+ w  T1 y    IPT中的非线性滤波器:* H# e" Z1 c" Y' A
    ordfilt2函数  g = ordfilt2(f, order, domain)( E' q' H4 ?5 O$ ]! k
    中值滤波medfilt2( k; ?% S/ S- i) ~0 {
    图像中加入噪声:格式:J = imnoise(I, type, parm)
) }7 q: m0 i) h, O8 I  @# b
6 T% b, e4 l9 O2 E0 @" h- m7 |    >> A=imread('test.jpg');- |6 Q  d) K0 K. x( a5 ]/ l
    >> B = imnoise(A, 'salt & pepper', 0.02);
9 v4 Z; V7 r! e2 u$ D    >> C=rgb2gray(B);* p. M# j5 l/ r
    >> D=medfilt2(C, [3 3]);//中值滤波
* g& j* {  d7 N1 L$ x    >> imwrite(D, 'xxx.jpg')6 T  f. ~3 `* B8 A/ {9 H) x

6 U# Y5 K6 f- ^; O/ B, q5 T, y  X% @# u5 s& j" C! P1 a
4. 彩色图像处理" @- A1 n1 ^: D$ F6 q
>> A = imread("test.jpg");5 [% \/ b* G8 q- o4 N5 _
%获取图像R、G、B每个分量
1 |; n" P. z1 @; }9 `>> R = A(:,:,1);& J& U6 C  d# g  z$ \# Z
>> G = A(:,:,2);, X- A# O: z; y2 l9 y4 g/ A: a3 t
>> B = A(:,:,3);) X8 a, M% l/ x$ Y$ ?5 U  l; V3 n( Y
>> D = cat(3, R, G, B); //cat组合成图像3 m0 I) d/ k' Y) r& m7 @; W3 S0 {: u! @

0 t4 X& D$ ^, e/ b
  • 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);- u+ q" B3 Z5 b- ^' d" I
, O+ H  n8 E8 g4 i1 M
- n# C$ L* _6 K4 F# c& ]0 h0 |
$ z3 ~/ P8 e; G, l
) ]6 L) {: [) ~# _" T  u& z. i

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 18:22 , Processed in 0.187500 second(s), 27 queries , Gzip On.

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

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

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