📄 framedif4.m
字号:
%求解视频的帧差分布 (方法四,基于边缘轮廓法检测镜头边界)
%读取视频
clear all;
clc;
tic;%start time
shot=mpgread('video\sport2.m1v',[],'truecolor');%读取视频
%shot=aviread('video\skiing.avi');
frames=size(shot,2);
framedif=zeros(frames,1);
w=size(shot(1,1).cdata,1);
h=size(shot(1,1).cdata,2);
%%%%%初始化第一帧图像%%%%%
gray1=rgb2gray(shot(1,1).cdata);%第一帧图像
%h=fspecial('gaussian');
%gray1=imfilter(gray1,h);
gray1=im2bw(gray1,0.2);
if sum(sum(gray1))==0
bw1=gray1;
else
bw1=edge(gray1,'canny');%%注意
end
%%%获取边缘元素个数%%%%
p1=0;
for j=1:w
for k=1:h
if bw1(j,k)==1
p1=p1+1;
end
end
end
%%%%%%%%膨胀图像%%%%%%%%
% se1 = strel('line',6,0);
% se2 = strel('line',6,90);
se = strel('diamond',6);
%se=strel(ones(6);%周围六个像素内
r1=imdilate(bw1,se);
%%%%%%%%反色%%%%%%%%%%%%
for j=1:w
for k=1:h
if bw1(j,k)==1
r1(j,k)=0;
else
r1(j,k)=1;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%
for i=2:frames
%%%%%%%获取灰度图%%%%%%
gray2=rgb2gray(shot(1,i).cdata);%%%canny 仅支持灰度图,因此先灰度化
%gray2=imfilter(gray2,h);
%%%canny边缘检测%%%%%%%
gray2=im2bw(gray2,0.2);
if sum(sum(gray2))==0
bw2=gray2;
else
bw2=edge(gray2,'canny');%%注意
end
%%%获取边缘元素个数%%%%
p2=0;
for j=1:w
for k=1:h
if bw2(j,k)==1
p2=p2+1;
end
end
end
%%%%%%%%膨胀图像%%%%%%%%
%se=ones(6);%周围六个像素
r2=imdilate(bw2,se);
%%%%%%%%反色%%%%%%%%%%%%
for j=1:w
for k=1:h
if bw2(j,k)==1
r2(j,k)=0;
else
r2(j,k)=1;
end
end
end
%%%%%%%%%%%图像相与并统计消失与新增边缘点的数目%%%%%%%%%%%
out1=0;%上一帧消失的边缘点的数目
in2=0; %下一帧新增的边缘点的数目
for j=1:w
for k=1:h
%%前一帧%%
if bw1(j,k)==1&&r2(j,k)==1
and1(j,k)=1;
else
and1(j,k)=0;
end
%%后一帧%%
if bw2(j,k)==1&&r1(j,k)==1
and2(j,k)=1;
else
and2(j,k)=0;
end
if and1(j,k)==1
out1=out1+1;
end
if and2(j,k)==1
in2=in2+1;
end
end
end
%%%求解ecr%%%%
if p1==0||p2==0
framedif(i,1)=1;
else
framedif(i,1)=max(out1/p1,in2/p2);
end
bw1=bw2;
r1=r2;
p1=p2;
end
plot(framedif);xlabel('帧数'),ylabel('边缘轮廓变化率'),title('视频的边缘变化率分布图');
l=legend('边缘变化率');
box on;
%subplot('position',[0 0 1/3 1]),imshow(imresize(shot(1,1).cdata,[40 60])),xlabel('第1帧');subplot('position',[1/3 0 1/3 1]),imshow(imresize(shot(1,11).cdata,[40 60])),xlabel('第11帧');subplot('position',[2/3 0 1/3 1]),xlabel('第24帧'),imshow(imresize(shot(1,24).cdata,[40 60]));
%subplot('position',[0 0 1/3 1]),imshow(imresize(shot(1,76).cdata,[40 60])),xlabel('第76帧');subplot('position',[1/3 0 1/3 1]),imshow(imresize(shot(1,86).cdata,[40 60])),xlabel('第86帧');subplot('position',[2/3 0 1/3 1]),imshow(imresize(shot(1,99).cdata,[40 60])),xlabel('第99帧'),
%set(gca,'Color','none');
%set(l,'color','none');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -