基于OpenCV的火焰检测(三)——HSI颜色判据
上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据——HSI判据。为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型:HSI颜色模型用H、S、I三参数描述颜色特性,其中:H表示颜色的色调,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等。H的单位是°,代表与红轴的角度。
S表示颜色的饱和度,纯光谱色是完全饱和的,加入白光会稀释饱和度。饱和度越大,颜色看起来就会越鲜艳。I对应成像亮度和图像灰度。HSI模型的建立基于两个重要的事实: ① I分量与图像的彩色信息无关;② H和S分量与人感受颜色的方式是紧密相联的。这些特点使得HSI模型非常适合彩色特性检测与分析。对比一下RGB和HSI模型:
得出由RGB模型转化为HSI模型的公式:
假设R、G、B分量已经归一化到[0,1],那么求出来的S分量和I分量的值也会被归一化到[0,1]。当S分量为0的时候,对应的H分量也应该为0。用OpenCV1.0可以根据上面的公式和条件写出模型转化函数的代码:
int cvBGR2HSI(IplImage*img_bgr, IplImage*img_hsi){if (img_bgr == NULL || img_hsi == NULL){printf("func cvBGR2HSI Error:\n");printf("img_bgr == NULL || img_hsi == NULL\n");return -1;}if (img_bgr->nChannels != 3 || img_hsi->nChannels != 3){printf("func cvBGR2HSI Error:\n");printf("img_bgr->nChannels != 3 || img_hsi->nChannels != 3\n");return -1;}double eps = 1.111e-016;double pi = 3.1416;double num = 0;double den = 0;double theta = 0;double R, G, B, H, S, I;for (int i = 0; i < img_bgr->height; i++){uchar*ptr1 = (uchar*)(img_bgr->imageData + i*img_bgr->widthStep);uchar*ptr2 = (uchar*)(img_hsi->imageData + i*img_hsi->widthStep);for (int j = 0; j < img_bgr->width; j++){R = double(ptr1[3 * j + 2]) / 255.0;G = double(ptr1[3 * j + 1]) / 255.0;B = double(ptr1[3 * j + 0]) / 255.0;num = 0.5*((R - G) + (R - B));den = sqrt((R - G)*(R - G) + (R - B)*(G - B));theta = acos(num / (den + eps));H = theta;if (B>G){H = 2 * pi - H;}H = H / (2 * pi);num = min(min(R, G), B);den = R + G + B;if (den < eps){den = eps;}S = 1 - 3 * num / den;if (S < eps){H = 0;}I = (R + G + B) / 3.0;ptr2[3 * j + 0] = H * 360;ptr2[3 * j + 1] = S * 255;ptr2[3 * j + 2] = I * 255;}}return 0;
}
在代码中要注意的是在OpenCV中RGB三通道的排列顺序:先存放B分量,再存放G分量,最后才是R分量,这与MATLAB里面的规则是不同的。有了模型转化函数之后,我们就可以在HSI色彩模型内使用HSI判据了。HSI判据很简单,也很直观,它的规则是每个分量设定两个阈值,满足
阈值条件的置1,不满足的置0。具体表达式如下:H_min < H < H_max ANDS_min < S < S_max ANDI_min < I < I_max在OpenCV1.0中可以轻松写出上面的代码:
int cvHSI_CHK(IplImage*img_hsi, IplImage*hsi_chk, int H_min, int H_max, int S_min, int S_max, int I_min, int I_max){if (img_hsi == NULL || hsi_chk == NULL){printf("func cvHSI_CHK Error:\n");printf("img_hsi == NULL || hsi_chk == NULL)\n");return -1;}if (img_hsi->nChannels != 3 || hsi_chk->nChannels != 1){printf("func cvHSI_CHK Error:\n");printf("img_hsi->nChannels != 3 || hsi_chk->nChannels != 1)\n");return -1;}CvSize size = cvGetSize(img_hsi);IplImage*H = cvCreateImage(size, 8, 1);IplImage*S = cvCreateImage(size, 8, 1);IplImage*I = cvCreateImage(size, 8, 1);IplImage*mask = cvCreateImage(size, 8, 1);cvSplit(img_hsi, H, S, I, NULL);cvCmpS(H, H_min, mask, CV_CMP_GE);cvCmpS(H, H_max, H, CV_CMP_LE);cvMul(H, mask, H);cvCmpS(S, S_min, mask, CV_CMP_GE);cvCmpS(S, S_max, S, CV_CMP_LE);cvMul(S, mask, S);cvCmpS(I, I_min, mask, CV_CMP_GE);cvCmpS(I, I_max, I, CV_CMP_LE);cvMul(I, mask, I);cvMul(H, S, H);cvMul(H, I, hsi_chk);cvConvertScale(hsi_chk, hsi_chk, 1.0 / 255); cvReleaseImage(&H);cvReleaseImage(&S);cvReleaseImage(&I);cvReleaseImage(&mask);return 0;
}
根据实验经验,博主给出一组参考阈值:H_min = 0 H_max = 60 S_min = 20 S_max = 100I_min = 100 I_max = 255参考上面给出的色相环可以轻松设定H分量的两个阈值,如果是想要检测其他颜色的火焰,可以根据需要做修改。S分量的阈值较小,这与火焰所处的环境有关,若是在露天较明亮的地方检验,则需要调低一点;若在室内较暗的地方检验,则需要调高一点。I分量的阈值较大,依据这么一个先验知识:火焰是会发光的。最后,我们代入参考阈值检验一下图片看看效果如何:
我们可以看出,火焰的基本轮廓都提取出来了。若大家想要把整个区域都提取出来,可以自行尝试其它阈值。今天就分享到这里~欢迎大家多来评论,来找出博主可能存在的错误,希望能和各位图像爱好者共同成长~那么我们下次见~下文预告:基于OpenCV的火焰检测(四)——RGB与HSI的结合判据
基于OpenCV的火焰检测(三)——HSI颜色判据相关推荐
- 基于OpenCV的火焰检测(二)——RGB颜色判据
上文跟大家分享了在做火焰检测中常用到的图像预处理方法,从这一篇博文开始,我将向大家介绍如何一步一步地检测出火焰区域.火焰提取要用 到很多判据,今天我要向大家介绍的是最简单的但是很有效的判据--RGB判 ...
- python运动目标检测与跟踪_基于OpenCV的运动目标检测与跟踪
尹俊超,刘直芳:基于 OpenCV 的运动目标检测与跟踪 2011, V ol.32, No.8 2817 0 引 言 运动目标检测跟踪技术在航空航天遥感. 生物医学. 工业 自动化生产. 军事公安目 ...
- opencv canny源码解析_行人检测 基于 OpenCV 的人体检测
原文链接 行人检测 基于 OpenCV 的人体检测 - 热分享hotdog29.com 在 2019年8月1日 上张贴 由 hotdog发表回复 行人检测 基于 OpenCV 的人体检测 我们都知道 ...
- 基于opencv实现人脸检测
基于opencv实现人脸检测 opencv简述 opencv是一个开源的计算机视觉库,它有着C++,Python,Java等接口,支持Windows,Linux,Mac OS,IOS 和 Androi ...
- pythonopencv检测行人_行人检测 基于 OpenCV 的人体检测
原文链接行人检测 基于 OpenCV 的人体检测 - 热分享hotdog29.com 行人检测 基于 OpenCV 的人体检测 我们都知道,无论性别,种族或种族如何,我们的身体都具有相同的基本结构. ...
- Python基于OpenCV高空抛物检测系统[完整源码&部署教程]
1.视频演示: [项目分享]Python基于OpenCV高空抛物检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.算法原理: 参考该博客提出的移动侦测法,即是根据 ...
- python行人检测_行人检测 基于 OpenCV 的人体检测
原文链接行人检测 基于 OpenCV 的人体检测 - 热分享hotdog29.com 行人检测 基于 OpenCV 的人体检测 我们都知道,无论性别,种族或种族如何,我们的身体都具有相同的基本结构. ...
- 【零基础跑项目】20代码教你基于opencv的人脸检测
20代码教你基于opencv的人脸检测
- 基于opencv的人脸检测与识别(python)(1)
基于opencv的人脸检测与识别(python语言)(1) 人脸检测和识别技术就目前而言,已经相对成熟,各类算法层出不穷,这都归功于各位奋斗在一线的大佬的努力(站在巨人的肩膀上的感觉就是爽).本文是参 ...
最新文章
- 新手入门之j2me学习方法总结--摘录篇
- js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法
- python中的成员运算符是干嘛的_在Python中使用成员运算符的示例
- 112. 路径总和 golang
- CGContext转CC
- 职场生活:辞职也有大学问
- 神经网络优化(五) - 卷积网络基础
- 引用dll文件要提交解决方案
- 苹果 SwiftUI 踢馆谷歌 Flutter!
- usleep头文件_Linunx的sleep,usleep,select,nonasleep对比与应用
- android按钮_Android按钮
- 【JS逆向破解】爬虫抓取哦oh漫画实例Java/Python实现
- Kvaser—灵活多变的CAN总线接口方案
- 2d unity 多物体 射线_Unity3D 之射线检测
- 大话 Redis 数据结构
- 自学Java软件编程需要哪些基础?
- Java 某天的开始时间与结束时间
- 7、魔兽世界一种私服搭建服务器mangosZero答疑
- UVM中的TLM通信
- git下载(无法下载需要授权)