一.由来:
根据一则专利复现出来的,原理基本一样,细节上可能有出入
需要达到的目的:
对一段视频中出现的画面,现在需要剔除视频画面中的“相似帧”,也可理解为冗余帧。例如:视屏中为胃镜手术,当探管逐步深入时,画面也会慢慢改变,但是大多数画面是很“相似的”
因此需要将这些“相似的”画面剔除掉。
基本逻辑
前一帧--(比较相似度)--后一帧:若达到“相似度”则剔除后一帧,否则保留后一帧
这里就需要两两比较,逐步剔除。
二.程序构思流程:
对文件夹内的图像归一化(这里归一化可以和原图一样大,此处是方便计算),读取文件夹内的所有图像,第一张和剩下的图像计算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) # 调用函数