视频关键帧提取之镜头分割matlab代码(绝对帧差法、感知哈希法、图像相关系数法)

!!!下面所有代码都是自己在github上搜到的,作者的名字是卢涛!!!

运行是在matlab下运行的,一共四个脚本文件。
1、视频变成一帧一帧的图片,第一步运行:read_frame
obj = VideoReader('D:\fly.avi');%输入视频位置,自行根据视频位置修改D:\fly.avi

2、第一种方法:绝对帧差法,运行jueduizhencha
NOF=1538;   %图片数量,注意手动修改,根据第一步运行出来的帧总数NOF自行修改
file_path =  'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径,根据第一步运行出来的帧的位置自己修改 

运行结果会显示出来,镜头切换的帧是哪一帧
我感觉对于突变严重的视频检测比较准确,总体来说不是很准确

3、第二种感知哈希法:第一步仍然是运行read_frame,然后运行ganzhihaxi

运行结果会显示出来,镜头切换的帧是哪一帧
比较准确,会有误检

4、图片相关系数法:第一步仍然是运行read_frame,然后运行picture_xiangguanxishu

这三种方法里面最准确的一种方法

将视频读取为一帧一帧的图片

obj = VideoReader('D:\fly.avi');%输入视频位置

NOF=obj.NumberOfFrames;% 帧的总数

mkdir([cd,'/images']);%建立目录

directory=[cd,'/images/'];

for i=1:NOF

Img_I=read(obj,i); %读取视频

imwrite(Img_I,[directory,[num2str(i) '.jpg'];]); %每一帧输出一张jpg

end;

视频变成一帧一帧的图片,第一步运行:read_frame

obj = VideoReader('D:\fly.avi');%输入视频位置,自行根据视频位置修改D:\fly.avi

绝对帧差法镜头分割

%绝对帧间差法:比较相邻图像帧像素的亮度和之差,当大于某个阈值时,则判定发生突变。

NOF=1538; %图片数量,注意手动修改

file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径

img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像

for i=1:NOF-1

image_name_i = strcat(num2str(i),'.jpg'); %图像名

img_i = imread(strcat(file_path,image_name_i)); %读取该图像

image_name_i_plus = strcat(num2str(i+1),'.jpg');% 后一张图像名

img_i_plus = imread(strcat(file_path,image_name_i_plus)); %读取后一张图像

img_diff(i)=norm(double(img_i(:,:,1)-img_i_plus(:,:,1)))+norm(double(img_i(:,:,2)-img_i_plus(:,:,2)))+norm(double(img_i(:,:,3)-img_i_plus(:,:,3))); %计算前后两张图像的帧像素的亮度和之差

end;

Threshold=mean(img_diff)*4; %阈值设定为平均像素差的4倍

for i=2:NOF-2

if(img_diff(i)>img_diff(i-1)&&img_diff(i)>img_diff(i+1)&&img_diff(i)>Threshold) %如果该图像的像素差大于前后两张以及阈值,则判定为镜头切换的帧编号

fprintf('%d\n',i); %输出帧编号

end;

end;

第一种方法:绝对帧差法,运行jueduizhencha

NOF=1538; %图片数量,注意手动修改,根据第一步运行出来的帧总数NOF自行修改

file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径,根据第一步运行出来的帧的位置自己修改

运行结果会显示出来,镜头切换的帧是哪一帧

我感觉对于突变严重的视频检测比较准确,总体来说不是很准确

感知哈希法

%感知哈希法:感知哈希法是用于相似图片搜索的一种快速算法。

NOF=1538; %图像数量

file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径

img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像

Threshold=2; %阈值设定为2

count=zeros(NOF-1,1); %用于记录与后一张图像有多少位是不同的

for i=1:NOF-1

image_name_i = strcat(num2str(i),'.jpg'); %图像名

img_i = imread(strcat(file_path,image_name_i)); %读取该图像

image_name_i_plus = strcat(num2str(i+1),'.jpg');% 后一张图像名

img_i_plus = imread(strcat(file_path,image_name_i_plus)); %读取后一张图像

imbw_i=im2bw(rgb2gray(imresize(img_i,[8,8]))); %将图像转化为64个像素以及64级灰度

imbw_i_plus=im2bw(rgb2gray(imresize(img_i_plus,[8,8]))); %将后一张图像转化为64个像素以及64级灰度

for j=1:8

for k=1:8

if(imbw_i(j,k)~=imbw_i_plus(j,k))

count(i)=count(i)+1; %计算与后一张图像有多少位是不同的

end;

end;

end;

end;

for i=1:NOF-1

if(count(i)>Threshold) %如果count大于阈值,说明与后一张图像差别很大,则判定为镜头切换的帧编号

fprintf('%d\n',i); %输出帧编号

end;

end;

第二种感知哈希法:第一步仍然是运行read_frame,然后运行ganzhihaxi

运行结果会显示出来,镜头切换的帧是哪一帧

比较准确,会有误检

图片相关系数法:

%图片相关系数法:定义两幅图像的相关系数来衡量相邻图像帧的相似性。

NOF=829; %图像数量

file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径

img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像

for i=1:NOF-1

image_name_i = strcat(num2str(i),'.jpg'); %图像名

img_i = imread(strcat(file_path,image_name_i)); %读取该图像

image_name_i_plus = strcat(num2str(i+1),'.jpg');% 后一张图像名

img_i_plus = imread(strcat(file_path,image_name_i_plus)); %读取后一张图像

img_sim(i)=corr2(img_i(:,:,1),img_i_plus(:,:,1))+corr2(img_i(:,:,2),img_i_plus(:,:,2))+corr2(img_i(:,:,3),img_i_plus(:,:,3)); %计算前后两张图像的相似度

img_sim(i)=img_sim(i)/3;

end;

Threshold=0.8; %相似度阈值

for i=1:length(img_sim)

if(img_sim(i)<Threshold) %如果相似度小于阈值,则说明与后一张图像不相似,则判定为镜头切换帧

fprintf('%d\n',i); %输出帧编号

end;

end;

图片相关系数法:第一步仍然是运行read_frame,然后运行picture_xiangguanxishu

这三种方法里面最准确的一种方法

猜你喜欢

转载自blog.csdn.net/weixin_43384257/article/details/83538288
今日推荐