|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 O: e1 W/ C+ {* T
本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。5 `. C! @ B7 U5 ]! O% p A! a
: ]& ]0 h# f: ^+ t- M0 T' F原图像
& c2 _3 ~9 [# I6 P3 ?3 g- _
0 j3 Q7 ?* K; u
1 Q; ~: [3 G2 v! A' x+ D3 Q8 r8 e) ]& @7 X+ \+ B7 P
Matlab提取RGB颜色分量:
& R* R5 N. J& [2 Y2 i" C8 \! J d [) d. m U# F; X' j
我们知道,一张RGB图像,对应着一个M x N x 3 的三维图像。这里的3代表着R,G,B三个分量。其数据类型为uint8类型。数值大小在[0,255]之间。8 j! v; N6 f8 O8 c* t1 s
, \" n' `5 x1 ~3 s例如:我们在Matlab中读入本次测试的图像。I=imread(‘test.bmp’);7 j& P+ r! A8 o. r# S v. w
/ D, R; c5 S7 q/ h
在工作区中可以看到其数值。
0 D+ D: n+ P1 {7 M n
" l, @7 k6 g4 T1 A& t0 S5 W0 {
; t! R. O& ]- ^/ M0 k' W" m% R
& F3 ]9 ~/ p+ N( x$ MPR=I(:,:,1);%提取红色分量 PG=I(:,:,2);%提取绿色分量 PB=I(:,:,3);%提取蓝色分量! W W3 M4 N, G5 x( W( q3 Y8 _
4 ~* a5 P0 k* X运行代码:
7 z0 `8 y. c# A( u
( \1 i' u# N9 d3 _ n- 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('提取蓝色分量后');
6 _/ C( M+ e1 |+ s5 L v ( b$ z3 z5 r4 o: E0 a' m
2 t6 C" A U" _8 c3 b. i运行的效果图:
. _: f$ [9 V& o( d( d2 x9 w; n
8 N: |- [& O8 I8 ~ p
+ l: y2 ~; t- C' r/ z/ v2 `( W7 l$ S. t9 G( V$ M; E+ e
RGB阈值分割
" L7 _3 q0 R7 C) {- w V& e. T. Y! j! r( ~7 {$ D
上面这种RGB通道分量的提取的效果,并不是我想要的结果。我想要的结果是下图这样的。
2 G/ J/ W1 `/ z7 A0 a3 X: b( z
! |( k" b& k- q
$ {2 v; U$ ]1 y$ |1 y/ d; \, G
2 s+ U: g0 W6 }7 m4 ~因此,我们使用图像的阈值分割。
$ g9 x/ @' g# J1 S
' I; |" q2 z: [6 A阈值分割的基本思想是确定一个阈值,然后把每个像素点的灰度值和阈 值相比较,根据比较的结果把该像素划分为两类——前景或背景。
" o- i$ U3 I2 [8 N9 t( |3 }# [" _8 o/ U# J: R; {$ }
源自参考文档:
+ P7 j3 J$ C" h; g8 u @, g& V$ S图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域布局有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。
+ B9 y9 n' C1 |6 @1 k- {: |/ p1 m4 D" O
基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。
I+ a6 V' n" J* s
; E5 X* c G$ s6 R; t0 e/ s常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。
7 A+ A- n+ ?5 X C2 K6 g
6 g) ~% J/ D; ?% X- t3 o4 x实现代码:
9 a6 h3 M9 S/ M* h! X
' n" k$ D s# D, e6 J* Z' G$ J- 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('提取蓝色分量后');
) R2 L4 h9 I6 P7 K! A: d
' g/ O0 u$ _" e# G
" h7 B% _2 ?: N& e/ _ D1 `运行结果图:
0 i* T* c) j- m+ q0 C
4 V6 Z1 T! R6 d
% R i9 ]0 H3 d$ L* T
/ e& Z* e% Z) A" s h
图像中去除某一个区域. f7 X2 T3 G% b; _0 }* p
" y' W% o* i. b8 l0 O' N* V
比如,我想去除红色分量的矩形。但是这两个红色分量数值非常的相近,不好通过阈值来分割。那我们要如何将红色矩形去除呢?(本篇文章使用最简单的去除方法,下一篇文章则会讲解如何使用形状识别来提取某个图形。)+ C7 O% V+ J& H- i- V/ o
) l+ ?3 K4 y* v+ F( a$ C. h
7 x! j$ J1 F5 p' h1 s
. P+ s L$ g0 s1 q, G* M* M% v解决方法:
' x. b/ ?+ o% a6 W& u
- ?& U( a. |* j! t P这里解决方法很简单,先将原图像,那一块区域赋值成白色,再通过阈值分割就可以将其区分开。
. j9 Y( q3 k7 Q4 y. ~3 B$ m& f: M+ F- m* U
代码实现:# t j5 M y* E9 r# E. b! D+ [
+ `" G6 C: T" Y3 f% x0 ?. Y
- copy_image = I;
- r = 50:100;%要赋值的行坐标
- c = 20:300;%要赋值的列坐标
- copy_image(r,c,1:3) = 255;
- figure;
- imshow(copy_image);
- & ?: C3 Q" P: ?1 V, n% W
3 b* G, d2 J" q) a8 R k6 R3 u, n! v& O, G0 _# r+ ]
运行结果:5 P9 {7 C7 S9 m
) E" T7 E7 N- S" E* f; D* ?
4 v3 u: _0 d% f0 O
; N) Y: r& V0 |7 E6 {在将其进行图像分割,即可将原来的矩形去除:
, J" ?7 w$ G( T, O M: N# |3 U9 j/ F6 V/ h8 {
参考文档:- f$ x/ R% y9 @7 x5 ^
; V% k6 w+ k+ q5 W+ Y4 z
RGB图像中特定颜色的提取" w% o+ v& @2 K0 j, W7 ~8 [
9 E; H. U b' a: r- g! d8 v& N8 x& g
|
|