目录

基本思路

5.1 将视频打散为图片

5.2比较图像相似度

5.2.1 基于相等比较图像相似度

5.2.2 基于numpy计算图片是否相等

5.2.3 基于哈希(以均值哈希算法为例)

5.3 视频截取:ffmpeg

5.4 综合运用

5.4.1练习一

5.4.2练习二


基本思路

1.将视频打散为图片

2.选择合适的方法(相等、numpy、哈希)比较图像相似度

3.根据相似度,去除重复镜头

5.1 将视频打散为图片

其中,vc=cv2.VideoCapture()

参数为0时,即vc=cv2.VideoCapture(0),表示打开笔记本的内置摄像头;

参数为视频文件路径,即vc=cv2.VideoCapture(“../testi.mp4”),为打开视频文件。

代码如下:

import os
import cv2
import subprocessos.chdir(r'D:\pythonclass')#转到目录下
v_path='ghz.mp4'
image_save='./img'#新建一个文件夹用于放生成的图片cap=cv2.VideoCapture(v_path)
frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)#返回帧数
print(frame_count)for i in range(int(frame_count)):_,img=cap.read()img=cv2.cvtColor(img,cv2.cv2.COLOR_BGR2GRAY) #cv2.COLOR_RGBGRAY  cv2.COLOR_BGR2GRAY#大写的都是常量cv2.imwrite('./img/image{}.jpg'.format(i),img)#把i传进{}中

效果如图:

5.2比较图像相似度

5.2.1 基于相等比较图像相似度

涉及函数:operator(标准运算符替代函数)

其中,会用到operator.eq(a,b)。

eq(a, b) 与 a == b 相同。

Operator其他功能参考:operator --- 标准运算符替代函数 — Python 3.10.0 文档

代码如下:

import operator
from PIL import Image
a=Image.open('./img/image0.jpg')
b=Image.open('./img/image0.jpg')
print(a)
out=operator.eq(a,b)
print(out)

5.2.2 基于numpy计算图片是否相等

涉及函数:NumPy 算术函数;any()函数。

①umpy包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。

np.subtract(a,b)表示两个数组相减。

②any() 函数: iterable 中的任何一项为 true或可迭代对象为空,则 any() 函数返回 True,否则返回 False。

元素除了是 0、空、FALSE 外都算 TRUE。

代码如下:

import operator
from PIL import Image
import os
os.chdir(r'D:\pythonclass')a=Image.open('./img/image0.jpg')
b=Image.open('./img/image0.jpg')out=operator.eq(a,b)
print(out)

5.2.3 基于哈希(以均值哈希算法为例)

基本原理:图片包含了不同频率的部分,其中,亮度变化小的是低频成分,反之为高频。低频成品描述的是大范围的信息,高频成片描述的是细节。小图缺乏细节,所以是低频的。

算法基本思路:

1.缩小图片尺寸为8*8

2.转为灰度图

3.计算像素的灰度平均值

4.基于灰度生成hash值

5.将图像分离为RGB三通道,计算每个通道的相似值

6.对比hash值(计算汉明距离,不同位数越少,图片相似度大)

哈希算法参考:哈希算法-图片相似度计算_chenghaoy的博客-CSDN博客_均值哈希算法

代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
import os#均值哈希算法
def aHash(img):#缩放为8*8plt.imshow(img)plt.axis('off')plt.show()img=cv2.resize(img,(8,8))plt.imshow(img)plt.axis('off')plt.show()#转换为灰度图gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)s=0hash_str='' # s为像素和初值为0,hash_str为hash值初值为''#遍历累加求像素和for i in range(8):for j in range(8):s=s + gray[i,j]#求平均灰度avg=s/64#灰度大于平均值为1  相反为0  生成图片的hash值for i in range(8):for j in range(8):if gray[i,j]>avg:hash_str=hash_str+'1'else:hash_str=hash_str+'0'return hash_str# 通过得到RGB每个通道的直方图来计算相似度
def classify_hist_with_split(image1,image2,size=(256,256)):#将图像resize后,分离为RGB三个通道,再计算每个通道的相似值image1 = cv2.resize(image1,size)image2 = cv2.resize(image2,size)plt.imshow(image1)plt.show()plt.axis('off')plt.imshow(image2)plt.show()plt.axis('off')sub_image1=cv2.split(image1)sub_image2=cv2.split(image2)sub_data=0for im1,im2 in zip(sub_image1,sub_image2):sub_data+=calculate(im1,im2)sub_data=sub_data/3return sub_data# 计算单通道的直方图的相似值
def calculate(image1,image2):hist1 = cv2.calcHist([image1],[0],None,[256],[0.0,225.0])hist2 = cv2.calcHist([image2],[0],None,[256],[0.0,225.0])plt.plot(hist1,color="r")plt.plot(hist2,color="g")plt.show()# 计算直方图的重合度degree = 0for i in range(len(hist1)):if hist1[i]!=hist2[i]:degree=degree+(1-abs(hist1[i])-hist2[i])/max(hist1[i],hist2[i])else:degree = degree + 1#统计相似degree = degree / len(hist1)return degree# Hash值对比
def cmpHash(hash1,hash2):n=0print(hash1)print(hash2)# hash长度不同则返回-1代表传参出错if len(hash1)!=len(hash2):#!=不等于return -1#遍历判断for i in range(len(hash1)):# 不相等则n计数+1,n最终为相似度if hash1[i]!=hash2[i]:n=n+1return nimg1 = cv2.imread('./img/image0.jpg')
img2 = cv2.imread('./img/image1.jpg')hash1 = aHash(img1)
hash2 = aHash(img2)
n=cmpHash(hash1,hash2)
print('均值哈希算法相似度:',n)n=classify_hist_with_split(img1,img2)#看的是image0和image1
print('三直方图算法相似度:',n)

效果如图:

此外,还可以对分镜头进行比对,去除重复的镜头,将筛选后的图片置于一个文件夹中。

代码如下:

import os
import cv2
from PIL import Image
os.chdir(r'D:\pythonclass\video')
print(os.getcwd())#for f in os.listdir('./shot'):
for i in range(549):img1 = cv2.imread('./img/image{}.jpg'.format(i))img2 = cv2.imread('./img/image{}.jpg'.format(i+1))hash1 = aHash(img1)hash2 = aHash(img2)n = cmpHash(hash1,hash2)if (n>32):#可通过改变参数,得到不同的镜头数print('均值哈希算法相似度:',n/64)cv2.imwrite('./shot/image{}.jpg'.format(i+1),img2)

效果如图:

可以看到,文件夹中已生成图片 (参数不同,图片数也不同)

5.3 视频截取:ffmpeg

运用ffmpeg截取1min的视频。

在程序框中输入:ffmpeg -i food.mp4 -ss 1 -t 60 -codec copy foodcut.mp4

将截取的视频命名为 原名cut.mp4

效果如图:

5.4 综合运用

在5.3基础上,运用5.1和5.2的方法对所截视频进行处理。

5.4.1练习一

代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
import os#均值哈希算法
def aHash(img):#缩放为8*8plt.imshow(img)plt.axis('off')plt.show()img=cv2.resize(img,(8,8))plt.imshow(img)plt.axis('off')plt.show()#转换为灰度图gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)s=0hash_str='' # s为像素和初值为0,hash_str为hash值初值为''#遍历累加求像素和for i in range(8):for j in range(8):s=s + gray[i,j]#求平均灰度avg=s/64#灰度大于平均值为1  相反为0  生成图片的hash值for i in range(8):for j in range(8):if gray[i,j]>avg:hash_str=hash_str+'1'else:hash_str=hash_str+'0'return hash_str# 通过得到RGB每个通道的直方图来计算相似度
def classify_hist_with_split(image1,image2,size=(256,256)):#将图像resize后,分离为RGB三个通道,再计算每个通道的相似值image1 = cv2.resize(image1,size)image2 = cv2.resize(image2,size)plt.imshow(image1)plt.show()plt.axis('off')plt.imshow(image2)plt.show()plt.axis('off')sub_image1=cv2.split(image1)sub_image2=cv2.split(image2)sub_data=0for im1,im2 in zip(sub_image1,sub_image2):sub_data+=calculate(im1,im2)sub_data=sub_data/3return sub_data# 计算单通道的直方图的相似值
def calculate(image1,image2):hist1 = cv2.calcHist([image1],[0],None,[256],[0.0,225.0])hist2 = cv2.calcHist([image2],[0],None,[256],[0.0,225.0])plt.plot(hist1,color="r")plt.plot(hist2,color="g")plt.show()# 计算直方图的重合度degree = 0for i in range(len(hist1)):if hist1[i]!=hist2[i]:degree=degree+(1-abs(hist1[i])-hist2[i])/max(hist1[i],hist2[i])else:degree = degree + 1#统计相似degree = degree / len(hist1)return degree# Hash值对比
def cmpHash(hash1,hash2):n=0print(hash1)print(hash2)# hash长度不同则返回-1代表传参出错if len(hash1)!=len(hash2):#!=不等于return -1#遍历判断for i in range(len(hash1)):# 不相等则n计数+1,n最终为相似度if hash1[i]!=hash2[i]:n=n+1return nimg1 = cv2.imread('./foodimg/image0.jpg')
img2 = cv2.imread('./foodimg/image1.jpg')hash1 = aHash(img1)
hash2 = aHash(img2)
n=cmpHash(hash1,hash2)
print('均值哈希算法相似度:',n)n=classify_hist_with_split(img1,img2)#看的是image0和image2
print('三直方图算法相似度:',n)import os
import cv2
from PIL import Image
os.chdir(r'D:\pythonclass\video')
print(os.getcwd())
#for f in os.listdir(r'D:\pythonclass\video\danceimg\danceshot'):
for i in range(1616):img1 = cv2.imread('./foodimg/image{}.jpg'.format(i))img2 = cv2.imread('./foodimg/image{}.jpg'.format(i+1))hash1 = aHash(img1)hash2 = aHash(img2)n = cmpHash(hash1,hash2)if (n>28):print('均值哈希算法相似度:',n/64)cv2.imwrite('./foodshot/image{}.jpg'.format(i+1),img2)

参数28时,效果如图:

5.4.2练习二

参数15时,效果如图:可以发现镜头划分较为粗糙

将参数改为12,可以看到效果更好,但也会出现一些相似的镜头

第五节课·基于图像相似度比较分镜头相关推荐

  1. Python软件设计基础 第五节-基于图像相似度比较实现视频分镜

    目录 一.前言 一.基础算法-判断两张图片是否相等/相似 (一)基于相等判断图像是否相同 (二)基于numpy计算图像是否相似 (三)基于哈希判断图像是否相似 (四)基于各种哈希计算图片相似度 1.均 ...

  2. 五节课从零起步(无需数学和Python基础)编码实现AI人工智能框架电子书V1

    五节课从零起步  (无需数学和Python 基础)  编码实现AI 人工智能框架          王  家  林        2018/4/15                          ...

  3. 马建威android视频,5.25春季班高级班第三期第五节课课堂总结

    来源:雪球App,作者: 阿里爸爸,(https://xueqiu.com/4583899269/180867769) 5.25春季班高级班第三期第五节课课堂总结 今天继续由党斐大师给大家带来中炮先锋 ...

  4. 【java】兴唐第十五节课

    知识点: 1.定义包名不能以java.为开头. 2.获取系统时间的方法: 注意: (1) 引入Date类时,引入的是java.util.Date 而不是java.sql.Date(后者是前者的子类). ...

  5. 统计计算第五节课,Mante Calor方法(二)——减小估计量的方差

    这是我上的统计计算课讲的主要内容,写在这可以互相交流,有些地方我不是很理解的会标出来(用加粗斜体*标出),求大佬在留言处表达自己的看法,另外如果有啥问题也可以在留言处留言,如果我看到了会回复 这次的内 ...

  6. ViSP学习笔记(二十五):基于图像的视觉伺服

    开发环境:Ubuntu 18.04 LTS + ROS Melodic + ViSP 3.3.1 文章内容主要参考ViSP官方教学文档:https://visp-doc.inria.fr/doxyge ...

  7. 第四周:基于图像相似度比较的分镜头

    1.把视频打散为图片 首先在操作路径下载视频,然后将视频分帧数导出为图片 #把视频打散为图片 import os import cv2 import subprocessos.chdir('/User ...

  8. 王学岗——H265编码原理详解与码流分析(对应第五节课)

    H264在分辨率高的情况下缺点 1,94年h264开始研制. 2,现在屏幕变的越来越大.假设h264以16X16进行编码,但我们的屏幕宽达到了32000像素.编码一帧画面需要400000个宏块.94年 ...

  9. 语音识别入门第五节:基于GMM-HMM的语音识别系统

    目录 基于孤立词的GMM-HMM语音识别系统 训练 解码 基于单音素的GMM-HMM语音识别系统 音素/词典 训练 解码 基于三音素的GMM-HMM语音识别系统 三音素 决策树 基于孤立词的GMM-H ...

最新文章

  1. Go 学习笔记(82)— Go 第三方库之 viper(解析配置文件、热更新配置文件)
  2. 阿里云物联网平台python开发手册_阿里云物联网平台体验(树莓派+Python篇)
  3. springboot com.mysql.cj.exceptions.CJException: Access denied for user 'root'@'localhost
  4. BigData之matplotlib:爬虫2018年福布斯中国富豪榜进行数据统计分析,大数据告诉你一些不可思议的事情
  5. 【教程】opencv-python+yolov3实现目标检测
  6. MFC下DLL编程(图解)
  7. 阿里妈妈技术团队5篇论文入选 SIGIR 2022!
  8. 计算机的前端总线又称为,《计算机组成原理》复习资料
  9. 同学的博客,没想到也这么多文章。
  10. 02 button的练习
  11. 华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快?
  12. 95-080-044-源码-启动-jobmanager.sh
  13. 服务器网赚项目,草根站长的一个网赚项目的分析和总结
  14. 3dmax:3dmax动画栏(加载动画【IK计算器、约束、变换控制器、参数编辑器、关联参数、骨骼工具】、关键帧动画【修改关键帧、运动面板、曲线编辑器】、控制器动画【控制器指定】)之详细攻略
  15. teraterm linux环境,linux ssh telnet TeraTerm终端中文显示乱码解决方法
  16. java无效的参数_java.sql.SQLException: 调用中无效的参数
  17. 优酷发布2018世界杯战略 视频云将提供全程技术保障
  18. 多糖水凝胶的交联方式及分析方法
  19. Tensorflow (2): tf.slim库解读
  20. ubuntu16.04安装QQ完整版(附网盘资源)

热门文章

  1. 第四范式正式成为OpenI 启智社区成员
  2. 《锋利的 jQuery(第2版)》
  3. OpenCV学习笔记与代码示例(三):张氏标定法标定相机原理及函数详解
  4. 将OGG 进程状态由ABENDED 改成 STOPPED
  5. Zipkin/Brave 整合Spring-MVC 框架实战
  6. VC HID开发笔记
  7. UAP开发步骤详解(很详细)--③单据向导完善
  8. 打开微信显示wifi连接到服务器地址,打开微信就能连接附近wifi,可惜大家都不知道,赶紧告诉家人...
  9. 从此以后都不关我的事
  10. 使用VS2010开发ActiveX(MFC)控件(2)——界面显示