| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
3 O$ M" U5 Y' H8 V! F: u  Q# [ 
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。+ z* R! Q2 V" S# j  G/ B* G 
+ G8 P1 F$ E" [) w' _6 A' l& z* t# x 
原图像 
) L0 s3 f5 d- [: w1 ?5 U. l- H: u& e# N% x, c5 g 
 
' f6 e5 d  M% Q5 ?$ N3 k 
5 {- i- a; @' ^9 D) u( l+ l( k 
Matlab提取RGB颜色分量:. M" Q0 g% b- r% k9 K/ [9 c% P 
) w& U: W  @; B# a* Z 
我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。 
( ~, D; W! w+ Y 
. L& Y7 n" O' ^1 K8 w: \* S* E例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’); 
- |, r6 U7 r# C( W$ ~ 
0 H. E# b1 f2 ^; h0 N在工作区中可以看到其数值。 
5 \4 ^4 D' r, ?# C% T3 e: Q& Q) [; W 
 
7 L' e4 s2 ^3 U 
 
8 S% ?! Q' a. x$ d1 ?' W. F. sPR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量: ~2 S2 R* N- }/ I6 e) q3 w 
5 n8 r" T2 ]4 P7 E 
运行代码:; f4 C8 Q1 P, P+ Z# | 
5 W6 H- \/ O- I2 W: x: [8 l0 V) V 
- 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('提取蓝色分量后');
 - 3 p% A/ F$ @; _6 B! M3 s0 B
 
     
: C1 ?. \) c, F& l$ p 
* E# Y* {% G6 L运行的效果图: 
0 B4 V& K- ^7 ?4 Z6 E6 T 
1 d; ~9 D, f) r9 r
 
. }( ]8 u9 w' T4 c2 ?7 H 
 
' m3 W4 F7 J7 U# t5 lRGB阈值分割5 ~0 ^, t/ w; _ 
( G+ ^; p" Z$ q* J  M& |1 P; z 
上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。& ^0 }, p2 R% S 
4 u. j' y* A* Z$ F/ U! L* A: L 
 
! I7 G) p6 H2 P4 e7 _8 N 
 
$ J9 N* w9 T/ _. U3 ~9 u因此,我们使用图像的阈值分割。 
. ^5 n$ ?4 Q0 H1 Z. M8 `1 n& T$ {; `9 w% g* c" [1 G. K 
阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。2 ^1 B7 \# q6 {' `- J4 C 
6 N$ v2 h, k# R$ c9 b; |4 z, M 
源自参考文档: 
8 T$ w5 F9 p: @# A3 Z图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。0 n. {( K* D) P! G% a4 \ 
- i; H( a7 Q0 C5 E 
基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。9 ^2 r8 E3 S6 ?, x; f 
 
6 x9 J; T6 F# Q  M常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。  ^+ G# d* P: D- T/ [: M0 }2 K 
 
& b- q, x# ?8 d+ A, y6 |- _实现代码: 
+ Q6 v( u- J4 u4 p( X- [9 ]3 c* B0 I; p6 ~' F) M 
- 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('提取蓝色分量后');
  
  ^. p9 \' E  k9 V            
% g9 a2 b( [7 s) F( N  n$ M& H1 [ 
/ I& Z/ J7 O( v- Z* X6 e3 R2 X2 s运行结果图:0 Q, N! u# @! a 
 
8 c2 S) N7 q, ]
 
: `! y6 W4 p; L0 N. P3 U# u; H 
 
5 k: q: M5 o- @4 a" H7 c图像中去除某一个区域. Y/ V+ O/ C  ~+ W% F8 Z 
/ c4 ]7 m3 Q6 r, @+ p6 p 
比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。) 
4 A' K7 ^$ e/ C1 o4 i 
4 _) K7 o. G1 _6 ^" z0 ~
 
 
  k& G* Z& B5 A 
4 I& ?( z1 L/ Y( k$ `$ w解决方法: 
  F+ }/ B% O0 }3 r7 n 
" R4 E& b' ]2 v4 l这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。 
0 ^) M  T' Z8 ]: ]6 d5 A& l' m: d 
8 \# R4 b8 Q. D# v+ Z4 I代码实现: 
# x2 g5 m- L. Z$ j) [, J9 Y( a0 T( z) E) w- E# s. P6 C 
- copy_image = I;
 - r = 50:100;%要赋值的行坐标
 - c = 20:300;%要赋值的列坐标
 - copy_image(r,c,1:3) = 255;
 - figure;
 - imshow(copy_image);
  
& Q, W, [; B8 w0 H; U   8 r* c: G: n( j8 J3 { 
 
; i6 K" z+ E- T+ o运行结果:( _6 k( N& f, s  V4 _ 
 
8 E- H. v) _" f' x
 
 
9 B0 P1 ]1 j) J5 E4 u4 o* ~& Q) d' Y; ^' w3 U2 R! W- F 
在将其进行图像分割,即可将原来的矩形去除: 
# F! K" R+ v5 ], O 
( g* {1 G4 j' p( A, _参考文档: 
1 Z6 v* e3 ^, Y' G 
1 X9 }" ?2 }. Y1 @' z2 I  J5 ]$ Z2 |RGB图像中特定颜色的提取; W3 n9 y  P% e' Q 
 
2 H( _1 `; I$ B: U3 v6 p& o; ^ |   
 
 
 
 |