python查找重复图片并删除(图片去重)

  

Python查找重复图片并删除(图片去重)

1. 简介

在使用计算机存储图片的时候,往往会遇到大量的图片需要存储。但是很多时候,我们会发现有些图片是相同的,却被存储了多次。这样不仅浪费了硬盘的空间,而且也不方便图片查找和管理。因此,我们需要一种方式来对图片进行去重。

Python是强大的编程语言,它提供了各种各样的库,可以帮助我们实现各种功能,包括图片去重。在本文中,我们将介绍一种使用Python查找重复图片并删除的方法。

2. 实现步骤

2.1 安装必要的库

首先,我们需要安装必要的Python库:Pillow。Pillow是Python中一个强大的图像处理库,支持图像格式转换,图像过滤,图像增强等功能。我们可以使用下面的命令来安装Pillow:

pip install Pillow

2.2 查找重复图片

接下来,我们需要写一个Python脚本来查找重复图片。我们可以使用以下步骤:

  1. 遍历所有的文件夹和文件,获取所有的图片文件路径
  2. 对于每个图片文件,计算图片的哈希值
  3. 将每个图片的哈希值组成一个列表
  4. 比较哈希值列表,找到重复的图片

下面是一个示例代码,用于遍历一个文件夹中的所有文件,并获取图片文件路径:

import os

def get_image_files(path):
    # 遍历文件夹,获取所有的图片文件路径(jpg、png、bmp等)
    image_files = []
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith('.jpg') or file.endswith('.png') or file.endswith('.bmp'):
                image_file = os.path.join(root, file)
                image_files.append(image_file)
    return image_files

下面是一个示例代码,用于计算一个图片的哈希值:

from PIL import Image
import imagehash

def get_image_hash(image_path):
    # 计算图片的哈希值
    with open(image_path, 'rb') as f:
        image = Image.open(f)
        image_hash = imagehash.phash(image)
    return str(image_hash)

下面是一个示例代码,用于将所有图片的哈希值组成一个列表:

def get_image_hashes(image_files):
    # 将所有图片的哈希值组成一个列表
    image_hashes = []
    for image_file in image_files:
        image_hash = get_image_hash(image_file)
        image_hashes.append(image_hash)
    return image_hashes

下面是一个示例代码,用于比较哈希值列表,找到重复的图片:

def find_duplicate_images(image_files):
    # 查找重复的图片
    image_hashes = get_image_hashes(image_files)
    unique_hashes = set(image_hashes)
    print('Total images:', len(image_files))
    print('Unique images:', len(unique_hashes))
    for hash_value in unique_hashes:
        if image_hashes.count(hash_value) > 1:
            print('---------------------------------------')
            print('Duplicate images found for:', hash_value)
            for i in range(len(image_hashes)):
                if image_hashes[i] == hash_value:
                    print(image_files[i])

2.3 删除重复图片

最后,我们需要修改上面的代码,以便删除重复的图片。在发现重复图片时,我们可以将其中一个图片删除,以保留另一个图片。下面是一个示例代码,用于删除图片:

import os

def delete_image(image_file):
    # 删除指定的图片文件
    os.remove(image_file)

接下来,我们可以修改上面的代码,以便删除重复的图片:

def delete_duplicate_images(image_files):
    # 删除重复的图片
    image_hashes = get_image_hashes(image_files)
    unique_hashes = set(image_hashes)
    print('Total images:', len(image_files))
    print('Unique images:', len(unique_hashes))
    for hash_value in unique_hashes:
        if image_hashes.count(hash_value) > 1:
            print('---------------------------------------')
            print('Duplicate images found for:', hash_value)
            for i in range(len(image_hashes)):
                if image_hashes[i] == hash_value:
                    print(image_files[i])
                    delete_image(image_files[i])

3. 示例说明

3.1 示例1

假设我们有一个文件夹,其中包含以下文件:

- images
  - image1.jpg
  - image2.jpg
  - image3.jpg
  - image4.jpg

其中,image1.jpg和image2.jpg是相同的图片,image3.jpg和image4.jpg是不同的图片。

我们可以使用以下代码来查找并删除重复的图片:

image_files = get_image_files('images')
delete_duplicate_images(image_files)

在运行后,我们将得到以下输出:

Total images: 4
Unique images: 3
---------------------------------------
Duplicate images found for: 4227c0b003030303
images/image2.jpg
images/image1.jpg

其中,'4227c0b003030303'是重复图片的哈希值。我们可以看到,该方法成功地找到了image1.jpg和image2.jpg是相同的图片,并删除了其中一个。

3.2 示例2

假设我们有一个文件夹,其中包含以下文件:

- images
  - image1.jpg
  - image2.jpg
  - image3.jpg
  - image4.png

其中,image1.jpg和image2.jpg是相同的图片,image3.jpg和image4.png是不同的图片,且格式不同。

我们可以使用以下代码来查找并删除重复的图片:

image_files = get_image_files('images')
delete_duplicate_images(image_files)

在运行后,我们将得到以下输出:

Total images: 4
Unique images: 3
---------------------------------------
Duplicate images found for: 4227c0b003030303
images/image2.jpg
images/image1.jpg

其中,'4227c0b003030303'是重复图片的哈希值。我们可以看到,该方法成功地找到了image1.jpg和image2.jpg是相同的图片,并删除了其中一个。虽然image3.jpg和image4.png是不同的图片,但是由于它们的格式不同,因此不会被视为重复图片。

相关文章