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

怎样用Matlab提取图像的RGB分量与实现RGB的阈值分割

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-16 10:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
, l8 T7 r' L4 _& X5 A( K) k2 W- I3 Z
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。
8 a' G$ T2 z/ Z% b0 b, G& H
0 m6 C5 R8 P, B& l( s( w0 ]- S: z$ n原图像
+ ]4 B- F1 |& `6 a
2 E+ R. q+ l& k" O , ?9 c5 l0 R7 x9 t* M0 m
( W2 Q( o  w1 y* V2 P' N
Matlab提取RGB颜色分量:0 I0 V2 a5 r) `5 |' S. Y  X

% ]& |% a+ _  f% T* q# f' `# J6 E, o我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。
+ Z' o% E1 x" ~5 j0 V
- F- d4 P5 L) c0 ]  O% j例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);9 ?0 e  G  m5 Y2 V+ x
: x5 _* S* C' s- n
在工作区中可以看到其数值。! j  O4 W) K4 w4 r9 x: z& R
; t0 w6 f/ U0 \4 f$ N- m

$ [( A0 K: L* V+ F$ p! \9 N5 f  Q/ e" X* V! J0 _% H' v' y; n
PR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量
! E( v6 h/ f- |; N* _( @" s6 n2 M; ?! y7 q' v4 k
运行代码:/ L* F3 v3 B# \1 T

$ `5 t4 i4 P6 Y$ g! G
  • 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('提取蓝色分量后');
  • ' y/ G3 ]. A/ D: Y
  
2 L  v  }4 ~1 l# o, t- I' s2 A/ E( O* x; E% g5 f8 g8 F
运行的效果图:6 i  R3 v: [( W; K. a

5 {2 v( |. f' s* q- A : Y+ I4 ^1 @+ u+ s
0 p3 D% V) M! t' ^
RGB阈值分割" ]( l: {% e* G

1 k0 U( I7 q, E' T- E$ y: t上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。- A4 N$ s! G$ S) {
/ S- I8 I3 X, s% @/ Y- z

( R2 [! y9 P: m, w: c/ B3 a( V6 k1 m$ I! i3 x* s, y' O7 ]* E
因此,我们使用图像的阈值分割。# g; Z& _1 \) {$ w

0 G8 _2 ?& O4 ~, `, f/ V阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。+ m* R& f' L/ m8 L* r2 R# ~) D

- Q0 s' b$ \! b& }; Q* m源自参考文档:
0 R1 y: T! R" b) T图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。
5 D9 u! b3 C0 s) k" c
- ~3 `. x7 T, t, B- w! g基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。# Z/ l- k0 z& O& q$ P

# J0 w# t& q) X! I; ?) E' A- H. P% P7 i常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。3 h! j2 L4 a' r- k3 t/ T2 T
" Y  r/ e$ @% ?9 U  T& R
实现代码:2 }9 c$ O4 |6 j, e6 Q1 S3 ^$ b$ }

( \; c' ]% s. q8 G+ X- x4 q
  • 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('提取蓝色分量后');
  • 7 D1 L, k8 l8 E; B
          / E( S$ x. S  E% b; E3 U! E

- S8 D, y0 j- A- P: t% j运行结果图:9 r- I6 b- R5 K" h

4 ?. u/ M& C7 J7 u" T; H$ ] 7 K$ h3 c5 Y9 G1 _8 n: \

% O6 Q! E& z( P图像中去除某一个区域
$ B. N0 e5 }3 F& R: |; X6 J! X$ H7 C7 ?( |- w! p+ P2 j- F9 c8 u' b
比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)3 Y0 J8 Z- s  Q5 N/ {4 P6 F

) L: `7 r. G* N) \% m0 L# V1 z
; X" m3 X1 C7 Y& S
/ n& C! Y! g  z* Z% F! p' p1 @解决方法:
. l) M7 U# p' i! t2 ?8 P. C' c+ \% y8 p* j
这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。
7 S. ~8 x6 o: z! M6 T/ f' G$ t1 p! O: N' B+ i
代码实现:
  {' Y/ r: t+ f: G8 _. S1 O! x+ V* ~( c8 n
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);
  • , c& t( K0 I! [, ^
  
6 y, L' b( t" o% l+ s9 d! y4 }0 ?0 w: O6 X2 g: |( E+ e+ o
运行结果:( y7 B2 t8 ^+ ^9 D3 l

9 Y  \: T! o7 t* a% O" r
, l* G) y! V6 c# _+ L( A1 ^1 s9 I  n2 ]9 h/ k$ E
在将其进行图像分割,即可将原来的矩形去除:
5 N- @- n2 ]# E, x) p9 Q: U% P3 L+ J5 |$ x
参考文档:
" P( @& `; P# e* q4 d5 O$ D; S9 v& r* i! |# Y! }+ w
RGB图像中特定颜色的提取1 X5 `9 ~- T$ {+ v8 _

  k7 |* e( [( E, F- z

该用户从未签到

2#
发表于 2020-1-16 19:38 | 只看该作者
用Matlab提取图像的RGB分量与实现RGB的阈值分割
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-2 22:57 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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