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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
' m" }$ W; j% G! d$ a; \
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。8 L0 I8 {' s, D9 z. n: z4 _- L

( w& Q& q" F' e# f: \原图像( W1 `# Y' n' l: C6 l
, ?2 A) S. \. \& M: z2 ?
3 I# Q8 p; b* `- r& n

$ y$ [' P) H) Z, G( ]: _4 rMatlab提取RGB颜色分量:: T% m+ V$ S) s

8 c6 e2 s! D4 F$ n& E( M6 O8 q我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。+ z4 q; T. N' m# E3 y
  a* I4 H" h! E
例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);
2 D1 f. `: Z! `7 ~0 n3 C* p# M% T% G  `3 r
在工作区中可以看到其数值。
, e4 B; f' f: V2 D
+ s' u' @- }7 l! a  I + U: S. ?5 f% b# J; U# a

* U4 w% |) a5 Z$ KPR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量
" l6 v0 \# N  O( V* A# j) z, R9 j$ n/ G, T5 B
运行代码:
* g" o3 [+ h" D& m- K" C: A! z: o2 k3 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('提取蓝色分量后');

  • 2 p4 ^! C, d# A0 I) d; a
  9 n2 t0 L1 U) _# c! b

4 l: e) a6 n( M7 Y运行的效果图:& ]. P6 D  [2 W) `) |2 d5 F
6 r& \& h( m4 \

9 ?! q% J' x1 Q5 W. c. l9 B- y& o4 ?& x% `3 r: c% Y
RGB阈值分割
) {1 A# B3 a# R* R4 D7 {
: K0 h. d' M$ `" r上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。4 v' o9 N% q) V, q0 m  ~2 |
0 A/ f* P& W0 k3 h; u9 p" E5 Q, b

: w. \8 o9 ?- [! N1 R! _. M8 ]# x  q  M+ F5 g1 g2 A
因此,我们使用图像的阈值分割。0 Q8 G7 [) J+ m2 w

/ G* @# N+ E( U0 b0 T4 q5 j  N" ^阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。2 Z6 r5 C' r# }: X

( _# B, \* i9 H% z. y# Z源自参考文档:5 U2 c0 w  A" C
图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。/ K* D- e8 J" j3 \$ D$ G& m6 H/ d

: `  k+ }( z7 |. r4 W基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。) H9 z0 o+ [& n: z

; {9 q4 n( F( ~, b0 p0 L常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。
: @# }: Y$ A" \& g- b& @, c  x* {, H1 v
实现代码:& e6 j& W6 i$ u8 z. F4 [

7 I9 j5 F& M2 m) U
  • 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('提取蓝色分量后');

  • " R7 Y& |3 R& j8 ?1 d
          & @" G! ]# Z6 G# y) i' s/ R

. ^& \7 g9 G) j' O. Z& o1 l, w( i运行结果图:6 p# ?5 ~0 t( h9 n! p! @, r+ ~+ D

0 u  y  g- [, a+ \2 \/ S
/ u+ f3 a/ e* v* i. w( S  h3 V& w# |- V' h6 u0 O  F) P
图像中去除某一个区域
" `  J& Q7 X" Y
: r( h* W1 u$ H/ i1 ?比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)
6 c# V% }' F; L
# h' D  F# A1 q3 s
# O; y3 w6 j$ Y+ f4 m! r+ G
; O: a, l! v* _- \( z解决方法:
: K  _& Q  d- f; X* |' p5 Z+ Z' r$ d9 l; s- h( P
这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。
  }' a3 t; z! J1 ]8 F/ x/ C- }2 \1 g, ~" |6 [1 H
代码实现:- U4 G: ^* S: [8 S7 Y; L' R
/ r# S# f. E/ {& a. J
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);
  • 4 b7 ]  J; e2 w% G4 E
  
: n! a$ L2 g$ t+ \6 {7 V; s2 Z. R, Y' H
运行结果:
3 w( k7 G' I6 o. }, g4 B  F( w, F1 h4 i2 B) b! s, F/ @

9 m; G: t2 t  `& o% D2 ~/ x: v7 E2 w, A( J
在将其进行图像分割,即可将原来的矩形去除:
) B" k! V4 O. Q6 c* V+ b3 e# _% ~2 d5 u! r3 ^, h
参考文档:
4 @" Y$ l$ O' s  U: v+ v& U0 [  \; e( T" T
RGB图像中特定颜色的提取
& R) b3 x4 E: B3 Z
' C7 ]& m( M  L: j, H7 @. G

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-5 21:19 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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