matlab雾霾检测代码

本文介绍了如何使用Matlab编程语言对视频(smoke.avi)进行处理,通过HSV色彩空间转换和连通性分析,提取烟雾区域,并将这些区域应用到新的视频中,最后生成包含突出显示烟雾区域的新视频lou_smoking.avi。
摘要由CSDN通过智能技术生成

tic;
clear all;
close all;
clc;
A = aviinfo(‘smoke.avi’);
mov = mmreader(‘smoke.avi’);
LEN = A.NumFrames;%得到视频的帧数
for i = 1 : LEN
b = read(mov, i);
imwrite(b, strcat(‘smoke’, int2str(i), ‘.jpg’), ‘jpg’);
end
for x = 1 : LEN
pic = imread(strcat(‘smoke’, int2str(x), ‘.jpg’));%读入一张图片
pic1 = pic;%pic1中存放的是处理过后的彩色图像
pic_hsv = rgb2hsv(pic);
s = size(pic1);
bw_pic = zeros(s(1), s(2));
for i = 1 : s(1)
for j = 1 : s(2)
if pic_hsv(i, j, 1) > 0.35 && pic_hsv(i, j, 1) < 0.65 && …
pic_hsv(i, j, 2) > 0.06 && pic_hsv(i, j, 2) < 0.3 && …
pic_hsv(i, j, 3) > 0.5 && pic_hsv(i, j, 3) <= 1;
pic1(i, j, 1) = 255;
pic1(i, j, 2 : 3) = 0;
end
if pic1(i, j, 1) == 255 && pic1(i, j, 2) == 0
bw_pic(i, j) = 1;
end
end
end
cov_bw_pic = 1 - bw_pic;
fill_pic = imfill(cov_bw_pic, ‘holes’);
fill_pic1 = 1 - fill_pic;
B_pic = bwboundaries(fill_pic1);%得到的是一个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
%⑤…………………………将小于最大连通区域的连通分量边界赋零
for k = 1 : ss(1)%将小于最大连通区域的连通分量边界赋零,
%其作用就是将其余小的连通分量与边界隔开
Mid = B_pic{k, 1};
ss3 = size(Mid);
if ss3(1) < max
for i = 1 : ss3(1)
fill_pic1(Mid(i, 1), Mid(i, 2)) = 0;
end
end
end
%反转填充
cov_fill_pic1 = 1 - fill_pic1;
A_fill_pic = imfill(cov_fill_pic1, ‘holes’);%进行内部填充,再反变换回来,即得到所要求的区域
A_fill_pic1 = 1 - A_fill_pic;
B_pic1 = bwboundaries(A_fill_pic1);
sss = size(B_pic1);%sss的值就是连通分量的数量
for k = 1 : sss(1)%该循环作用是找到最大区域的边界,然后在原图像的对应位置上赋红
Mid = B_pic1{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
imwrite(pic, strcat(‘lou_smoking’, int2str(x), ‘.jpg’), ‘jpg’);
end
aviobj = avifile(‘lou_smoking.avi’);%将处理后的图片连成视频文件
aviobj.fps = 25;%初始化视频文件的属性
aviobj.Quality = 100;
aviobj.compression = ‘None’;
for i = 1 : LEN
frame = imread(strcat(‘lou_smoking’, int2str(i), ‘.jpg’));
aviobj = addframe(aviobj, uint8(frame));
end
aviobj=close(aviobj);%关闭aviobj的对象
toc;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值