现实中我们要处理的往往是RGB彩色图像。对其主要通过HSI转换、分量色差等技术来提出目标。

RGB分量灰度化:

  RGB可以分为R、G、B三分量。当R=G=B即为灰度图像,很多时候为了方便,会直接利用某个分量来进行灰度化,如下图所示:

    上图中R分量下红色部分明显比其他两幅更偏白;同样地G分量草地较淡,B分量天空较淡。其他部分如灰黑色马路则相差不多。实际中,我们可以根据

  需求有选择地选择分量。

RGB分量差灰度化:

  有时候我们的要求是从图像中提取某种颜色区域,那么最简单的方法就是采用RGB色差。

  例如在花束中提取红色的花瓣,就可以采用R-G分量差(目标为红色,干扰为G分量),或者,在土壤表面提取绿色秧苗,可以采用G-R-B分量差(G占2份,土壤可能

  存在R,B分量干扰),下图为提取结果:

  

  如果遇到更复杂的情况,可以根据目标颜色与干扰颜色设计合适的分量差。

  

HSI分量灰度化:

    H、S、I分别表示色调、饱和度、明度。色调指日常所说的颜色(红,白,黑等),饱和度则表示颜色的鲜艳程度,值越大越鲜艳,明度则是颜色的明亮

  程度。这三种属性可以用两个椎体表示,其中明度是竖直中心轴,在竖直方向上,明度不同;每个明度对应一个横截面,用极坐标表示H,S,H为角度,S为模长。

  HSI模型如图所示:

  

  我们可以将RGB转为HSI,相关公式有很多种,各有特点,下面介绍其中一种:

    rgb_min=min(r,g,b)

    rgb_max=max(r,g,b)

    I=rgb_max

    S=(rgb_max-rgb_min)/rgb_max

    if r==rgb_max

      H=abs(g-b)/(rgb_max-rgb_min)/3

    if g==rgb_max

      H=1/3+abs(r-b)/(rgb_max-rgb_min)/3

    if  b==rgb_max

      H=2/3+abs(r-g)/(rgb_max-rgb_min)/3

  如此计算所得的H范围为[0,1),S范围为[0,1),I范围[0,255]。HSI分量灰度图如下:

  

  明度分量与一般灰度化效果差不多(可能灰度化可能是基于明度的),有时候利用饱和度与色调灰度号的图像进行提取会便利很多,如下图是基于饱和度的二值提取

  (一般如果要基于颜色提取的化采用RGB分量色差比较好,毕竟如果要获取较精准的饱和度信息,所用公式会比上面的复杂):

  

  由于背景的饱和度较低,而目标饱和度高,而且目标由多种颜色组成,这样如果直接基于明度的灰度化不可能提取到整个花束,而通过饱和度提取的效果就非常棒。

  另外,也可以将HSI组合起来使用,使得特征更明显,例如可以用饱和度与色调消除红眼现象,具体基于HSI的算法这里就不探究了!

以上相关matlab仿真测试代码如下:

%RGB分量差提取
imga=imread('flower.jpg');
imgb=imread('soil.jpg');
imga2=uint8(zeros(,));
imgb2=uint8(zeros(,));
for i=:
for j=:
r=imga(i,j,);
g=imga(i,j,);
if (r>g)
imga2(i,j)=uint8(r-g);
else
imga2(i,j)=;
end
end
end for i=:
for j=:
r=imgb(i,j,);
g=imgb(i,j,);
b=imgb(i,j,);
if *uint16(g)>(uint16(r)+uint16(b))
imgb2(i,j)=uint8(*uint16(g)-uint16(r)-uint16(b));
else
imgb2(i,j)=;
end
end
end imga2=imbinarize(imga2,/);
imgb2=imbinarize(imgb2,/); subplot(,,);
imshow(imga);
title('原图');
subplot(,,);
imshow(imga2);
title('R-G分量差提取红色部分'); subplot(,,);
imshow(imgb);
title('原图');
subplot(,,);
imshow(imgb2);
title('G-R-B分量差提取绿色部分');
%RGB转HSI模型
function myhsvdisplay(file)
rgb=imread(file);
[sizex,sizey,~]=size(rgb); hsv_v=uint8(zeros(sizex,sizey));
hsv_s=double(zeros(sizex,sizey));
hsv_h=double(zeros(sizex,sizey));
for i=:sizex
for j=:sizey
r=rgb(i,j,);
g=rgb(i,j,);
b=rgb(i,j,);
rgb_min=min([r,g,b]);
rgb_max=max([r,g,b]);
hsv_v(i,j)=rgb_max;
hsv_s(i,j)=(double(rgb_max)-double(rgb_min))/double(rgb_max);
if r==rgb_max
hsv_h(i,j)=abs( double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double();
elseif g==rgb_max
hsv_h(i,j)=double(/)+abs(double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double();
else
hsv_h(i,j)=double(/)+abs(double(g)-double(b))/(double(rgb_max)-double(rgb_min))/double();
end
end
end subplot(,,);
imshow(rgb);
title('rgb原图'); subplot(,,);
imshow(hsv_v);
title('明度信号'); subplot(,,);
imshow(hsv_s);
title('饱和度信号'); subplot(,,);
imshow(hsv_h);
title('色调信号');
end
%利用饱和度提取
function sbinarize(file)
imga=imread(file);
[~,hsv_s,hsv_v]=rgb2hsv(imga);
sbin=imbinarize(hsv_s,/);
vbin=imbinarize(hsv_v,/);
subplot(,,);
imshow(imga);
title('原图');
subplot(,,);
imshow(sbin);
title('饱和度提取');
subplot(,,);
imshow(vbin);
title('明度提取');
end

   

  

基于RGB与HSI颜色模型的图像提取法的更多相关文章

  1. 基于OpenCV的火焰检测(三)——HSI颜色判据

    上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据--HSI判据. 为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型: HSI颜 ...

  2. 几种颜色模型(颜色空间):HSV CMYK RGB

    RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的. HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. ...

  3. OpenCV中HSV颜色模型及颜色分量范围

    HSV颜色模型 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)..这 ...

  4. HSV颜色模型

    HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model). 注意的是OpenC ...

  5. Python RGB 和HSV颜色相互转换

    转自:http://outofmemory.cn/code-snippet/1002/Python-RGB-HSV-color-together-switch Python RGB 和HSV颜色相互转 ...

  6. 前端需要了解的颜色模型,RGB、HSL和HSV

    颜色模型,是用来表示颜色的数学模型.比如最常见的 RGB模型,使用 红绿蓝 三色来表示颜色. 一般的颜色模型,可以按照如下分类: 面向硬件设备的颜色模型:RGB,CMYK,YCrCb. 面向视觉感知的 ...

  7. 基于Android的rgb七彩环颜色采集器

    代码地址如下:http://www.demodashi.com/demo/11892.html 一.前言. 在大学期间,看到这个rgb灯,蛮好奇的,这么漂亮的颜色采集,并且可以同步到设备rbg灯颜色, ...

  8. 【转载】颜色空间-RGB、HSI、HSV、YUV、YCbCr的简介

    转载自缘佳荟的博客. 颜色通常用三个相对独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.而颜色可以由不同的角度,用三个一组的不同属性加以描述,就产生了不同的颜色空间.但 ...

  9. 【神经网络篇】--基于数据集cifa10的经典模型实例

    一.前述 本文分享一篇基于数据集cifa10的经典模型架构和代码. 二.代码 import tensorflow as tf import numpy as np import math import ...

随机推荐

  1. MySQL内连接、左连接、右连接的使用以及区别

    首先先建两个表,student表和score表 select * from student; student表数据如下: select * from score; score表数据如下:    可以看 ...

  2. Android TextField : set focus + soft input programmatically

    Good sir, try this: edittext.setFocusableInTouchMode(true); edittext.requestFocus(); Im not sure, bu ...

  3. Spring Data JPA整合REST客户端Feign时: 分页查询的反序列化报错的问题

    Type definition error: [simple type, class org.springframework.data.domain.Page]; nested exception i ...

  4. luogu P5605 小 A 与两位神仙 - 原根

    题目传送门 传送门 Subtask 1 直接模拟. Subtask 2 BSGS算法模板. Subtask 3 考虑模 $m$ 的任意一个原根 $g$. 假设 $g^{ra} \equiv x \pm ...

  5. JavaScript 系列--JavaScript一些奇淫技巧的实现方法(三)数字取整,数组求和

    一.前言 简短的sleep函数,获取时间戳:https://www.mwcxs.top/page/746.html 数字格式化 1234567890 --> 1,234,567,890:argr ...

  6. Adams宏导出

    var set var=ip integer_value=1 var set var=macro_name str="" for variable_name=the_macro o ...

  7. Eclipse JAX-RS (REST Web Services) 2.0 requires Java 1.6 or newer

    pom.xml文件中添加: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&l ...

  8. vue+element 给表格添加数据,页面不实时刷新的问题

    由于页面加载时,使用了keep-alive,keep-alive具有数据缓存作用,当在添加页面添加成功时,返回主页面没有立即更新.数据有缓存. 解决办法如下: 将获取数据列表的方法放到activate ...

  9. Charles设置断点- (超详解)

    1.选择你要设置断点的接口 2.右键选择 Breakpoints 3.断点的相关配置, Proxy ——>Breakpoint Settings 5.双击刚刚已经设置的断点接口,进行设置 6. ...

  10. Flask高级

    关于Flask启动,和请求处理 #关于后端服务的启动,无非就是启动实现了WSGI协议的socket #关于flask启动的无非就是下面两段代码 #加载配置,创建Flask对象 app = Flask( ...