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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
7 f- N0 n6 Q# @( {
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。
$ K# @  h! G4 }- e1 u* w
, v  L; ?# X6 j原图像" J, p; y, C8 s4 ^- r2 f

( h' I: U7 Q$ B  M( }
/ b) G4 [. t( B" d; w& r( `6 @9 X& O* ^6 \& J4 T2 v/ q
Matlab提取RGB颜色分量:
6 N) L% r5 x9 b: \' l8 F
. z: ]1 a" q7 D, Q: R% F9 n. m* ^4 c5 `我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。5 n4 F( G, y6 x6 H" w) @

+ q) u% t1 v! ^: Q例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);
7 ^# }/ V! ?: P  F( w
( }' K4 N: ?1 |0 t- `6 d在工作区中可以看到其数值。
& S" c6 f0 O  Y1 {) J& A1 `2 Z2 S3 R
# c. N+ S7 k' I+ _0 u

4 R  U: I- @3 ]# ?PR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量7 ]& r# V/ t7 R# l7 W9 g
# _6 `2 |( T5 h3 Q+ Z8 ^
运行代码:
$ s3 H9 t7 V) {5 V: W, E5 [8 `# ?; \+ ~0 Y# n; o/ O8 s
  • 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('提取蓝色分量后');

  • ' O' f3 O+ k7 S
    R( |) Z- ~3 U. X# `
" _1 S; [, A6 w
运行的效果图:6 L! A+ l# {' c8 x  i" ^0 C/ a6 ~
+ `+ M/ T3 J/ x- T4 t& V3 A
: e1 I+ Q, S- l! N. b' a

) U4 D3 Q1 [$ c/ a6 t% q7 @RGB阈值分割$ A! Q8 R; O. T

& H' p' ~# h* T" Z! k  g上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。' g) X; r3 j4 q

0 L  P, x0 F, s: [! {3 `  L
8 b" c* V. Q' ?4 Y) v4 P, r8 s+ |
因此,我们使用图像的阈值分割。# `; l: P) k) l

2 t, d2 _1 @3 s3 Q# {阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。
( s2 S! O" j) ]3 c% A, }6 r
5 j* U8 s6 L9 |# D3 y源自参考文档:
7 _" Z5 w$ W5 Y  O$ ?1 r% u3 H1 m图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。
5 h2 M5 i- [' r3 r0 N5 @" b+ @) e6 I- Y% @$ @, F
基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。
2 Y. W# J" S: y9 _% c3 w2 f# i% V2 o4 x! W9 k
常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。
/ a/ Y0 ^/ V: ]" n- c
+ {5 y5 g# y+ X实现代码:# M0 t" _9 N; W6 y# H

% a0 q  n, A2 t
  • 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('提取蓝色分量后');

  • ! W, b- p, J) f- ^3 C  R0 M
          2 |- J+ Z# o+ I) @
, V1 O  l2 _" Y, c  w$ {2 }
运行结果图:
1 T6 o; K# `! F0 o
) O/ K# ~! E8 V" [2 [3 T+ p" Z & N& a3 Y% ~7 _/ E: b7 J
+ ]9 ?$ G+ ^8 G9 O/ A
图像中去除某一个区域
0 z% L- X4 @. i0 _/ T6 o0 S5 k4 O
, X, q# l+ u7 h比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)0 ]: ]$ }) R2 y
& k. ~: V* }- T+ }/ f

* x3 [: Z5 v& ^
4 u* F$ k- y: K2 F. y. T) G- j解决方法:! P* [* Q5 M* }' t0 E! d, F$ d
; i/ A1 c5 d5 w: A6 w. k2 l
这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。
( G, f' b! x$ M6 _& Y; a; J* O  p
代码实现:
5 A1 y( g4 C( e2 ^' S
6 r# p  U  {- b6 f: l+ C
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);
  • 9 J) Y* ?- r! T2 N: K! N
  
+ h# x# ^5 x( W) S2 t
* a: j8 m( B! P4 z, M; r6 \运行结果:
3 \( _$ E& T7 G9 \/ a; R% h0 L- D3 [' j" O
8 ~' \$ C* f% k+ V2 x, G  P

5 O8 V5 S/ X! p  s在将其进行图像分割,即可将原来的矩形去除:# @/ \5 U6 e, V$ Q. n
/ t4 D% k4 s$ l% m5 [+ a4 i
参考文档:
# S$ {! I; c4 S6 }: |6 [- S: S" R, W8 X) R7 I5 j2 K6 P: m
RGB图像中特定颜色的提取
& `) U( o5 @0 T7 e- q+ {9 ~% y0 ~! m4 I- J" ^

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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