【烟雾检测】基于matlab背景模糊模型视频烟雾检测【含Matlab源码 153 期】

322 阅读6分钟

一、案例简介

1 引言 目前烟雾检测绝大多数还是采用感烟、感温、感光以及复合型检测器,这些检测器是依靠检测燃烧过程中的副产物(烟雾粒子、温度变化等)来检测烟雾的,因此只能在离火焰和烟雾源较近的地方才能快速有效的发挥探测作用,对于大的空间或者户外场所,其检测的可靠性较低。 为了提高检测烟雾的实时性和可靠性,2009年左右国内外的一些学者致力于应用图像处理技术进行烟雾检测的研究。B Ugur Toreyin等人提出了基于小波的视频烟雾检测技术,该方法假设摄像机静止不动,烟雾出现使背景景物边缘模糊,在小波域上表现为高频能量降低。 而根据烟雾自身的特征——背景模糊性、扩散性、主方向角性等,基于摄像头不动的检测模型又有很多种方法,但是本人在比较了各种方法的实现的难易程度、检测的准确度等几个方面后,认为背景模糊性即简便、易于理解,且又不失准确度,因此我采用了背景模糊性这单一特征进行深入研究。 但是,该算法的缺点是烟雾检测的前提条件是背景图像中必须有较强的边缘和纹理成分,从而限制了该算法的应用范围。

2 背景模糊模型 2.1 基于均值背景模型提取背景 2.1.1 均值背景模型 平均背景模型是将运动目标看作为噪声,用累加平均的方法消除之。利用运动目标运行一段时间的序列图像进行平均而得到背景图像。 公式为: 在这里插入图片描述 2.1.2 实现过程 均值背景模型实现比较简单,需要一帧一帧读取每一帧图像,然后对每一帧图像相应位置的像素点进行求和取平均。本实验中用了一个三维的矩阵mat(x,y,k)来存储每一帧图像的灰度值,其中k是固定值,可以是整个视频,也可以是固定一段时间内的序列图像。

对比两幅图我们可以看出,由于烟雾底部的运动特点很低,因此并没有被作为噪声平均掉,但是基本提取了除去烟雾以外的背景,这对于背景模糊烟雾检测模型来说,这个背景已经足够了,后续我们可以用其它方法进行改进,目前这个方法较为简便。

2.1.3 均值背景模型特点 均值背景模型是一种简单、计算速度快但对环境光照变化和背景的多模态性比较敏感的背景建模算法。 在实际应用中,往往是图像中的某些区域有亮度高的目标,而某些区域有亮度低的运动目标经过,通过平均法得到的背景图像就会出现亮暗分布不均匀的区块。另外,该算法得到的背景图像受运动目标数量的影响比较大。 因此,背景提取是该实验后续可以改进的地方之一。

2.2 背景模糊检测 2.2.1 判别依据 研究表明,烟雾在一般情况下时部分地遮挡其它物体,在空间域表现为背景变模糊,在频率域表现为高频信号衰减;而非烟雾图像则通常是完全遮挡背景。依据烟雾这一特点,我们可以利用二维离散小波变换提取烟雾图像背景纹理,对纹理变模糊的特性进行判别,从而检测出烟雾的存在。

2.2.2 小波变换 小波变换的主要特点是通过变换能够充分突出问题某些方面的特征,能对时间(空间)频率进行局部化分析,通过伸缩平移运算对信号进行多尺度细化,最终达到高频处时间细分,低频处频率细分的结果。 而一幅图像经过二维离散小波变换,可分解为四个部分:一幅低频(cA)分量子图像和三幅高频分量子图像。其中,三幅高频分量子图像包含了水平方向(HL)、竖直方向(LH)和对角方向(HH)的纹理信息。当图像中有烟雾出现时,通常情况会使这三幅高频分量子图像的能量值减小。 设wn(x,y)表示由三幅高频分量子图像的能量值之和构成的一幅复合图像: 在这里插入图片描述 (1) 将复合图像分解成为大小为(K1,K2)的子块,第i个图像子块的能量ei(l1,l2)为: 在这里插入图片描述 式中:Ri为复合图像wn(x,y)中大小为(K1,K2)的第i个子块;(l1,l2)表示能量子块在复合图像中的相应位置。本文采用块的大小为4x4。 对当前图像经小波变换后的局部高频能量值与相应位置的背景图像经小波变换后的局部高频能量值进行比较,如果在(l1,l2)处的子块能量值ei(l1,l2)被降低,那么就意味着当前图像的纹理或边缘不再像背景图像中那么尖锐,对应图像块有可能出现烟雾。 为了提高识别率,设定两个阈值0 < T1 < T2 < 1,本实验取T1 = 0.6 、T2 = 0,如果图像中出现烟雾导致小波高频能量减少,则ei(l1,l2)应满足: T2 * ei(l1,l2) < ei(l1,l2) < T1 * ei(l1,l2) (3)

式中的ei(l1,l2)表示由背景图像构成的复合图像在(l1,l2)处的子块能量值。将满足式(3)的能量子块内的像素值设置为0,即HL(l1,l2) = 0 、LH(l1,l2) = 0、HH(l1,l2) = 0、cA(l1,l2) = 0。然后在通过小波反变换还原出原图像,此时原图像缺失了被识别为烟雾区域的像素值,接着通过构造图像的二值图,取反,补全‘空洞’(‘holes’),找到最大的连通区域即为真正的烟雾区域。

二、部分源代码

tic;
clear all;
close all;
clc;

rmdir('result_img','s');
mkdir('result_img');

LEN = Bg_make; %要处理的图片

times = 0;
hwait=waitbar(0,'');
display('图像正在处理中,请稍后...');
for x = 1 : LEN 
    times = times + 1;   str=['正在处理',num2str(LEN),'张图像中......',num2str(round(x*100/LEN)),'%'];
    hbar = waitbar(times/LEN,hwait,str);
    set(findobj(hbar,'type','patch'), ...
        'edgecolor','w','facecolor','g');
    if x == LEN 
        waitbar(times/LEN,hwait,'即将完成');
    end

    X = rgb2gray(imread('bg_img\bg.jpg')); %读取背景图片
    pic = imread(strcat('image\smoke', int2str(x), '.jpg'));  %读取目标图片
    
    Y = rgb2gray(pic);  %目标图片转换为灰度图

    [cA,cH,cV,cD]=dwt2(X,'db1');    %对背景图像进行小波变换
                                    %cA低频分量,cH水平方向分量,cV垂直方向分量,cD斜对角方向分量
    [cA1,cH1,cV1,cD1]=dwt2(Y,'db1');%对目标图像进行小波变换  

    ss = size(cH);  %小波变换后图像大小
    
    w = zeros( ss(1),ss(2) );   %背景图像小波变换后的能量矩阵
    w1 = zeros( ss(1),ss(2) );  %目标图像小波变换后的能量矩阵
    t1 = 0;   t2 = 0.6; %两个阈值t1,t2-------------------------+++++++++++++++++
    %构建复合图像,并比较它们的值
    for i=1:ss(1)
        for j=1:ss(2)
            w(i,j) = cH(i,j)^2 + abs(cV(i,j))^2 + cD(i,j)^2;    %背景复合图像
            w1(i,j) = cH1(i,j)^2 + abs(cV1(i,j))^2 + cD1(i,j)^2;%目标复合图像
        end
    end
    wd = Divide_mat(w,4);   wd1 = Divide_mat(w1,4);
    s = size(wd);   %分块后矩阵大小
    ss = size(wd{1,1}); %小块大小
    for n=1:s(1)
        for m=1:s(2)

            w_tmp = 0;
            w_tmp1 = 0;
            for i=1:ss(1)
                for j=1:ss(2)
                    w_tmp = w_tmp + wd{n,m}(i,j);   %背景图像子块能量
                    w_tmp1 = w_tmp1 + wd1{n,m}(i,j);%目标图像子块能量 
                end   
            end
            for i=1:ss(1)
                for j=1:ss(2)
                    if( t1*w_tmp<w_tmp1 && w_tmp1<t2*w_tmp ) %根据阈值比较它们的值
                        cH1( i+ss(1)*(n-1),j+ss(2)*(m-1) ) = 0;
                        cV1( i+ss(1)*(n-1),j+ss(2)*(m-1) ) = 0;
                        cD1( i+ss(1)*(n-1),j+ss(2)*(m-1) ) = 0;
                        cA1( i+ss(1)*(n-1),j+ss(2)*(m-1) ) = 0;
                    end
                end
            end

        end
    end
    Y_i = idwt2(cA1,cH1,cV1,cD1,'db1');
%     figure(1); imshow(Y_i,[]); %------------

    sY = size(Y_i);  %转化为二值图像
    for i=1:sY(1)
        for j=1:sY(2)
            if(Y_i(i,j)~=0)
                Y_i(i,j) = 1;
            end
        end
    end
    bw_pic = Y_i;
    cov_bw_pic = 1 - bw_pic;    %反转1次,为了去除连通区域内的黑色像素值(即0矩阵)
    fill_pic = imfill(cov_bw_pic, 'holes');

    %以下都是对 其 二值图像进行处理,即对烟雾的连通区域赋红值,且下面默认的是最大连通区域为烟雾区域
    B_pic = bwboundaries(fill_pic); %得到的是一个P×1的单元
    ss = size(B_pic);        %ss的值就是连通分量的数量
    ss1 = size(B_pic{1, 1}); %ss1是一个大小为m×2的矩阵
    max = ss1(1);
    for i = 2 : ss(1)        %找到最大的连通区域的边界总个数
        ss2 = size(B_pic{i, 1});
        if ss2(1)> max
            max = ss2(1);
        end
    end

    sss = size(B_pic);%sss的值就是连通分量的数量
    for k = 1 : sss(1)%该循环作用是找到最大区域的边界,然后在原图像的对应位置上赋红
        Mid = B_pic{k};%Mid是一个m×2的矩阵,m就是边界点的数量
        %ss4(1)表示边界点的数量,Mid(i, 1)和Mid(i, 2)表示边界点的坐标
        ss4 = size(Mid);
        if ss4(1) == max
            for i = 1 : ss4(1)
                pic(Mid(i, 1), Mid(i, 2), 1) = 255; %相应位置只保留红色分量+++++++
                pic(Mid(i, 1), Mid(i, 2), 2:3) = 0;
            end
        end
    end 
%     figure(2);  imshow(pic); %用于观察生成的检测烟雾图----------------
    imwrite(pic,strcat('result_img\smoking_detection', int2str(x), '.jpg'), 'jpg');  %把图片重新合成jpg
end
close(hwait);

Make_avi(LEN); %avi视频制作

toc;
display('完成!');                    

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本 2014a

2 参考文献 [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020. [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013. [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013. [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.