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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
. A) k+ Q0 r" R$ o6 p* m/ b
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。
5 F" g) {; m  n' M5 f- l# w! k$ a& O( s
3 r; j0 I4 u2 B1 k; p3 ^6 {4 Y原图像
" g* Q% r: A& K2 R
" \+ _/ T+ e" y2 G + I- g2 e; n7 r7 z/ x4 c
' K6 `. u: J  o
Matlab提取RGB颜色分量:3 D1 p; |7 P; b
% F4 n$ S" ~' Y6 G  i6 x
我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。! l2 ~! F" {% {' e) C/ D$ Z

* G  Z$ [7 D2 @( p例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);7 b; b3 T) S9 c" ?

8 r: I7 v; u9 d7 H8 x: X- N在工作区中可以看到其数值。
0 j, r- V5 _) V- \$ p+ S8 I3 m  t
  h" L# O( `6 I4 H$ H: Z
7 R8 Y- Y  `* N
PR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量5 P8 i* o8 |! t7 k% h' G1 I
0 F4 P# [/ R0 l; O2 Q( }
运行代码:
; I% u1 y" [- [+ K& m  P  }. G. i$ @& S9 M8 A% F
  • 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('提取蓝色分量后');
  • 8 ^2 C  E' h# J& z3 C
  
' K  y; ]3 F. G2 f, f8 w! ?/ R+ v% _( P
运行的效果图:2 L1 L9 ~* t  Q

  Z$ d  d, `5 B7 g: I
" S! v( P2 i) b- \1 v2 M
+ d8 @6 b# P) Y  b! v) p6 bRGB阈值分割
* n; L' J! d( f7 M0 O4 C
( k) b; l( E# @3 W/ w$ m上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。
9 P& s+ W+ R" ]' m
1 q6 ~; J- l. q
2 m& r0 t. x& b) f; p$ `. \1 p) O
因此,我们使用图像的阈值分割。5 `6 m2 ]/ r% ]3 M; l
- D. j, |( v/ }* T& t
阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。
0 Y. d: U! u  h& F2 [4 ~$ a  s9 }- \6 q2 W! m
源自参考文档:
2 ~* W% k! d3 ~3 E, U# M图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。, K$ H/ I& \0 I( S' @/ _! r: n
/ P( B# F2 \7 Y2 B, Q+ `
基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。
4 X) Y+ `7 z" ?( _$ u9 z5 w8 C$ H1 [4 @7 r0 b& z  M. r/ p" @
常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。. K1 B1 q- i1 S' N6 P7 B
) R$ S" b  u! T7 X
实现代码:
+ ?% n9 W, _" @! f+ x; q5 j6 `+ J! i" K4 K
  • 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('提取蓝色分量后');

  • ' ?. y2 U0 w5 j$ c7 a# i
          $ \0 a$ ]. _6 u8 m+ S8 T) D8 A

) Q: U( s# V; i: |2 L运行结果图:
8 H) Z' ~# x5 F& w+ P# W$ L) b6 o  ]4 M! E$ W6 A" G9 s0 I, v: N9 B& O
* p/ g; k3 \& L6 x( \2 ~4 L
5 j! z7 z+ V& L- i
图像中去除某一个区域. h& _- o" Z, N, z/ _

7 h* v% S9 X( x' w) f比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)
3 U3 H  Y* W% a4 A% I9 A) r4 D/ S- e0 J1 n- o3 t" `" T

3 \% I% ?- a3 s. }0 h: H+ S
8 \% E. t( V4 {解决方法:( E4 e( A4 p5 g1 V, b2 t

4 Z- T' G( f( n& g' C3 O. H这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。
) i' ^% K$ h" X! ?$ a, i* R
( j. m1 @# N3 Q8 m" c( ]  ]代码实现:% a+ b  O% K. B( M8 D, j' V6 {

2 f; \) ?  F; g
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);
  • 9 }8 Q4 z$ T4 b+ J/ }8 d
  
$ a+ P% r( d# m2 n6 V* o/ D+ Z
# p, i  }, n$ A* @' K; r; D+ V! R运行结果:+ T$ `2 d# ?. _  t; e1 D* N

) Z/ p% u, f9 {
% H; k( _2 J1 A8 i: }  j4 w8 Y1 C  @7 ]0 e3 D: }1 f
在将其进行图像分割,即可将原来的矩形去除:0 r0 H5 R4 m1 a' k; Z

: c* A# X6 c$ z" }# J2 \参考文档:1 Z7 H& {9 c# n; W

' Q7 K. ~' Q' h! q# L* G9 c$ P# @RGB图像中特定颜色的提取( F1 x  s7 w# w7 u, J- g
0 b  e9 Q9 |0 C* E5 l( e/ V

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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