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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

1 j* W8 g/ B( c  R, j本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。
4 H6 ^' V( U- a9 {4 J' J
1 _* y' d- R+ m原图像* m; z* }6 h- ^
% a1 `9 h2 o# v! {) [6 c3 r  b
2 N9 n% \! e, d# d* D: v

& |- L6 t+ \8 b+ f1 F4 O* SMatlab提取RGB颜色分量:
6 ]4 B. W! J( j( p, m2 r5 ~. _6 M9 B2 V; k
我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。: n' e1 x& A' c" }. q- u+ L
9 m$ G, S% ]0 P- r3 h. p
例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);
8 O- P, l# m, [, t9 w) l; O1 d: @$ F& D
在工作区中可以看到其数值。
. T9 O8 Q+ v8 @3 k1 m( J- }3 H. q& n4 x. U
7 I0 V/ A' I( J8 D0 O
1 q. R( s9 M8 V/ O2 J- N
PR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量0 |3 B: {, e0 Y

/ o0 Z; ]+ J- a6 K运行代码:
; O  u* q, G% S$ u) `5 R7 ?: m. L+ O6 G9 o: c) t
  • 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('提取蓝色分量后');
  • % n& Y; Y+ e( ^7 i8 c8 }
  2 {- @* b1 Y, V: ]
: H& f& @8 d' ^$ `  W3 ^
运行的效果图:
, C3 j. w* P1 f( F& D7 m- r$ o( C  S. a3 R5 _" B

1 j; }/ D$ k! l- t8 U1 K8 f# Z/ X5 Q7 S
RGB阈值分割
/ g+ F0 x! ~! h: M7 |$ W
1 D' t3 H, o/ q% b8 O3 l上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。
& H* Y. x$ r# u- |! q
) f$ e. e6 \) p5 S
- E# W: R6 |6 W. d; N+ Q
( x( ?7 ^. `2 D8 p  a因此,我们使用图像的阈值分割。0 y, S0 ^- N5 I3 E3 Z, T4 ?; O  m% K6 X
, L7 E5 e: O6 ]/ p$ Q4 H8 w
阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。: j- ?- H7 e/ p
( s; j$ o+ }5 Z0 B2 L" |8 _
源自参考文档:4 o2 b' Q+ O2 k$ h) T
图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。1 j6 v- R: @% a! {* o

( Y) }9 g6 ^+ e! V  r; J$ F, y基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。$ z8 @$ q" J& ~+ [' ~: [* j( i

- f+ J$ z( `( s. V& z常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。
8 i5 w' p& v- j& m9 a! B! s2 |
! C- r9 m8 `' `0 a实现代码:  ]: i3 I4 ]- j4 q: R
# V5 F1 z1 r7 L0 f
  • 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('提取蓝色分量后');

  • + g4 p% T" O: X0 ~
         
5 N1 x8 s7 C# u& j* v) X) m# F
运行结果图:  [" P! }" p4 K( S/ g

; _, i; d; v) B$ c7 N6 Y! {+ F! G2 Z4 Z # v- _6 O5 Q0 k0 I0 z  C3 z

% R5 [* j, W( v+ N! I  K+ i图像中去除某一个区域
0 \% E" f  Q2 s  a% M8 i4 L6 |3 z0 f8 U
比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)
& R$ _5 u# \) T6 [! ?! @
/ W2 m& [. h+ l9 m& z" e6 P
5 H/ Y8 ?" t! p( Z+ x+ u4 E" y' a: i# A* q
解决方法:
% X- n! M; }8 L# @$ O8 l2 O1 p. E9 b' k* v
这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。
& R$ l- V3 }9 M8 j0 ]& w3 g9 E/ c- T: ~/ I$ j) B7 `: t! N
代码实现:' j% U: M. w: ^, T
0 z8 `2 d$ t/ \+ G8 g6 Q4 v
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);
  • % v# D3 A4 m" f, l! ^
  
* }2 X- v$ _, ~/ N0 h, K
2 M% x- K6 \& j" m5 k; N运行结果:& _" V8 P, d7 R* |3 `
4 I5 l. L! t, y7 j9 r: j% e
  O. O7 z0 m5 I7 d

! q: ]. h8 {( z* @& r0 T# J5 Z2 J( G在将其进行图像分割,即可将原来的矩形去除:- ]- M# k9 k4 G8 p  U

- Z& G2 _. f5 _& u, y1 C- N参考文档:  @+ q# G8 s4 Y: o7 m, d
( C& b/ X  q. R# T& u, f
RGB图像中特定颜色的提取
: w3 A- o- E! H0 C2 W& t- @7 b3 S9 S6 T# y

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 21:30 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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