【第22期】观点:IT 行业加班,到底有没有价值?

基于OpenCV的火焰检测(四)——RGB与HSI的结合判据

原创 2016年06月02日 11:50:35
    上两篇博文给大家分别介绍了在火焰检测中常用的两种颜色判据——RGB判据和HSI判据,这一篇博文给大家展示一下它们两个单纯结合的效
果,然后介绍一个更强大的结合算法,能够很好地分割出火焰区域。在下篇博文将会在RGB判据以及HSI判据的基础上分别添加更加严格的约束条件,
使得不合理的区域进一步缩小。

    首先,我们尝试一下简单地用上两篇介绍的判据分别提取出来的区域进行与运算,看看效果有没有改善。

    这是我们的测试原图:

这里写图片描述

    这是仅用RGB判据后得出的火焰区域:

这里写图片描述

很明显,得出来的是一个实心的区域,说明RGB判据用来提取完整区域是挺有效果的。

    再来看看仅用HSI判据后得出的火焰区域:

这里写图片描述

这次得出来的就不是一个区域了,而是一个火焰的轮廓,上一篇博文也曾经说过,如果想要得出一个区域,就要适当修改输入的三组阈值参数值,现在
假设我们需要的是火焰的轮廓而不是实心区域,所以仍保留这个效果。

    最后看看两者的与运算,看看有没有什么变化:

这里写图片描述

我们仔细观察一下,可以发现火焰区域变得更细了,比仅用HSI判据实现的效果更加柔和,看上去更加舒服。

    现在我们不再单纯地结合两个颜色判据,而是在原有的RGB判据中添加HSI判据的变种,形成一个强大的颜色判据。该结合判据的算法如下:
    保留RGB判据:
                        R > R_avg              AND
                        R >= G >= B
    添加新的HSI约束条件:
                        S > 0.2                AND
                        S > (255 - R) / 20     AND
                        S >= ((255 - R)*ST / RT
    其中,ST为饱和度阈值,参考范围是55~65;RT为红色分量阈值,参考范围是115~135。

    很明显,我们可以看出结合判据既基本上保留了RGB判据,又保留了HSI判据的可互动修改参数的特点,理论上会比单独使用或单纯结合的效
果要好。

    下面给出结合判据的函数代码:
 int ProcessColorModel(IplImage *RGBimg,IplImage*dst){
    if(RGBimg == NULL || dst == NULL){
        printf("func ProcessColorModel() Error:\n");
        printf("RGBimg == NULL || dst == NULL\n");
        return -1;
    }

    if(RGBimg->nChannels != 3 || dst->nChannels != 1){
        printf("func ProcessColorModel() Error:\n");
        printf("RGBimg->nChannels != 3 || dst->nChannels != 1\n");
        return -1;
    }

    CvSize size = cvGetSize(RGBimg);
    IplImage * pImgFire = cvCreateImage(size, 8, 3);

    cvSet(pImgFire, cvScalar(0, 0, 0));

    int RedThreshold = 115;  //115~135 
    int SaturationThreshold = 55;  //55~65

    for (int j = 0; j < RGBimg->height; j++){
        for (int i = 0; i < RGBimg->widthStep; i += 3){
            uchar B = (uchar)RGBimg->imageData[j*RGBimg->widthStep + i + 0];
            uchar G = (uchar)RGBimg->imageData[j*RGBimg->widthStep + i + 1];
            uchar R = (uchar)RGBimg->imageData[j*RGBimg->widthStep + i + 2];
            uchar maxv = max(max(R, G), B);
            uchar minv = min(min(R, G), B);
            double S = (1 - 3.0*minv / (R + G + B));

            //生成二值图
            if (R > RedThreshold && R >= G && G >= B && S > 0.20 && S > (255 - R) / 20 && S >= ((255 - R)*SaturationThreshold / RedThreshold)){
                pImgFire->imageData[j*RGBimg->widthStep + i + 0] = 255;
                pImgFire->imageData[j*RGBimg->widthStep + i + 1] = 255;
                pImgFire->imageData[j*RGBimg->widthStep + i + 2] = 255;
            }
            else{
                pImgFire->imageData[j*RGBimg->widthStep + i + 0] = 0;
                pImgFire->imageData[j*RGBimg->widthStep + i + 1] = 0;
                pImgFire->imageData[j*RGBimg->widthStep + i + 2] = 0;
            }
        }
    }

    cvCvtColor(pImgFire, dst, CV_BGR2GRAY);
    cvReleaseImage(&pImgFire);

    return 0;
}
    由于只需要使用S分量,不需要使用H和I分量,所以在此并不需要单独写颜色模型转换函数,而只需要在函数里面计算S分量即可。

    最后我们看看效果如何:
    (为了证实算法的强大性,我们来验证两组有干扰物的图片,读者有兴趣可自行验证以前我们使用的那幅图片,在这就不演示了)
    ①:原图

这里写图片描述

    这是一幅有建筑物干扰的图片,建筑物有一点偏向火焰颜色的趋势,那么我们的算法能不能正确提取火焰区域而不提取建筑物呢?下面来检验一下:

这里写图片描述

    显然,基本上没有圈出建筑物,但仍存在一点噪声干扰,读者可以使用我们最开始介绍的图像预处理里面的方法来去除孤立点。

    ②:原图

这里写图片描述

    这是一幅有其他光源干扰的图片,并且火焰的区域很多,那么提取效果如何呢?

这里写图片描述

    显然,我们担心的光源并没有被提取出来,几乎可以完整地提取出全部火焰区域,效果还算不错。

    最后想要说明一点的是,仅仅只有一个判据是不可能达到最优效果的,大家应该尝试结合不同的判据,或许会达到意想不到的效果~

    今天就分享到这里~欢迎大家多来评论,来找出博主可能存在的错误,希望能和各位图像爱好者共同成长~
    那么我们下次见~

下文预告:基于OpenCV的火焰检测(五)——两个颜色模型的主分量判据
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

在VS2015上搭建opencv_3.2.0_vc14

OpenCv安装和使用

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

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

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

OpenCV win10系统下一次性配置Visual Studio 2015(VC14)与OpenCV 3.1

OpenCV win10系统下一次性配置Visual Studio 2015(VC14)与OpenCV 3.1

基于OpenCV的火焰检测(五)——两个颜色模型的主分量判据

这篇将会是最后一篇讨论从RGB空间和HSI空间中提取火焰区域的博文,其中用到技术称为基于颜色模型的主分量判据。听起来好像很高大上, 其实也是一种很简单的判据,下面就带大家了解一下这个判据。 所谓...

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

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

OpenCV学习记录之视频中的火焰检测识别

主要完成两个视频中火焰的检测,主要结合RGB判据和HIS判据,设定合适的阈值条件,检测出火焰对应像素的区域,将原图二值化,经过中值滤波以及数学形态学的膨胀运算等图像处理,消除一些噪声及离散点,连通一些...

背景建模或前景检测(Background Generation And Foreground Detection) 二

转自:http://www.cnblogs.com/xrwang/archive/2010/03/27/BackgroundGenerationAndForegroundDetectionPhase2...

OpenCV小例程——火焰检测(完整代码)

火焰检测小程序 前几天,偶然看到了An Early Fire-Detection Method Based on Image Processing ,The Author is:Thou-Ho (Ch...

基于OpenCV的火焰检测(一)——图像预处理

博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测。在做这个项目的时候,博主参考了很多相关的文献,用了很多种...

OpenCV学习记录之摄像头调用

关于opencv调用摄像头的问题主要是因为摄像头的打开有延时。在显示图像前,要用if语句判断图像是否存在。(否则会报错) 具体的:教程里的源程序,将if条件句里,break去掉,并增加else语句。 ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)