基于聚类的关键帧提取法
      会弹出这几幅关键帧的图像
      程序中的基本思路:
1.以第一帧图像的R,G,B直方图为初始质心,获取第一幅图像的R,G,B三幅图像的直方图,为1*256的矩阵.
2.对比第二帧与第一个聚类质心(开始为第一帧的RGB直方图),若第二帧类似于第一帧(这里比较两个图像的RGB三种质心的距离,根据预先设定的阈值进行判断),第二帧加入第一帧的聚类,同在新加入的图像与初试质心的基础上,生成新的质心,作为与新帧比较的基础。若不类似,则生成新的聚类。下次比较时新的帧将会与所有的聚类的质心进行比较,选择归属的聚类或者生成新的聚类。如此往复,将会生成几个聚类,同时每个帧都会有所归属。

程序是自己在CSDN上下载的,具体在哪里下载的,不是很记得了。

关键帧提取的第一步应该是进行镜头切割。镜头分割,已经写过几种简单的办法了,见CSDN上查找一下https://blog.csdn.net/weixin_43384257/article/details/83538288。镜头分割以后,就要对每一个镜头进行关键帧提取,每个镜头都会提取出来几个关键帧。关键帧提取的代码如下:是在matlab下运行的。

filenames=dir('D:\Documents\MATLAB\K_means_tiqu\airplane/*.jpg');%这个是一个镜头所有帧的存储路径
%file_name = fly-1;
num=size(filenames,1);  %输出filenames中文件图片的个数
key=zeros(1,num);  %一行,num列都是0  [0,0,0,0,0,0,0,0,0,0,0,0,....0,0,0,0]
cluster=zeros(1,num);   %[0,0,0,0,0,0,0,0,0,0,0,0,....0,0,0,0]
clusterCount=zeros(1,num);  %各聚类有的帧数   [0,0,0,0,0,0,0,0,0,0,0,0,....0,0,0,0]
count=0;        %聚类的个数    %threshold=0.75;  %阈值越大帧越多
%airplane这个视频阈值设为0.93比较合适   0.95更好
%0.93
%*********************************************阈值自己设定,看是多少时效果最好******************************************************%
threshold=0.93;  %阈值
centrodR=zeros(num,256);   %聚类质心R的直方图   第一帧图片256个初始化全部为0,第二帧也是,其余帧都是  %%%后面相似度大加入一帧后会对其进行调整
centrodG=zeros(num,256);   %聚类质心G的直方图
centrodB=zeros(num,256);   %聚类质心B的直方图if num==0error('Sorry, there is no pictures in images folder!');
else%令首帧形成第一个聚类img=imread(strcat('airplane/',filenames(1).name));count=count+1;    %产生第一个聚类[preCountR,x]=imhist(img(:,:,1));   %red histogram    得到红色的直方图一共256个数值,每个数值有多少作为直方图的高度[preCountG,x]=imhist(img(:,:,2));   %green histogram[preCountB,x]=imhist(img(:,:,3));   %blue histogramcluster(1)=1;   %设定第一个聚类选取的关键帧初始为首帧  cluster变为了(1,0,0,0,0,......,0,0,0)cluster(1)是改变了第一个元素clusterCount(1)=clusterCount(1)+1;%clusterCount(1)为0,加1,变为1,最终 clusterCount(1)为[1,0,0,0,.....,0,0,0]centrodR(1,:)=preCountR; % centrodR本来是num(帧个数)行,256列,全部为0.。现在第一行为第一帧的红色直方图各个数值的高度centrodG(1,:)=preCountG;centrodB(1,:)=preCountB;for k=2:numimg=imread(strcat('airplane/',filenames(k).name));  %循环读取每一帧,首先是第2帧[tmpCountR,x]=imhist(img(:,:,1));   %red histogram  得到红色分量直方图  第二幅图片的红色直方图[tmpCountG,x]=imhist(img(:,:,2));   %green histogram[tmpCountB,x]=imhist(img(:,:,3));   %blue histogramclusterGroupId=1;  %新定义的一个变量clusterGroupId为1maxSimilar=0;   %新定义,相似度for clusterCountI=1:count          %目前 count为1   定义新变量clusterCountI  I来确定这一帧归属于第一个聚类还是第二个聚类sR=0;sG=0;sB=0;%运用颜色直方图法的差别函数for j=1:256sR=min(centrodR(clusterCountI,j),tmpCountR(j))+sR;%,j从1到256,第一帧中R的所有值256个亮度  以及第二帧的红色直方图所有高度值  进行比较选最小的sG=min(centrodG(clusterCountI,j),tmpCountG(j))+sG;sB=min(centrodB(clusterCountI,j),tmpCountB(j))+sB;enddR=sR/sum(tmpCountR);dG=sG/sum(tmpCountG);dB=sB/sum(tmpCountB);%YUV,persons are sensitive to Yd=0.30*dR+0.59*dG+0.11*dB;  %运用颜色直方图法的差别函数  定义了d  差别函数if d>maxSimilarclusterGroupId=clusterCountI;maxSimilar=d;endendif maxSimilar>threshold%相似度大,与该聚类质心距离小%加入该聚类,并调整质心for ii=1:256    centrodR(clusterGroupId,ii)=centrodR(clusterGroupId,ii)*clusterCount(clusterGroupId)/(clusterCount(clusterGroupId)+1)+tmpCountR(ii)*1.0/(clusterCount(clusterGroupId)+1);centrodG(clusterGroupId,ii)=centrodG(clusterGroupId,ii)*clusterCount(clusterGroupId)/(clusterCount(clusterGroupId)+1)+tmpCountG(ii)*1.0/(clusterCount(clusterGroupId)+1);centrodB(clusterGroupId,ii)=centrodB(clusterGroupId,ii)*clusterCount(clusterGroupId)/(clusterCount(clusterGroupId)+1)+tmpCountB(ii)*1.0/(clusterCount(clusterGroupId)+1);endclusterCount(clusterGroupId)=clusterCount(clusterGroupId)+1;cluster(k)=clusterGroupId;   %第k帧在第clusterGroupId个聚类里面   cluster(3)等于1或者2,,也就是属于第一个聚类或者第二个聚类else%形成新的聚类,增加一个聚类质心count=count+1;clusterCount(count)=clusterCount(count)+1;centrodR(count,:)=tmpCountR;centrodG(count,:)=tmpCountG;centrodB(count,:)=tmpCountB;cluster(k)=count;   %第k帧在第count个聚类里面   否则 cluster(k)就在新建的聚类中endend%至此,所有帧都划进相应的聚类,一共有count个聚类,第k帧在第cluster(k)聚类中%现欲取出每个聚类中离质心距离最近,即相似度最大的作为该聚类的关键帧maxSimilarity=zeros(1,count);frame=zeros(1,count);for i=1:numsR=0;sG=0;sB=0;%运用颜色直方图法的差别函数for j=1:256sR=min(centrodR(cluster(i),j),tmpCountR(j))+sR;%每一帧和聚类质心进行比较,取最小值 sG=min(centrodG(cluster(i),j),tmpCountG(j))+sG;sB=min(centrodB(cluster(i),j),tmpCountB(j))+sB;enddR=sR/sum(tmpCountR);dG=sG/sum(tmpCountG);dB=sB/sum(tmpCountB);%YUV,persons are sensitive to Yd=0.30*dR+0.59*dG+0.11*dB;if d>maxSimilarity(cluster(i))maxSimilarity(cluster(i))=d;frame(cluster(i))=i;endendfor j=1:countkey(frame(j))=1;figure(j);imshow(strcat('airplane/',filenames(frame(j)).name));end
endkeyFrameIndexes=find(key)

但是这种方法的缺点是:每一帧都会和之前所有的聚类中去进行相比较,比如1,2帧是第一个聚类,3,4,5帧是第二个聚类,而第6帧,在进行比较时,会和前两个聚类都进行比较,就有可能导致第6帧划分到第一个聚类,最终导致,视频关键帧的顺序发生乱序。下一篇解决乱序问题。

基于聚类的方法提取关键帧相关推荐

  1. kaggle信用卡欺诈看异常检测算法——无监督的方法包括: 基于统计的技术,如BACON *离群检测 多变量异常值检测 基于聚类的技术;监督方法: 神经网络 SVM 逻辑回归...

    使用google翻译自:https://software.seek.intel.com/dealing-with-outliers 数据分析中的一项具有挑战性但非常重要的任务是处理异常值.我们通常将异 ...

  2. 基于像素聚类的分割方法基于slic的方法_博士论文摘要 | 张荣春:数码影像与TLS点云数据融合提取地质结构面方法研究...

    <测绘学报> 构建与学术的桥梁 拉近与权威的距离 数码影像与TLS点云数据融合提取地质结构面方法研究 张荣春1,2 1.南京邮电大学地理与生物信息学院, 江苏 南京 210023;2.河海 ...

  3. python视频提取关键帧_一种视频关键帧提取算法的制作方法

    本发明属于信息安全技术领域,涉及视频内容信息的提取,具体来说,是一种视频关键帧提取算法. 背景技术: 随着Internet的应用和普及,多媒体信息检索系统对社会各领域产生越来越大的影响.传统的信息检索 ...

  4. ICLR2022系列解读之二:基于自适应邻居发现的人脸聚类的方法 Ada-NETS

    本文解读我们ICLR2022上发表的论文<Ada-NETS:Face Clustering via Adaptive Neighbour Discovery in the Structure S ...

  5. matlab模式识别提取特征向量,一种基于小波特征向量提取的手机检测方法与流程...

    本发明涉及到手机检测领域,尤其涉及到一种基于小波特征向量提取的手机检测方法. 背景技术: 随着保密要求的不断提高,很多场合严禁携带手机.录音笔.录像机等电子产品,亟需一种设备可以检测出该类电子产品.目 ...

  6. 聚类,k-mean方法,基于密度的方法:DBSCAN,孤立点检测——数据分析与R语言 Lecture 10

    聚类,k-mean方法,基于密度的方法:DBSCAN,孤立点检测--数据分析与R语言 Lecture 10 聚类 dist( )函数 各种类与类之间距离计算的方法 动态聚类:K-means方法 kme ...

  7. CV之FR:基于DIY人脸图像数据集(每人仅需几张人脸图片训练)利用Hog方法提取特征和改进的kNN算法实现人脸识别并标注姓名(标注文本标签)—(准确度高达100%)

    CV之FR:基于DIY人脸图像数据集(每人仅需几张人脸图片训练)利用Hog方法提取特征和改进的kNN算法实现人脸识别并标注姓名(标注文本标签)-(准确度高达100%) 目录 基于DIY人脸图像数据集( ...

  8. 客户分群基于聚类方法:KMeans以及GMM(Gaussian Mixture Model )

    客户分群基于聚类方法:KMeans以及GMM(Gaussian Mixture Model ) 多维度客户分群简介 1.1 聚类算法简介 企业在进行客户分析时,往往希望通过了解不同的客户具有什么不同的 ...

  9. 基于聚类的图像分割-Python

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 了解图像分割 当我们在做一个图像分类任务时,首先我们会想从图像中捕 ...

最新文章

  1. python mysql
  2. eclipse自定义快捷键
  3. 康力优蓝发布新品:让AI教育从概念变成现实!
  4. 复杂查询练习_《从零学会SQL:简单查询》第二关 简单查询
  5. 第一次接广告的心得,关于广告我怎么看
  6. Qt Creator支持平台
  7. oracle 抽样_深入理解Oracle动态采样
  8. 二、scrapy爬虫框架——scrapy构造并发送请求
  9. php symfony 安装,Symfony4中文文档: 安装和设置Symfony框架
  10. jmeter java性能_使用JMeter进行性能测试(Java请求)
  11. 百度地图API自定义地图
  12. 开发反应执行阿里云mysql语句报错
  13. TrueCrypt 使用经验[3]:关于加密
  14. Android 设置桌面背景
  15. Java处理多个List集合中对象数据合并处理数据后为同一个List集合对象
  16. vue项目-android版本引入微信录音
  17. [YOLOv7/YOLOv5系列算法改进NO.20]Involution新神经网络算子引入网络
  18. 在Linux中重启Tomcat服务器
  19. 数据结构 | 算法中的卡特兰数的应用
  20. 给图片加水印--手把手教新码农如何把技术变成产品

热门文章

  1. 微信小程序开发常用快捷键
  2. Windows 查看电脑连接的WiFi密码
  3. 美容行业如何提高市场竞争力?
  4. UI界面设计怎么选配色方案,浅色or深色?
  5. 对北斗-GPS定位相关知识的理解
  6. 【mfxp系统】xp与Windows 98电脑互访问题如何解决
  7. 华章计算机祝广大读者“猿”宵节快乐
  8. 2022年二级建造师考试水利水电工程练习题及答案
  9. Bone Collector(骨头收集者)c++(01背包问题)
  10. maatwebsite/excel 3.0版本使用方法