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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
3 O$ M" U5 Y' H8 V! F: u  Q# [
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。+ z* R! Q2 V" S# j  G/ B* G
+ G8 P1 F$ E" [) w' _6 A' l& z* t# x
原图像
) L0 s3 f5 d- [: w1 ?5 U. l- H: u& e# N% x, c5 g
' f6 e5 d  M% Q5 ?$ N3 k
5 {- i- a; @' ^9 D) u( l+ l( k
Matlab提取RGB颜色分量:. M" Q0 g% b- r% k9 K/ [9 c% P
) w& U: W  @; B# a* Z
我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。
( ~, D; W! w+ Y
. L& Y7 n" O' ^1 K8 w: \* S* E例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);
- |, r6 U7 r# C( W$ ~
0 H. E# b1 f2 ^; h0 N在工作区中可以看到其数值。
5 \4 ^4 D' r, ?# C% T3 e: Q& Q) [; W
7 L' e4 s2 ^3 U

8 S% ?! Q' a. x$ d1 ?' W. F. sPR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量: ~2 S2 R* N- }/ I6 e) q3 w
5 n8 r" T2 ]4 P7 E
运行代码:; f4 C8 Q1 P, P+ Z# |
5 W6 H- \/ O- I2 W: x: [8 l0 V) V
  • 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('提取蓝色分量后');
  • 3 p% A/ F$ @; _6 B! M3 s0 B
  
: C1 ?. \) c, F& l$ p
* E# Y* {% G6 L运行的效果图:
0 B4 V& K- ^7 ?4 Z6 E6 T
1 d; ~9 D, f) r9 r . }( ]8 u9 w' T4 c2 ?7 H

' m3 W4 F7 J7 U# t5 lRGB阈值分割5 ~0 ^, t/ w; _
( G+ ^; p" Z$ q* J  M& |1 P; z
上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。& ^0 }, p2 R% S
4 u. j' y* A* Z$ F/ U! L* A: L
! I7 G) p6 H2 P4 e7 _8 N

$ J9 N* w9 T/ _. U3 ~9 u因此,我们使用图像的阈值分割。
. ^5 n$ ?4 Q0 H1 Z. M8 `1 n& T$ {; `9 w% g* c" [1 G. K
阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。2 ^1 B7 \# q6 {' `- J4 C
6 N$ v2 h, k# R$ c9 b; |4 z, M
源自参考文档:
8 T$ w5 F9 p: @# A3 Z图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。0 n. {( K* D) P! G% a4 \
- i; H( a7 Q0 C5 E
基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。9 ^2 r8 E3 S6 ?, x; f

6 x9 J; T6 F# Q  M常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。  ^+ G# d* P: D- T/ [: M0 }2 K

& b- q, x# ?8 d+ A, y6 |- _实现代码:
+ Q6 v( u- J4 u4 p( X- [9 ]3 c* B0 I; p6 ~' F) M
  • 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('提取蓝色分量后');

  •   ^. p9 \' E  k9 V
         
% g9 a2 b( [7 s) F( N  n$ M& H1 [
/ I& Z/ J7 O( v- Z* X6 e3 R2 X2 s运行结果图:0 Q, N! u# @! a

8 c2 S) N7 q, ] : `! y6 W4 p; L0 N. P3 U# u; H

5 k: q: M5 o- @4 a" H7 c图像中去除某一个区域. Y/ V+ O/ C  ~+ W% F8 Z
/ c4 ]7 m3 Q6 r, @+ p6 p
比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)
4 A' K7 ^$ e/ C1 o4 i
4 _) K7 o. G1 _6 ^" z0 ~
  k& G* Z& B5 A
4 I& ?( z1 L/ Y( k$ `$ w解决方法:
  F+ }/ B% O0 }3 r7 n
" R4 E& b' ]2 v4 l这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。
0 ^) M  T' Z8 ]: ]6 d5 A& l' m: d
8 \# R4 b8 Q. D# v+ Z4 I代码实现:
# x2 g5 m- L. Z$ j) [, J9 Y( a0 T( z) E) w- E# s. P6 C
  • copy_image = I;
  • r = 50:100;%要赋值的行坐标
  • c = 20:300;%要赋值的列坐标
  • copy_image(r,c,1:3) = 255;
  • figure;
  • imshow(copy_image);

  • & Q, W, [; B8 w0 H; U
  8 r* c: G: n( j8 J3 {

; i6 K" z+ E- T+ o运行结果:( _6 k( N& f, s  V4 _

8 E- H. v) _" f' x
9 B0 P1 ]1 j) J5 E4 u4 o* ~& Q) d' Y; ^' w3 U2 R! W- F
在将其进行图像分割,即可将原来的矩形去除:
# F! K" R+ v5 ], O
( g* {1 G4 j' p( A, _参考文档:
1 Z6 v* e3 ^, Y' G
1 X9 }" ?2 }. Y1 @' z2 I  J5 ]$ Z2 |RGB图像中特定颜色的提取; W3 n9 y  P% e' Q

2 H( _1 `; I$ B: U3 v6 p& o; ^

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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