def remove_simillar_picture_by_perception_hash(path): img_list = os.listdir(path) hash_dic = {} hash_list = [] count_num = 0 for img_name in img_list: try: img = cv2.imread(os.path.join(path, img_name)) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) count_num+=1 print(count_num) except: continue img = cv2.resize(img,(8,8)) avg_np = np.mean(img) img = np.where(img>avg_np,1,0) hash_dic[img_name] = img if len(hash_list)<1: hash_list.append(img) else: for i in hash_list: flag = True dis = np.bitwise_xor(i,img) if np.sum(dis) < 5: flag = False os.remove(os.path.join(path, img_name)) break if flag: hash_list.append(img)
时间: 2024-04-16 15:24:54 浏览: 51
您已经添加了计算哈希值的部分,并使用感知哈希算法对图片进行了处理。在代码中,您将图片调整为8x8像素大小,并将其转换为灰度图像。然后,计算了灰度图像的平均像素值,并根据平均值对图像进行二值化处理。
随后,您创建了一个字典`hash_dic`来存储图像文件名与对应的哈希值。同时,使用列表`hash_list`来存储已处理过的哈希值。
在对每个图像进行处理时,您遍历了`hash_list`中的哈希值,并使用异或操作计算与当前图像哈希值的差异。如果差异小于阈值(这里是5),则将该图像视为重复,并从路径中删除。否则,将该图像的哈希值添加到`hash_list`中。
这样,通过比较哈希值的差异,您可以实现基于感知哈希算法的去重操作。请注意,这种方法对于近似相似的图片可能会有一定误差,因此阈值的选择需要根据具体情况进行调整。另外,如果删除图片后,需要更新`img_list`列表中的文件名,否则可能会出现错误。
相关问题
def remove_simillar_picture_by_perception_hash(path): img_list = os.listdir(path) hash_dic = {} hash_list = [] count_num = 0 for img_name in img_list: try: img = cv2.imread(os.path.join(path, img_name)) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) count_num+=1 print(count_num) except: continue
这段代码看起来是用来根据感知哈希算法(perception hash)去除相似图片的。它通过遍历指定路径下的图片文件,并使用OpenCV库加载和处理图片。然后,将每个图片转换成灰度图像(使用`cv2.cvtColor`函数),并计算感知哈希值。
然而,在您提供的代码中,缺少了计算哈希值的部分。感知哈希算法通常包括以下步骤:
1. 调整图片的尺寸为固定大小,例如8x8像素。
2. 将图片转换为灰度图像。
3. 计算灰度图像的平均像素值。
4. 遍历所有像素点,将每个像素点与平均值进行比较,将大于平均值的像素点标记为1,小于平均值的像素点标记为0。
5. 将所有标记得到的二进制位串连接起来,形成感知哈希值。
您需要在代码中添加计算感知哈希值的部分,然后将哈希值存入`hash_list`列表或`hash_dic`字典中,并在遍历图片时进行去重操作。
def remove_simillar_image_by_ssim(path): img_list = os.listdir(path) img_list.sort() hash_dic = {} save_list = [] count_num = 0 for i in range(len(img_list)): try: img = cv2.imread(os.path.join(path, img_list[i])) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.resize(img,(256, 256)) count_num+=1 except: continue if count_num==1: save_list.append(img_list[i]) continue elif len(save_list) <5: flag = True for j in range(len(save_list)): com_img = cv2.imread(os.path.join(path,save_list[j])) com_img = cv2.cvtColor(com_img,cv2.COLOR_BGR2GRAY) com_img = cv2.resize(com_img,(256,256)) sim = compare_ssim(img,com_img) if sim > 0.4: os.remove(os.path.join(path,img_list[i])) flag = False break if flag: save_list.append(img_list[i]) else
这段代码使用了结构相似性指数(SSIM)来去除相似图片。SSIM是一种用于测量两幅图像结构相似度的指标。
在代码中,首先对指定路径下的图片进行排序,并创建了一个哈希表`hash_dic`和一个保存列表`save_list`。然后,通过遍历图片列表,加载、处理和调整每个图片的尺寸。
在处理每个图片时,首先判断是否为第一张图片。如果是,将其加入到保存列表中。如果不是第一张图片,则遍历保存列表中的图片,并使用`compare_ssim`函数计算当前图片与保存列表中每张图片的SSIM值。
如果找到了与当前图片相似度高于0.4的图片,就将当前图片删除。否则,将其加入到保存列表中。
需要注意的是,在代码的最后一行缺少了处理在没有相似图片时的情况,您可以根据需求进行补充。
这段代码可以帮助您通过SSIM指标去除相似图片,但需要注意SSIM阈值的选择,以及在删除图片后更新图片列表的问题。
阅读全文