用python删除文件夹中的重复图片(图片去重)

2023-12-16Python编程
288

下面是详细讲解用Python删除文件夹中的重复图片(图片去重)的完整攻略。

问题描述

在某些应用场景中,我们可能需要对一些文件夹中的图片进行去重操作,即删除那些重复的图片,仅保留一份。这样可以减少存储空间的占用,并且更便于后续的处理。

解决方案

这里我们可以使用Python来实现简便高效的图片去重操作。主要思路是对每个图片计算一个特征值,然后根据特征值来进行比较和去重。

具体来说,我们可以使用OpenCV库中提供的算法来生成每个图片的特征值,然后借助Python的set数据结构来实现去重。这一过程可以通过以下几个步骤来完成:

  1. 导入相应的库文件
import os
import cv2
import hashlib
  1. 定义计算图片的SHA256值的函数
def compute_image_sha256(image_path):
    with open(image_path, "rb") as f:
        image_bytes = f.read()
        sha256 = hashlib.sha256(image_bytes).hexdigest()
    return sha256
  1. 定义计算图片特征值的函数
def compute_image_feature(image_path):
    image = cv2.imread(image_path)
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    sift = cv2.xfeatures2d.SIFT_create()
    key_points, descriptors = sift.detectAndCompute(gray_image, None)
    return descriptors.tobytes()
  1. 遍历文件夹中的所有图片,计算它们的特征值,并用set数据结构来进行去重
def remove_duplicate_images(folder_path):
    feature_set = set()
    for root, dirs, files in os.walk(folder_path):
        for file_name in files:
            file_path = os.path.join(root, file_name)
            try:
                feature = compute_image_feature(file_path)
                if feature not in feature_set:
                    feature_set.add(feature)
                else:
                    os.remove(file_path)
                    print(f"Removed duplicate image: {file_path}")
            except Exception as e:
                print(f"Failed to process image: {file_path} ({e})")

这个函数会遍历指定文件夹中的所有文件,如果是图片文件,就会计算它的特征值,并用set数据结构来判断是否出现过。如果是首次出现,就将特征值加入到set中;否则,就说明这是一张重复的图片,需要将其删除掉。

  1. 调用remove_duplicate_images函数来实现图片去重操作
folder_path = "/path/to/folder"
remove_duplicate_images(folder_path)

在这里,只需要将文件夹的路径传入remove_duplicate_images函数即可开始去重操作。

示例说明

下面是两个示例说明,展示了如何读取图片和如何将结果写入到文件中。

示例一:读取图片并显示

import cv2

image_path = "/path/to/image.jpg"
image = cv2.imread(image_path)
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过调用cv2.imread函数来读取指定路径下的图片文件,然后用cv2.imshow函数来显示这张图片。

示例二:将结果写入到文件中

with open("result.txt", "w") as f:
    for feature in feature_set:
        feature_string = ",".join(str(x) for x in feature)
        f.write(f"{feature_string}\n")

在这个示例中,我们创建了一个名为result.txt的文件,并将去重结果写入到这个文件中。我们可以用for循环来遍历feature_set集合,并使用join函数将特征值转化为字符串,然后用write函数将结果写入到文件中。

总结

通过Python实现图片去重操作可以大大减少存储空间的占用,并更便于后续的处理。具体来说,我们可以使用OpenCV库中提供的算法来生成每个图片的特征值,然后借助Python的set数据结构来实现去重。这一过程可以通过几个简单的步骤来完成,但在实际操作中还需要注意一些细节问题。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103