Python查找重复图片并删除(图片去重)
1. 简介
在使用计算机存储图片的时候,往往会遇到大量的图片需要存储。但是很多时候,我们会发现有些图片是相同的,却被存储了多次。这样不仅浪费了硬盘的空间,而且也不方便图片查找和管理。因此,我们需要一种方式来对图片进行去重。
Python是强大的编程语言,它提供了各种各样的库,可以帮助我们实现各种功能,包括图片去重。在本文中,我们将介绍一种使用Python查找重复图片并删除的方法。
2. 实现步骤
2.1 安装必要的库
首先,我们需要安装必要的Python库:Pillow。Pillow是Python中一个强大的图像处理库,支持图像格式转换,图像过滤,图像增强等功能。我们可以使用下面的命令来安装Pillow:
pip install Pillow
2.2 查找重复图片
接下来,我们需要写一个Python脚本来查找重复图片。我们可以使用以下步骤:
- 遍历所有的文件夹和文件,获取所有的图片文件路径
- 对于每个图片文件,计算图片的哈希值
- 将每个图片的哈希值组成一个列表
- 比较哈希值列表,找到重复的图片
下面是一个示例代码,用于遍历一个文件夹中的所有文件,并获取图片文件路径:
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是不同的图片,但是由于它们的格式不同,因此不会被视为重复图片。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python查找重复图片并删除(图片去重) - Python技术站