|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
" ~: O# Z. Q' c+ N8 q
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。
1 X' o0 Z8 i, W- P) B) G* `8 H8 N' c" ~5 B1 W3 }6 |/ ?+ J
原图像
3 d( @; |( S9 T5 s7 R( w0 o/ I" D
6 B7 s R; H+ h: P
1 ^5 P* @+ z( C& b0 p; K/ `( v/ s& j8 G {: W8 f
Matlab提取RGB颜色分量:# Z% A1 p. J4 H/ y
0 Q+ M7 Q8 o* N我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。
7 c3 C* w3 \: |6 g/ O+ C' `
) ^( a! m! w% u6 y: D) t例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);. B1 G0 C# g3 d1 y" b4 E. g( d2 j
2 z* @& {* ~) U6 p
在工作区中可以看到其数值。% S) [4 X6 Q8 z
# \2 A1 E: K+ l' L) z/ z
% x. N l: Y& Z6 Y
2 |5 f; }. P& _6 R, F% j" D
PR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量
. \3 A; Y7 X% r1 c: Q9 m* i( R8 r1 B; b
运行代码:
" C7 P1 Y1 r$ K" I/ K5 }* e0 W. c7 M' C; w8 h: h! R; ^1 n# ~
- clc;
- close all;
- clear all;
- I=imread('test.bmp');%要求你.m文件下有test.bmp这个图像文件
- PR=I(:,:,1);%提取红色分量
- PG=I(:,:,2);%提取绿色分量
- PB=I(:,:,3);%提取蓝色分量
- figure;
- subplot(2,2,1);imshow(I);title('原图像');
- subplot(2,2,2);imshow(PR);title('提取红分量后');
- subplot(2,2,3);imshow(PG);title('提取绿色分量后');
- subplot(2,2,4);imshow(PB);title('提取蓝色分量后');
# Q) [' o7 V7 k1 C+ I4 s- \6 C, i , I _3 ~+ e. d2 C( ~
/ q, T7 ~6 z" T$ H6 M运行的效果图:
+ c8 R$ S9 b3 H$ e2 Z/ I5 y1 I) N4 @
- M! H, j$ k& G2 {2 t
: E8 T5 w$ H0 Q; b
RGB阈值分割
" P$ d% v5 K% _8 H) K n6 x* a& m) ]9 o! D; ~* D
上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。
4 e' w: x# t3 o" X) d/ d* u/ E' h" d' P9 m2 W
* S; E$ L9 x; b0 |4 \8 \5 |
' R/ Z0 [& q* W+ ^" }9 S因此,我们使用图像的阈值分割。" b# r4 ?- x) C; R5 M4 ?4 }
: W* ?0 M1 R6 j7 [4 P6 x# M阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。
2 q* o( n4 [# M6 ?' [# D
# }. u+ d% V. P7 _) @9 {5 R& K+ }源自参考文档:0 Y: t1 \, K9 F
图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。
" s8 ^. u+ @9 `) R9 U& L! g u0 F# Z- `1 F1 j- f/ S5 G
基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。1 T" I, @3 s, W) P- C5 E% P. B
6 v3 H. R8 \* L% O% C5 s$ J5 Y, v5 x
常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。- ?, ?. ~; }# _/ x. U& c
; }) t' z6 N: ^0 v5 E9 q实现代码:: K5 N6 m5 e# A7 ~
( P% q5 X; Y6 s
- clc;
- close all;
- clear all;
- I=imread('test.bmp');
- [m,n,d]=size(I);
- level=15;%设置阈值
- level2=70;%设置阈值
- for i=1:m
- for j=1:n
- if((I(i,j,1)-I(i,j,2)>level2)&&(I(i,j,1)-I(i,j,3)>level2))
- r(i,j,1)=I(i,j,1);
- r(i,j,2)=I(i,j,2);
- r(i,j,3)=I(i,j,3);
- else
- r(i,j,1)=255;
- r(i,j,2)=255;
- r(i,j,3)=255;
- end
- end
- end
- figure;
- subplot(2,2,1);imshow(I);title('原图像');
- subplot(2,2,2);imshow(r);title('提取红分量后');%显示提取红分量后的图
- %提取绿分量,不满足阈值的变为白色
- for i=1:m
- for j=1:n
- if((I(i,j,2)-I(i,j,1)>level)&&(I(i,j,2)-I(i,j,3)>level))
- g(i,j,1)=I(i,j,1);
- g(i,j,2)=I(i,j,2);
- g(i,j,3)=I(i,j,3);
- else
- g(i,j,1)=255;
- g(i,j,2)=255;
- g(i,j,3)=255;
- end
- end
- end
- subplot(2,2,3);imshow(g);title('提取绿分量后');
- %提取蓝色分量
- for i=1:m
- for j=1:n
- if((I(i,j,3)-I(i,j,1)>level)&&(I(i,j,3)-I(i,j,2)>level))
- b(i,j,1)=I(i,j,1);
- b(i,j,2)=I(i,j,2);
- b(i,j,3)=I(i,j,3);
- else
- b(i,j,1)=255;
- b(i,j,2)=255;
- b(i,j,3)=255;
- end
- end
- end
- subplot(2,2,4);imshow(b);title('提取蓝色分量后');
$ F6 a1 J. H5 s4 b2 I( o2 f
' J3 d' D" s# s% `( D6 Z |! X/ k( O8 s. Y5 M' H3 i; y1 j" Y
运行结果图:
% @" y5 B+ ~$ k, h6 ~: l
* l6 X" \3 p7 W4 V+ p
) O4 O' d9 O0 Y6 `# p" I: k( Z
, `: o4 B* m8 J1 O8 s. o) w图像中去除某一个区域2 ?. X% u d! N0 b. y9 C( V0 L
2 j6 u! {, n& j' b( ], x* j比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。): Z, I; G9 a' `' S) o* _
/ D" i v2 A* Q- s& Z; J* T: D
' x! ^1 B8 n/ p6 X- K! Z
" y) l) H" X' @; f4 ^& z解决方法:( j, w/ y1 V; ?& i8 { A
6 C: D- P2 n6 f( v' R
这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。6 G8 D# [! d/ m3 [/ W
6 l$ G$ z5 _- P, i0 F- d# U. A代码实现:
! [! h0 J7 J1 c3 u8 ?* g
3 O% ? k6 d0 x: x/ j- copy_image = I;
- r = 50:100;%要赋值的行坐标
- c = 20:300;%要赋值的列坐标
- copy_image(r,c,1:3) = 255;
- figure;
- imshow(copy_image);
- ! A& W9 f4 f4 ~2 \+ l" P( R8 I
8 U" A( h1 L2 s$ h8 I% d8 |9 h L, P2 [0 _
运行结果:4 G5 q9 r9 z/ T4 x: }. ?6 v7 \$ _; _1 X
5 \1 ]5 l2 V; f& H$ i
1 q. |5 W- e( l- d2 S% b
Y/ I( |5 x1 r/ T) v' J在将其进行图像分割,即可将原来的矩形去除:
1 A) m& }7 W; _5 x |' @) ~3 {4 `% \5 _; G6 q
参考文档:$ C" [ c% F% ^& D K2 c
4 Y8 I3 j9 s* s5 R! j$ I
RGB图像中特定颜色的提取1 V6 A- z# u( G& ?4 r( ^; ]0 e; H% M
$ Q; R8 r' n. d: }/ n9 f, v
|
|