IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 基于视频的相似图片处理[均值哈希算法相似度、三直方图算法相似度] -> 正文阅读

[数据结构与算法]基于视频的相似图片处理[均值哈希算法相似度、三直方图算法相似度]

一.视频分镜处理

操作步骤解释:

1.将视频切割为图片,并写入新建空白文件夹。

2.判断两张图片的相似度(较复杂的数据判断——均值哈希算法相似度、三直方图算法相似度)。

3.遍历视频所有的帧,提取与其他分镜有明显区别的分镜,完成。

代码呈现1:

import os
import cv2
import subprocess
import inspect
import numpy as np

os.chdir("d:\lesson6")

#把视频打散为图片
v_path='video.mp4'
cap=cv2.VideoCapture(v_path)
frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
for i in range(int(frame_count)):
    _,img=cap.read()
    img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imwrite("./pic/{}.jpg".format(i),img)

代码呈现2【均值哈希算法相似度】:?


def aHash(img):
    img=cv2.resize(img,(8,8))#缩放为8*8,便于统一识别
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图
#s为像素和初值为0,hash_str为hash值初值为''
    s=0#数值
    hash_str=""#字符串
#遍历累加求像素和
    for i in range(8):
        for j in range(8):
            s=s+gray[i,j]    #gray[i,j]意味着64个像素值每一块的像素值
#求平均灰度
    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 
                    
def cmpHash(hash1, hash2):
    n = 0
    print(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 + 1
    return n
#让相邻的两张截图进行比较,循环往复
for i in range(1959):
    img1=cv2.imread("./imgs/image{}.jpg".format(i))
    img2=cv2.imread("./imgs/image{}.jpg".format(i+1))
    hash1 = aHash(img1)
    hash2 = aHash(img2)
    n=cmpHash(hash1,hash2)
    if (n>30):    #n值越大,说明两张图的相似度越低
        print('均值哈希算法相似度:', n/64)
        cv2.imwrite("./shot/image{}.jpg".format(i+1),img2)

代码呈现3【三直方图算法相似度】:??

def classify_hist_with_split(image1, image2, size=(256, 256)):
    # 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值
    image1 = cv2.resize(image1, size)
    image2 = cv2.resize(image2, size)
    
    sub_image1 = cv2.split(image1)
    sub_image2 = cv2.split(image2)
    sub_data = 0
    
    for im1, im2 in zip(sub_image1, sub_image2):
        sub_data += calculate(im1, im2)#将r,g,b三个通道数据整合
    sub_data = sub_data / 3
    return sub_data

def calculate(image1, image2):
    hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
    hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
    plt.plot(hist1, color="r")
    plt.plot(hist2, color="g")
    plt.show()
    # 计算直方图的重合度
    degree = 0
    for 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


for i in range(1959):
    img1=cv2.imread("./imgs/image{}.jpg".format(i))
    img2=cv2.imread("./imgs/image{}.jpg".format(i+1))
    n = classify_hist_with_split(img1, img2)
    if n<0.5:
        print('三直方图算法相似度', n)
        cv2.imwrite("./shot1/image{}.jpg".format(i+1),img2)

cv2.calcHist:作用是将图片r,g,b三颜色通道分离,注意:利用cv2.imread()写入图片时,颜色格式顺序为b,g,r.

?cv2.split():输出的是图片每个像素点r,g,b坐标点的三个数组

cv2.imread()读取图片

imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种:

cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。

cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。

cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1

?

二.实验结果测试

操作步骤解释:

1.在ffmpeg命令行利用命令截取1分钟左右的视频

2.分别利用均值哈希算法相似度、三直方图算法相似度两种方法测试视频分镜导出效果(更改n值)

代码1

ffmpeg -i stereotype.mp4 -ss 00:00:50.0 -codec copy -t 60 stereotype2.mp4

其他代码与?“一.视频分镜处理”板块相同,我主要通过改变n值来控制导出的镜头。

【均值哈希算法相似度】当比较的n值设置得越高时,导出的镜头数越少,镜头差别越大。程序运行速度越慢。

?

【三直方图算法相似度】n比较值设置为【0-1】之间,数值越低,表明两截图相似度越低,导出的镜头越少。差别越大。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:11:28  更:2021-10-22 11:11:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:19:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码