I = imread('火焰2.jpg');
figure
mainfc;
subplot(231)
imshow(I)
title('原图')
% 获取尺寸
[M,N,C]=size(I);
%% HSV颜色分割部分
% 原图像转换为HSV模型
hsv=rgb2hsv(I);
subplot(232)
imshow(hsv)
title('hsv分量图')
% 分别获取H、S、V分量
h=hsv(:,:,1);
s=hsv(:,:,2);
v=hsv(:,:,3);
%% 分割出火焰部分
% OTSU获取阈值分割
thr_sourse=graythresh(v);
if thr_sourse<0.3
thr=thr_sourse*2.8;
elseif thr_sourse<0.4;
thr=thr_sourse*1.8;
else
thr=thr_sourse*1.5;
end
% 分割
I_bw_v=im2bw(v,0.8);
subplot(233)
imshow(I_bw_v)
title('分割图')
%% 形态学处理部分
% 设置去噪参数
set_area=50;
% 去噪
I_bw=bwareaopen(I_bw_v,set_area);
subplot(234)
imshow(I_bw)
title('去噪图')
% 填充
I_bw=imfill(I_bw,'holes');
% 膨胀操作,参数10
SE=ones(12);
I_bw=imdilate(I_bw,SE);
% 填充
I_bw=imfill(I_bw,'holes');
subplot(235)
imshow(I_bw)
title('填充')
% 设置去噪参数
set_area=10000;
% 去噪
I_bw=bwareaopen(I_bw,set_area);
%% 定位和识别部分
% 显示
subplot(236)
imshow(I);
title('标定')
hold on
% 定位和标定
STATS = regionprops(I_bw,'basic');
% 标定每个对象
for j=1:length(STATS)
% 标记
rectangle('Position',STATS(j).BoundingBox,'EdgeColor','g','LineWidth',4);
end