Python-计算md5值对图片去重

MD5简介

MD5 即 Message-Digest Algorithm 5(信息-摘要算法5)。摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。MD5 是从MD2、MD3 和 MD4 发展而来的一种加密算法,其主要通过采集文件的信息摘要,以此进行计算并加密。通过MD5算法进行加密,文件就可以获得一个唯一的 MD5 值,这个值是独一无二的,就像我们的指纹一样。如果任何人对文件做了任何改动,其 MD5 值也就是对应的“数字指纹”都会发生变化。

图片去重实例

我们可以计算图片的 md5 值。若几张图片完全相同,则其 md5 值也完全相同,此时可以根据 md5 值是否相同来对图片进行去重处理。

以电脑F盘找中 images 文件夹为例,对其各个子文件夹内的图片进行去重在这里插入图片描述

Python程序

Python 的 hashlib 提供了常见的摘要算法,如MD5,SHA1等。

import os
from hashlib import md5

def main():
    path = 'F:/images'
    f = open('F:/images/md5.txt', 'w')

    list = []

    list1 = []

#得到所有图片的路径,加到列表list1中
    root, dirs, files = next(os.walk(path))
    for i in range(len(dirs)):
        file = os.listdir(path + '/' + dirs[i])
        for j in range(len(file)):
            line = path + '/' +dirs[i] + '/' + str(file[j])
            list1.append(line)

#计算每张图片的md5值,并将图片路径与其md5值整合到列表list中
    for n in range(len(list1)):
        hash = md5()
        img = open(list1[n], 'rb')
        hash.update(img.read())
        img.close()
        list2 = [list1[n], hash.hexdigest()]
        f.write(str(list2)+'\n')
        list.append(list2)

#两两比较md5值,若相同,则删去一张图片
    m = 0
    while m < len(list):
        t = m + 1
        while t < len(list):
            if list[m][1] == list[t][1]:
                os.remove(list[t][0])
                del list[t]
            else:
                t += 1
        m += 1

if __name__ == '__main__':
    main()
去重结果

计算的每张图片 md5 值

重复图片已去除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
直接对某一文件夹内的图片进行去重

#得到所有图片的路径,加到列表list1中
    root, dirs, files = next(os.walk(path))
    for i in range(len(dirs)):
        file = os.listdir(path + '/' + dirs[i])
        for j in range(len(file)):
            line = path + '/' +dirs[i] + '/' + str(file[j])
            list1.append(line)

将上述代码改为以下代码即可

root, _, files = next(os.walk(path))
    for i in range(len(files)):
        line = path + '/' + str(files[i])
        list1.append(line)
实例展示

对一个文件夹 images11 中的图片去重
在这里插入图片描述
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值