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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

1 ]* J" Y2 b# d4 X0 ~' L5 s; f* f- X本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。0 @3 j( T3 k  Q, A
8 v! S' p' B3 n2 n1 s
原图像! ?$ f7 ^8 f1 m' e( e

% D! B6 F) h: e( h% e0 Z
7 u3 b+ Z9 d: O3 ]& y4 I$ ^" G7 _
Matlab提取RGB颜色分量:
$ r5 t! X0 H0 z' T" S. h% F5 f2 g( }
我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。# |3 G" |. y3 p6 Q* n  r) o& U

8 ?# W% I7 }, H' ^4 W* o例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);
. v4 z& Q3 h2 D  [4 q
& f, {0 w3 D; o7 g% k: E  u: D在工作区中可以看到其数值。$ v+ W: d' N# f
$ b& Y9 n9 {% v6 o$ D1 A

( P4 G6 l5 J/ V: a: l5 g
# c; [" i6 x3 x( ^" t6 w7 C. S* oPR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量
2 Y: O' t7 ]$ B1 @
& B8 w6 @% K8 \( M运行代码:& Z* b" }  c# J$ n' h6 S+ O

6 d+ ^! F: G; N5 f8 e' j5 t/ N# Y+ j
  • 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('提取蓝色分量后');
  • ! ]. Q9 o  S; f0 Y& K
  9 r5 n" n( F+ ?3 l4 ]3 q

( y6 h6 V: w) b运行的效果图:1 g( e; g* U+ ?9 g
$ C1 @  }/ {# U

' r, D1 P# O+ ]- w1 |4 l* \0 m: o4 @$ b
( Y$ l: M+ H. ^: g5 {: M% y& aRGB阈值分割
" G0 x( _% J0 G( q- U/ ?. H# d$ V" u9 B! S
上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。
8 N* g& \0 C, B: `
4 q, V* l! ]5 |* }3 j& \" I
" }/ k% V8 o$ }
3 P2 H$ I0 f# q% n5 X) {/ a. p因此,我们使用图像的阈值分割。3 U8 X) \# C$ h1 B" t. Q

# I- N+ c6 Q' H8 B8 R0 x* \+ w阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。7 c& t1 }& B! r$ {% B! s' A
) b1 R7 d8 d8 ^$ m
源自参考文档:" w) B' m( z# Y$ Y3 c; d$ v7 W( G4 T
图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。. g* f( R1 h0 |. d+ n
8 P. P9 i( K" Z2 X
基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。
- r+ T9 @% f2 }7 C. Z3 v+ _9 b7 N7 R9 p1 Z" _- T) U: s
常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。
! y: V. }. p9 K( G
# o' _  ~$ F7 e( A4 x) p实现代码:
  n8 A3 V; U2 \9 ?% b( V% P( P2 v+ J; ~' {. w+ D. W) |  h2 ^
  • 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('提取蓝色分量后');
  • 3 I7 G* S2 t3 a& C  @$ a. e
         
, |) i% @9 l, l- q5 x2 G* k# |9 P! A! b4 }, L
运行结果图:* ]3 E0 u/ @7 [# c4 K" @8 a
; j/ ~: O9 _/ U% c
) f. ~2 u, n" d+ C1 ^2 M! A+ |% Y+ d

+ E# u9 W) U7 O. Z6 F' v$ n图像中去除某一个区域) ~1 r  W0 I  S5 [) [9 ?
0 g0 ?, K( h3 f- T0 U# U
比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)4 h! s) ~; P4 k# e, U6 U  `$ U

- L/ b. H  s- j- u* ~
: ]2 A6 h0 E6 W. x# r8 V1 M3 I, t6 Y0 d
解决方法:
# v  }* p# [/ V: f* b3 r: [" c5 g6 E- a$ G4 j( c
这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。8 M7 k+ O  H7 y

: m! ~% E7 M: @; }. C/ a# r" [7 M4 U代码实现:# a' [( F: P) x  v* X* I
: l* L$ [+ L$ |2 d
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);
  • , v2 a  ~) u. E7 H9 E
  
+ B4 M1 ]! ^9 l) K3 k/ {3 [
/ o1 h$ t: x; h: `9 @运行结果:
4 I7 _$ T5 }! s0 `; I5 R3 \" A2 R  w8 t
# A4 C" j# r* m2 R: L ' b, D# v7 O2 i% O0 p8 C
5 c, m7 C4 p; |! H; A2 Q2 b
在将其进行图像分割,即可将原来的矩形去除:9 ]8 Q5 p9 N3 V5 J* {
  k. ]0 E5 r: w/ T4 F
参考文档:
7 z) R, M. t3 l, u' ?# N" N  J$ V$ F: y7 d$ ~9 w  e. V1 [
RGB图像中特定颜色的提取
+ M# y4 f6 ^- k* Q4 x* R
6 R- n( ^) f9 t) L2 F% M9 [' [

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-12 20:46 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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