基于RGB与HSI颜色模型的图像提取法
现实中我们要处理的往往是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颜色模型的图像提取法的更多相关文章
- 基于OpenCV的火焰检测(三)——HSI颜色判据
上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据--HSI判据. 为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型: HSI颜 ...
- 几种颜色模型(颜色空间):HSV CMYK RGB
RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的. HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. ...
- OpenCV中HSV颜色模型及颜色分量范围
HSV颜色模型 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)..这 ...
- HSV颜色模型
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model). 注意的是OpenC ...
- Python RGB 和HSV颜色相互转换
转自:http://outofmemory.cn/code-snippet/1002/Python-RGB-HSV-color-together-switch Python RGB 和HSV颜色相互转 ...
- 前端需要了解的颜色模型,RGB、HSL和HSV
颜色模型,是用来表示颜色的数学模型.比如最常见的 RGB模型,使用 红绿蓝 三色来表示颜色. 一般的颜色模型,可以按照如下分类: 面向硬件设备的颜色模型:RGB,CMYK,YCrCb. 面向视觉感知的 ...
- 基于Android的rgb七彩环颜色采集器
代码地址如下:http://www.demodashi.com/demo/11892.html 一.前言. 在大学期间,看到这个rgb灯,蛮好奇的,这么漂亮的颜色采集,并且可以同步到设备rbg灯颜色, ...
- 【转载】颜色空间-RGB、HSI、HSV、YUV、YCbCr的简介
转载自缘佳荟的博客. 颜色通常用三个相对独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.而颜色可以由不同的角度,用三个一组的不同属性加以描述,就产生了不同的颜色空间.但 ...
- 【神经网络篇】--基于数据集cifa10的经典模型实例
一.前述 本文分享一篇基于数据集cifa10的经典模型架构和代码. 二.代码 import tensorflow as tf import numpy as np import math import ...
随机推荐
- Java8——Optional
/* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 Op ...
- 循环控制语句if 、for、case、while
if 循环控制(单分支与多分支) (1)单个判断(单分支循环): if [ 条件判断 ]; then 执行动作 fi if [ 条件判断 ]; then 执行动作 else 执行动作 fi 写入tes ...
- Urllib 库使用
什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.request 请求模块 -->用来模拟发送请求 类似于输入网址敲击回车的过程urllib.er ...
- ios、安卓的兼容性
日期转换成时间戳: 安卓下可以使用 Date.parse(new Date('2019-11-18 12:00:00')) 直接转换,结果为 1574049600000 ios下 Date.parse ...
- chrome 模拟发送请求的方法
chrome f12 看到了web页面的请求,有时候想修改一下参数重新执行一下怎么办? 如果是get方法.参数不多可以直接在浏览器中打开.否则post方法参数多时很多人会复制到postman中执行,但 ...
- MACbook关机开机的咚咚咚声音
在MAC系统中,设置→声音设置→内置扬声器静音即可. windows下面没有试过.
- Spring FrameWork体系结构及模块间依赖关系
详见:https://www.cnblogs.com/ywlaker/p/6136625.html 几个图: (Spring3) (Spring4) 由于Spring体系结构庞大且复杂,为了简化开发者 ...
- 百度语音识别在ROS下的应用-导航
先去wiki下载百度的ros语音识别包:http://wiki.ros.org/baidu_speech 里面包含语音识别voice和speak的node节点,不过voice_node里面有一个小的错 ...
- maven setting 配置仓库,pom.xml中repository不起作用
问题描述 最近做java项目,需要使用公司自己搭建的maven仓库,但是有些包公司的仓库中没有,导致下载失败. 项目环境 jdk:1.8 maven:3.5 问题原因分析 maven的setting文 ...
- torch_09_GAN
1.生成对抗网络 让两个网络相互竞争,通过生成网络来生成假的数据,对抗网络通过判别器判别真伪,最后希望生成网络生成的数据能够以假乱真骗过判别器 2.生成模型 就是‘生成’样本和‘真实’的样本尽可能的相 ...