重复图片查找:巧用Python和OpenCV进行图像哈希与汉明距离检测以从海量图片中找出重复图片

news2024/11/13 9:30:50

重复图片查找:巧用Python和OpenCV进行图像哈希与汉明距离检测以从海量图片中找出重复图片

  • 1. 导言
  • 2. 环境准备
  • 3. 图像哈希(pHash)原理
  • 4. 汉明距离原理
  • 5. 代码实现
    • 导入必要的库
    • 图像哈希计算函数
    • 汉明距离计算函数
    • 查找重复图片函数
    • 示例使用

在处理大量图片数据时,重复图片的出现是一个常见的问题。重复图片不仅浪费存储空间,还可能影响数据分析的准确性。本文将介绍如何使用Python和OpenCV库,通过图像哈希(pHash)和汉明距离(Hamming Distance)来检测重复图片。

1. 导言

在大规模图像处理中,重复图片的检测和移除是一个常见的需求。为了高效地实现这一目标,我们可以使用图像哈希算法。图像哈希是一种将图像内容映射到固定长度的二进制字符串的技术,可以用来快速比较图像的相似性。

在本文中,我们将使用感知哈希(pHash)算法来计算图像的哈希值,并通过汉明距离来衡量不同图像哈希值之间的相似性。

2. 环境准备

首先,我们需要确保已经安装了必要的软件和库。本文使用的主要库包括:

  • OpenCV:用于图像处理
  • NumPy:用于数值计算
  • os:用于文件和目录操作
  • collections:用于字典操作

可以使用以下命令安装这些库:

pip install opencv-python numpy

3. 图像哈希(pHash)原理

感知哈希(pHash,Perceptual Hash)是一种基于图像内容特征的哈希算法。它通过以下几个步骤生成图像的哈希值:

  1. 将图像转换为灰度图。
  2. 缩放图像到指定大小(例如8x8或16x16)。
  3. 计算图像像素的平均值。
  4. 将每个像素与平均值比较,大于平均值的像素赋值为1,小于平均值的像素赋值为0。
  5. 将比较结果按顺序连接成一个二进制字符串,即为图像的哈希值。

4. 汉明距离原理

汉明距离(Hamming Distance)用于衡量两个二进制字符串之间的差异。具体来说,汉明距离是两个字符串对应位置上不同字符的个数。例如,字符串“1010”和“1001”的汉明距离为2。

在图像哈希检测中,汉明距离越小,表示图像越相似。

5. 代码实现

导入必要的库

import cv2
import numpy as np
import os
from collections import defaultdict

图像哈希计算函数

该函数用于计算图像的感知哈希值。

def calculate_phash(image_path, hash_size=16):
    # 读取图像并转换为灰度图
    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if image is None:
        raise ValueError(f"Image not found: {image_path}")
    
    # 缩放到指定大小
    image = cv2.resize(image, (hash_size, hash_size))
    
    # 计算平均值
    avg = np.mean(image)
    
    # 生成哈希值
    phash = ''.join(['1' if pixel > avg else '0' for row in image for pixel in row])
    
    return phash

汉明距离计算函数

该函数用于计算两个二进制字符串之间的汉明距离。

def hamming_distance(hash1, hash2):
    return sum(c1 != c2 for c1, c2 in zip(hash1, hash2))

查找重复图片函数

该函数遍历指定文件夹中的所有图片,计算每张图片的哈希值,并根据汉明距离查找重复图片。

def find_duplicate_images(image_folder, hash_size=8, distance_threshold=5):
    phashes = defaultdict(list)
    
    for image_name in os.listdir(image_folder):
        image_path = os.path.join(image_folder, image_name)
        phash = calculate_phash(image_path, hash_size)
        phashes[phash].append(image_name)
    
    duplicates = []
    for hash_values in phashes.values():
        if len(hash_values) > 1:
            duplicates.append(hash_values)
    
    return duplicates

示例使用

下面的代码展示了如何使用上述函数查找指定文件夹中的重复图片。

# 示例使用
image_folder = r'D:\JupyterNotebook\extract_fire_pic_v1'
duplicates = find_duplicate_images(image_folder)

if duplicates:
    for group in duplicates:
        print("Duplicate group:", group)
else:
    print("No duplicates found.")

在此处,将r'D:\JupyterNotebook\extract_fire_pic_v1'替换为你的图片存放文件夹即可。

例如我在r'D:\JupyterNotebook\same_pic'下有如下一些照片:
在这里插入图片描述
通过以上代码运行后,跑车的结果如下:
在这里插入图片描述
可以看到相同的图片已经被分到同一组中去了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1942334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昇思25天学习打卡营第14天|计算机视觉

昇思25天学习打卡营第14天 文章目录 昇思25天学习打卡营第14天FCN图像语义分割语义分割模型简介网络特点数据处理数据预处理数据加载训练集可视化 网络构建网络流程 训练准备导入VGG-16部分预训练权重损失函数自定义评价指标 Metrics 模型训练模型评估模型推理总结引用 打卡记录…

Python机器学习入门:从理论到实践

文章目录 前言一、机器学习是什么?二、机器学习基本流程三、使用Python进行机器学习1.数据读取2.数据规范化3. 数据降维(主成分分析)4. 机器学习模型的选择5. 线性回归模型的实现6. 可视化结果 总结 前言 机器学习是人工智能的一个重要分支&…

RabbitMQ的学习和模拟实现|muduo库的介绍和使用

muduo库 项目仓库:https://github.com/ffengc/HareMQ muduo库 muduo库是什么快速上手搭建服务端快速上手搭建客户端上面搭建的服务端-客户端通信还有什么问题?muduo库中的protobuf基于muduo库中的protobuf协议实现一个服务器 muduo库是什么 Muduo由陈硕大佬开…

无人机之摄影构图指南

一、三分法构图 将画面分为三等分,水平线或地平线通常放在1/3处,使得画面看起来更加舒适。主体放在九宫格四个交点(视觉中心)上,突出视觉中心。 二、对称式构图 将画面左右或上下对等分割,形成呼应&…

HTML:lang属性作用

lang作用 用法常见语言代码优点示例结构效果说明分析HTML 基础结构导航栏内容部分总结 扩展 用法 HTML 文档级别: 在 <html> 标签上使用 lang 属性&#xff0c;指定整个文档的语言。 <!DOCTYPE html> <html lang"en"> <head><meta charse…

(C++) 文件读写基础

文章目录 &#x1f5c2;️前言&#x1f4c4;ref&#x1f4c4;访问标记&#x1f5c3;️流打开模式类型 &#x1f5c2;️Code&#x1f4c4;demo&#x1f4c4;分点讲解&#x1f5c3;️打开/关闭&#x1f5c3;️写&#x1f5c3;️读&#x1f5c3;️状态函数 &#x1f5c2;️END&…

javascript 的执行上下文与作用域

目录 1. 初步了解 上下文&#xff08;context&#xff09;2. 全局上下文(global context)3. 上下文栈 (context stack)4. 作用域链( scope chain)5. 作用域(scope)6. 作用域链增强 1. 初步了解 上下文&#xff08;context&#xff09; 上下文(context) 全称 执行上下文 (execut…

linux中RocketMQ安装(单机版)及springboot中的使用

文章目录 一、安装1.1、下载RocketMQ1.2、将下载包上传到linux中&#xff0c;然后解压1.3、修改runserver.sh的jvm参数大小&#xff08;根据自己服务器配置来修改&#xff09;1.4、启动mqnamesrv &#xff08;类似于注册中心&#xff09;1.5、修改runbroker.sh的jvm参数大小&am…

【Linux】进程信号 --- 信号处理

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

el-table列的显示与隐藏

需求&#xff1a;实现 表字段的显示与隐藏。效果图 代码实现 写在前面 首先 我部分字段有自定义的排序逻辑&#xff0c;和默认值或者 数据的计算 所以是不能简单的使用 v-for 循环column 。然后 我需要默认展示一部分字段&#xff0c;并且 当表无数据时 提示不能 显示隐藏 …

HTTP 缓存

缓存 web缓存是可以自动保存常见的文档副本的HTTP设备&#xff0c;当web请求抵达缓存时&#xff0c;如果本地有已经缓存的副本&#xff0c;就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。 缓存减少了冗余的数据传输缓存环节了网络瓶颈的问题…

学习大数据DAY21 Linux基本指令2

目录 思维导图 搜索查看查找类 find 从指定目录查找文件 head 与 tail 查看行 cat 查看内容 more 查看大内容 grep 过滤查找 history 查看已经执行过的历史命令 wc 统计文件 du 查看空间 管道符号 | 配合命令使用 上机练习 4 解压安装类 zip unzip 压缩解压 tar …

google 浏览器插件开发简单学习案例:TodoList

参考&#xff1a; google插件支持&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/140412993 这里是把前面做的TodoList做成google插件&#xff0c;具体网页可以参考下面链接 TodoList网页&#xff1a; https://blog.csdn.net/weixin_42357472/article/de…

Web前端:HTML篇(一)

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器…

android studio中svn的使用

第一步&#xff0c;建立一个项目。 第二步&#xff0c;share project。 第三步&#xff0c;选择存放的位置&#xff0c;然后添加提交信息&#xff0c;最后点击share。这样就可以在svn上面看到一个空的项目名称。 第四步&#xff0c;看到文件变成了绿色&#xff0c;点击commit图…

驾驭云原生日志洪流:高效分析与管理的策略集

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、日志管理在云原生架构中的重要性 2、云原生环境的特…

Open-TeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…

Java | Leetcode Java题解之第273题整数转换英文表示

题目&#xff1a; 题解&#xff1a; class Solution {String[] singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] t…

Linux下安装Redis(超简单)

1.下载 选着自己需要下载的版本后&#xff0c;右击选择复制链接&#xff0c;然后利用命令进行下载&#xff0c;进入Xshell控制台&#xff0c;输入wget将复制的链接粘帖上&#xff0c;这里我选择的是6.0.6版本。 命令如下&#xff1a; wget https://download.redis.io…

QML学习——Qt Quick Controls 1 Examples Calendar/FileSystemBrowser(九)

02 File System Browser Show: Notes: 使用了自定义的继承自QFileSystemModel的类&#xff0c;在原有的基础上新加了角色(role)&#xff0c;并且重写了QFileSystemModel中的data函数、及角色和字符串描述对应的哈希表&#xff1b; 使用系统的文件资源管理器打开该文件的链接&…