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