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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

/ |9 [; {9 M4 H- q' A' d/ C本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。5 K2 |5 \  y6 S; {
* f9 l. t5 c$ G) D
原图像6 f5 b; @# ~! q7 }
* N/ }- w% W  [  [$ [# r# r4 ?
1 R/ y: a7 J1 R% T9 g9 t2 K
$ x: M# n6 U) g/ @( w
Matlab提取RGB颜色分量:
9 S0 O" Y+ G% K- c( d8 C
: n2 w+ c, \: y  h& [我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。
( s+ i; m3 T9 Y( [
  T+ P, u6 g0 P9 [例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);( a  i9 S+ _7 X6 p
* ]. g. G5 F7 N; G2 V. K& [+ M
在工作区中可以看到其数值。3 S5 Y0 ^. \! ]

5 ?* K5 f0 w9 i3 k' h! E' l) C , ~* n* E; s% h: c
) f2 a" d9 E6 u+ d
PR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量/ l. _3 @! E. M9 ?. e3 |
$ [& g3 T( H) @( q: F
运行代码:( {3 t( p- t3 k3 A2 t! |
( X9 D( c! g1 u1 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('提取蓝色分量后');

  • / h& H- U( o  n5 j6 R/ m* U
  
, `$ Y9 G# N7 S! O' p# |
  l8 h. D3 K7 d# E8 B, Q* M运行的效果图:
. @. X. @% K$ J; Y* }, s
" @' K6 p- w$ [' b . O9 \; s& E  ]& P! y$ q2 b- x+ I# a

5 o5 m7 U: g) q/ ZRGB阈值分割
+ O$ a1 {& K/ e) c" W0 J0 B; L5 z2 Z/ |3 V
上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。
1 ~: O/ W- s6 b  _) l4 @5 J8 W' F, j' I+ \- h1 R( s

6 j& `% p. G* U$ g/ J
# N# b. o. L- m0 W, j因此,我们使用图像的阈值分割。( t( y1 b6 `* I8 w6 O

) ~* o) Q" D7 X0 a% `8 M阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。
! ~9 |! Z5 E- m( e& E0 w8 q! ~% g4 B7 y& v
源自参考文档:- H3 Q# R3 \1 W- n& g. i6 F; F
图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。
* n5 X- _( Y$ `9 A* F* S/ Y
! U: l$ Q* e3 D' C- M基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。1 E6 j* e/ n& j+ @  @. B: M
* ?4 e( R# k1 |; m' m; ?$ m
常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。
9 i5 s% V' U" q  W9 M) M6 n& o
: x. p! w* e7 l  A& M实现代码:
+ n# D& Y7 d& a+ D/ i. |5 x# r4 R% C4 H! r# n
  • 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('提取蓝色分量后');

  • 1 v( Q* X3 w! Z8 \5 O. S; l# [/ X
          0 L8 N: j" \' j$ j/ P% H. z

% h3 t" @& I. \! U" z运行结果图:
, ?9 i+ b+ S' o1 [. A
! Y5 R! O, }9 _8 A  L. x9 V! g
2 _) p. Q; m" U  A+ [- Z( B; N$ Z& Z& U3 @5 S
图像中去除某一个区域
0 b1 q0 k+ t5 T( x& i# U6 H$ K$ A9 I& H& N$ G& Z* Y* W0 ~3 v: A
比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)
" m7 u# L6 a7 U5 b0 V) J) x3 I3 e3 k+ B  |; a& t# t

4 @4 J6 b$ j9 |; g7 y: k7 M4 C; |5 r
解决方法:
: r- A# }( ^+ |$ J* }, K  A2 Q& p3 |$ w! C5 L" n: f
这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。6 i3 q% q0 p' q& I, V. M4 m6 B$ e

9 C. p; u9 P% L* U$ N( `3 z代码实现:
/ Z% }7 |$ L' G. {& m) r5 ~
6 {4 X* l4 C. O' M0 f
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);
  • - T# @% ~, k! ~/ x2 G6 s
    w- c$ x, _$ }2 R& Z

% j( n% M; ]' X& Q1 l运行结果:
  k, E- Z/ D; K* I9 @) K; H# Q/ J2 W, ]
7 `! d& R9 ?' Y/ ~( }- x1 k1 i

6 k1 g2 Q0 Q. a4 t* Y. O! V" s在将其进行图像分割,即可将原来的矩形去除:
) `- y6 E* N- a; m+ ~  f* y; ?( k6 r% A* `  ~
参考文档:' i6 n. S" p5 S. R; T& Z

% s9 b( T3 c0 tRGB图像中特定颜色的提取; x7 s6 `4 x2 V3 \: V; ?7 z' ~
) c- J( S3 B" N/ S

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 00:44 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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