现实中我们要处理的往往是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. docker 部署appium

    1.docker appium镜像和命令:https://github.com/appium/appium-docker-android 2.启动appium docker run --privile ...

  2. day4_变量和作用域

    全局变量与局部变量: 全局变量: 定义变量时,变量左边没有缩进,就是全局变量,可以被当前py文件的任何地方给引用 局部变量: 有缩进的变量就是局部变量 函数的作用域: def test1(): age ...

  3. Maven仓库与坐标(五)

    一.Maven仓库 存放依赖的一个位置/文件夹/仓库,分为以下几种: 本地仓库 中央仓库 远程仓库 1. 本地仓库 第一次执行maven命令时被创建,maven运行时需要的构件都从本地仓库获取,本地仓 ...

  4. DLinNLP

    2015蒙特利尔深度学习暑期学校之自然语言处理篇 用户1737318 8月3日至8月12日在蒙特利尔举办的深度学习署期学校中,来自不同领域的深度学习顶尖学者 (Yoshua Bengio, Leon ...

  5. 解决 SpringMVC 非spring管理的工具类使用@Autowired注解注入DAO为null的问题

    在SpringMVC框架中,我们经常要使用@Autowired注解注入Service或者Mapper接口,我们也知道,在Controller层中注入service接口,在service层中注入其它的s ...

  6. printkd

    #include <linux/fs.h> #include <asm/uaccess.h> #include <linux/namei.h> #include & ...

  7. 微信小程序之页面打开数量限制

    无论是在小程序还是APP中,打开一个页面其实就是创建了一个新的View对象,一层层叠加的.当点击页面的回退按钮就是把当前页面关闭. 这个过程中会涉及到一个问题,就是打开页面的数量.在某些设计下,比如一 ...

  8. (三)golang--执行流程分析

    XXX.go--go build XXX.go--XXX.exe XXX.go--go run XXX.go 两种方式的区别:(1)如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没g ...

  9. Laravel服务容器的绑定与解析

    本篇文章给大家带来的内容是关于Laravel服务容器的绑定与解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言   老实说,第一次老大让我看laravel框架手册的那天早上,我 ...

  10. Linux : Ubuntu 安装 RabbitMQ

    安装 Erlang: 手动编译(不推荐)http://www.erlang.org/downloads下载源码 如22版本:http://erlang.org/download/otp_src_22. ...