上文向大家介绍了如何用最简单的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颜色判据相关推荐

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

    上文跟大家分享了在做火焰检测中常用到的图像预处理方法,从这一篇博文开始,我将向大家介绍如何一步一步地检测出火焰区域.火焰提取要用 到很多判据,今天我要向大家介绍的是最简单的但是很有效的判据--RGB判 ...

  2. python运动目标检测与跟踪_基于OpenCV的运动目标检测与跟踪

    尹俊超,刘直芳:基于 OpenCV 的运动目标检测与跟踪 2011, V ol.32, No.8 2817 0 引 言 运动目标检测跟踪技术在航空航天遥感. 生物医学. 工业 自动化生产. 军事公安目 ...

  3. opencv canny源码解析_行人检测 基于 OpenCV 的人体检测

    原文链接 行人检测 基于 OpenCV 的人体检测 - 热分享​hotdog29.com 在 2019年8月1日 上张贴 由 hotdog发表回复 行人检测 基于 OpenCV 的人体检测 我们都知道 ...

  4. 基于opencv实现人脸检测

    基于opencv实现人脸检测 opencv简述 opencv是一个开源的计算机视觉库,它有着C++,Python,Java等接口,支持Windows,Linux,Mac OS,IOS 和 Androi ...

  5. pythonopencv检测行人_行人检测 基于 OpenCV 的人体检测

    原文链接行人检测 基于 OpenCV 的人体检测 - 热分享​hotdog29.com 行人检测 基于 OpenCV 的人体检测 我们都知道,无论性别,种族或种族如何,我们的身体都具有相同的基本结构. ...

  6. Python基于OpenCV高空抛物检测系统[完整源码&部署教程]

    1.视频演示: [项目分享]Python基于OpenCV高空抛物检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.算法原理: 参考该博客提出的移动侦测法,即是根据 ...

  7. python行人检测_行人检测 基于 OpenCV 的人体检测

    原文链接行人检测 基于 OpenCV 的人体检测 - 热分享​hotdog29.com 行人检测 基于 OpenCV 的人体检测 我们都知道,无论性别,种族或种族如何,我们的身体都具有相同的基本结构. ...

  8. 【零基础跑项目】20代码教你基于opencv的人脸检测

    20代码教你基于opencv的人脸检测

  9. 基于opencv的人脸检测与识别(python)(1)

    基于opencv的人脸检测与识别(python语言)(1) 人脸检测和识别技术就目前而言,已经相对成熟,各类算法层出不穷,这都归功于各位奋斗在一线的大佬的努力(站在巨人的肩膀上的感觉就是爽).本文是参 ...

最新文章

  1. 新手入门之j2me学习方法总结--摘录篇
  2. js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法
  3. python中的成员运算符是干嘛的_在Python中使用成员运算符的示例
  4. 112. 路径总和 golang
  5. CGContext转CC
  6. 职场生活:辞职也有大学问
  7. 神经网络优化(五) - 卷积网络基础
  8. 引用dll文件要提交解决方案
  9. 苹果 SwiftUI 踢馆谷歌 Flutter!
  10. usleep头文件_Linunx的sleep,usleep,select,nonasleep对比与应用
  11. android按钮_Android按钮
  12. 【JS逆向破解】爬虫抓取哦oh漫画实例Java/Python实现
  13. Kvaser—灵活多变的CAN总线接口方案
  14. 2d unity 多物体 射线_Unity3D 之射线检测
  15. 大话 Redis 数据结构
  16. 自学Java软件编程需要哪些基础?
  17. Java 某天的开始时间与结束时间
  18. 7、魔兽世界一种私服搭建服务器mangosZero答疑
  19. UVM中的TLM通信
  20. git下载(无法下载需要授权)

热门文章

  1. Steam CMD是什么?Steam CMD怎么用?
  2. 计算机错误密码118,steam错误代码118 解决方案
  3. ICT是什么?ICT的社会和经济影响
  4. 前端在线预览word,excel,pdf
  5. JavaScript循环语句(二)
  6. 南昌大学《概率论与数理统计》期末考试试卷真题A
  7. Mysql正则匹配某列是否含有手机号
  8. 黑客在 Windows 95 邮件应用中发现彩蛋
  9. Win11修改鼠标样式
  10. 彻底搞懂 RxJava