剔除冗余帧

279 阅读2分钟

一.由来:

根据一则专利复现出来的,原理基本一样,细节上可能有出入
需要达到的目的:
对一段视频中出现的画面,现在需要剔除视频画面中的“相似帧”,也可理解为冗余帧。例如:视屏中为胃镜手术,当探管逐步深入时,画面也会慢慢改变,但是大多数画面是很“相似的”
因此需要将这些“相似的”画面剔除掉。
基本逻辑
前一帧--(比较相似度)--后一帧:若达到“相似度”则剔除后一帧,否则保留后一帧
这里就需要两两比较,逐步剔除。

二.程序构思流程:

对文件夹内的图像归一化(这里归一化可以和原图一样大,此处是方便计算),读取文件夹内的所有图像,第一张和剩下的图像计算cosin值,大于0.5的删除(这里大家可以自行设定阈值),第二张和剩余的计算cosin值,大于0.5的删除,直至最后一张(这里的计算相似度可以替换为其它) demo:\

# 敲的比较急

import os

from numpy import average, linalg, dot

from PIL import Image

def get_thumbnail(image, size=(480, 480), greyscale=False):

    image = image.resize(size, Image.ANTIALIAS)

    if greyscale:

        image = image.convert('L')

    return image

def image_similarity_vectors_via_numpy(image1, image2):

    image1 = get_thumbnail(image1)

    image2 = get_thumbnail(image2)

    images = [image1, image2]

    vectors = []

    norms = []

    for image in images:

        vector = []

        for pixel_tuple in image.getdata():

            vector.append(average(pixel_tuple))

        vectors.append(vector)

        norms.append(linalg.norm(vector, 2))

    a, b = vectors

    a_norm, b_norm = norms

    res = dot(a / a_norm, b / b_norm)

    return res

def Img_Mapping(image1, image2, file_name, dir_list, other_img_message):  # 这个可以替换

    cosin = image_similarity_vectors_via_numpy(image1, image2)  # 获取两张图的cosin值

    cosin = round(cosin, 3)

    print(cosin)

    if cosin > 0.50:

        os.remove(os.path.join(path, file_name))

        dir_list.remove(other_img_message)

def found_same_img_2(path):

    dir_list = []  # 创建一个空列表

    num_path = len(str(path))

    for img_name in os.listdir(path):

        img_dir = path + img_name      # 拼接好每个照片的绝对路径

        dir_list.append(img_dir)        # 生成一个列表

    print(dir_list)

    print('共:', len(dir_list), '张')  # 返回一共有多少张照片

    for No, img_message in enumerate(dir_list):

        img = Image.open(img_message)

        i = 0

        print(img_message)

        file_names = img_message[num_path:]  # 改

        print(file_names)

        for other_img_message in dir_list[No+1:]:

            i += 1

            other_img = Image.open(other_img_message)# 获取另外一张照片的信息

            file_name = other_img_message[num_path:]

            print(file_name)

            Img_Mapping(img, other_img, file_name, dir_list, other_img_message)

        print('还剩多少次比较:', i, '次')    # 还剩多少次

if __name__ == '__main__':

    path = 'C:/Users/kiven/Desktop/frame/i/'  # 改

    found_same_img_2(path)    # 调用函数