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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
( t* \7 F4 S4 H
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。! _- C$ y9 x: O* l" D

# K( c  u" ~3 p7 h1 w* z+ R4 {" H6 p原图像
' {  \& {8 d% Q* [" o+ L& e% M" g$ @2 F& u' m1 c2 y- p- d& m
* M% p7 m7 R% ?

0 \4 P5 A; R4 l) YMatlab提取RGB颜色分量:
. l$ K2 z* ?# o% b" R7 v
4 g+ f- w: X) l. c0 v我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。' T9 r6 F7 A1 N  [) A

2 C7 d! e0 f' ?! E% B* u# w例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);3 w5 Y8 H: _+ z, \7 L8 _' i1 i0 E

* {/ R3 n5 j( a4 ?" O2 [( \  L在工作区中可以看到其数值。
! U/ z5 B5 o  D6 l+ ]1 Y6 d" A4 ~9 ^9 r+ r( O0 m4 ?( \

: X" d2 J) {# C8 C# ^/ e- U/ A" p) j" S3 q. d/ f5 f7 i6 }( {
PR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量/ k5 j8 M# z% {2 B0 b
4 a8 s5 e0 p1 [! T
运行代码:) n/ j! b! Y' p9 X  p3 x1 {
' ~2 K  e; s2 {! n8 ?" b# S1 O
  • 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('提取蓝色分量后');

  • * m$ D6 q* k1 m
  # O9 D, ]9 O: i. q5 G9 P
6 S& o* F- p. v7 H9 F( w
运行的效果图:
& _' z! e" G' e$ L9 x% X# v$ F* Q) ]( I

$ k& X$ K. a& y7 X( X
# Q8 q+ u! p/ b  u; P0 G( u  I: vRGB阈值分割
+ y5 b( V3 j+ d% _' y# P: L+ |! q
上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。
4 S* r/ G4 A- j3 s* V& c2 `) a% |/ E6 p" m3 }4 x) Q8 j
( y; H  d8 f, P/ |

& t* z, o4 O2 b1 _因此,我们使用图像的阈值分割。
6 _; o: T9 O) `+ u: @
* z+ o5 F% a  o# A( z阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。
- q$ L7 j9 a0 g9 ?5 v' N( i5 \; L% m/ y1 {( F
源自参考文档:
2 O6 [. A# n2 S$ |6 O5 u图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。
- a: ^; W4 X' z* b5 s( A
1 m  Z! Z, t$ o& q) w基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。' ^/ F# M2 f, c; N3 l
0 G0 N; q* _2 N+ E2 m' t+ q( l- Q% P  N; S
常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。
7 A, ]5 ]* H( u! @% k- U. L0 m0 I% J$ s* T" q
实现代码:3 {9 Y6 ~' \( e& d

5 ~6 C  o( J$ V' c( R* j1 H% b: r
  • 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('提取蓝色分量后');

  • ( U  V) W& ~9 A
          2 t2 Z8 w- w" c( U7 f
- s* E6 K! I  b# q
运行结果图:
5 h+ @* i* r! n! W' |1 V6 M. d/ W9 |# l5 k5 ^4 l

6 S! n/ r# C1 b5 j3 @! q6 y
- s, _& @% X! L6 \图像中去除某一个区域: L$ L9 M% n, l; _

( W2 \+ _7 O1 v8 |$ S, ^比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)
+ R! C/ {! Q; a' O# I) @" n4 d
+ I# x: r! k3 D# [0 m# P
: K. I  V2 c8 I0 E
) n5 Q( Q! Q! [' ~' j4 B解决方法:
5 U  C) x! S, V3 V  N( R% _- w) x9 r: L* M
这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。( s3 E% |% r4 A3 V. J4 a# |; n9 c

  t7 \( i: {0 n4 w9 t/ z' h代码实现:
* Q7 f( Y) M$ h/ m' v% ]4 A- q# b5 [7 f1 o1 y$ c8 S' ^' K
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);

  • * L% ?! F, W/ P
  
- W- `. M) k. K8 `: p) Y2 R  N4 a$ F6 E$ |
运行结果:6 \3 X  B# G$ t0 [; y/ }

( M  u. u9 U3 R. c - G4 b0 a5 U. V

" L& y, }/ |1 I: h0 n. j在将其进行图像分割,即可将原来的矩形去除:$ O; |& Y* q) _3 g5 q8 L. J1 Q" b$ u( P
7 K6 p* `5 e( J5 c" D
参考文档:
4 Z0 ]8 G7 k; R) ~
, @& w- m* ~* G3 I3 T0 \RGB图像中特定颜色的提取4 z# H7 \! A" _, h' q
) r+ N' j' {5 P0 Q0 [

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-6 16:56 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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