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

重复图片查找:巧用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.mzph.cn/diannao/48991.shtml

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

相关文章

乐鑫AWS IoT ExpressLink方案,简化物联网设备连接AWS IoT服务

在现代科技迅速发展的今天,物联网(IoT)已经成为连接物理世界与数字世界的重要桥梁,越来越多的设备开始接入网络,实现智能化控制。 在这个大背景下,乐鑫携手亚马逊,推出了AWS IoT ExpressLink方…

Linux:Linux发展史

大家好!此篇文章并非技术博文,而是简单了解Linux的时代背景和发展史,只有知其所以然才能让我们更好地让走进Liunx的世界! 一、计算机的发展历史背景 首先我们要知道,早期大多数科技的进步都是以国家的对抗为历史背景的…

Java语言程序设计基础篇_编程练习题**15.17 (几何问题:寻找边界矩形)

**15.17 (几何问題:寻找边界矩形) 请编写一个程序,让用户可以在一个二维面板上动态地增加和移除点,如图15-29a所示。当点加入和移除的时候,一个最小的边界矩形更新显示。假设每个点的半径是 10 像素 解题思路: 这道题可以从编程…

数学建模(4)——支持向量机算法

一、代码示例 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.metrics import clas…

1-如何挑选Android编译服务器

前几天,我在我的星球发了一条动态:入手洋垃圾、重操老本行。没错,利用业余时间,我又重新捣鼓捣鼓代码了。在接下来一段时间,我会分享我从服务器的搭建到完成Android产品开发的整个过程。这些东西之前都是折腾过的&…

站在资本投资领域如何看待分布式光纤传感行业?

近年来,资本投资领域对于分布式光纤传感行业并不十分敏感。这主要是由于分布式光纤传感技术是一个专业且小众的领域,其生命周期相对较长,缺乏爆发性,与消费品或商业模式创新产业有所不同。此外,国内的投资环境也是影响…

谷粒商城实战笔记-42-前端基础-Vue-生命周期和钩子函数

下面是Vue官网关于生命周期及不同阶段的钩子函数的图示。 Vue 实例生命周期是指从一个组件被创建到最终被销毁的整个过程。 在这一过程中,Vue 提供了一系列的“钩子”函数,在生命周期的不同阶段执行自定义的代码。 以下是 Vue 对象生命周期的主要阶段…

图片转换之heic转jpg(使用ImageMagick)

缘由:iphone的图库,用jpg拍照保存后内存占比较大,heic格式会微缩不少。问题来了,电脑不能直接小图预览heic。 分析:现在就是解决小图预览的问题(大图用wps可以看) 解决:查找了一些…

Vue中的diff算法

文章目录 diff算法是什么比较方式源码分析patchpatchVnodeupdateChildren小结Vue3中diff算法优化diff算法是什么 diff算法是一种通过同层的树节点进行比较的高效算法 其有两个特点: 比较只会在同层级进行,不会跨层级比较在dff比较的过程中,循环从两边向中间比较(首位交叉…

基于神经网络的聚类分析

神经网络是一种非常有用的机器学习模型,具有无数的应用。今天,我们将分析一个数据集,看看我们是否可以通过应用无监督聚类技术来查找数据中的模式和隐藏分组,从而获得新的见解。 我们的目标是对复杂数据进行降维,以便…

mysql面试(一)

前言 从今天开始,更新一些mysql的基础知识,面试会遇到的知识点之类的内容。比如四个隔离级别,mvcc机制,三大日志,索引,B树的形成等等,从数据库的底层来剖析索引和树是怎么形成的,以…

接口自动化测试框架实战-0-项目功能概览

熟悉我CSDN的朋友们应该知道,之前已经更新了requests、pytest、allure2、yaml、jenkins、postman等基础知识的合集。相信大家对接口测试已经有了全面的认识,现在应该迫不及待地想要一个实战项目了。接下来的文章中,我们将把这些知识点串联起来…

C++学习笔记02-结构基础(问题-解答自查版)

前言 以下问题以Q&A形式记录,基本上都是笔者在初学一轮后,掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系,也适合做查漏补缺和复盘。 本文对读者可以用作自查,答案在后面&#xff0…

【Linux】HTTP 协议

目录 1. URL2. HTTP 协议2.1. HTTP 请求2.2. HTTP 响应 1. URL URL 表示着是统一资源定位符(Uniform Resource Locator), 就是 web 地址,俗称“网址”; 每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址; URL 的主要由四个部分组成: sche…

学习测试10-3自动化 web自动化

web自动化 chrome驱动下载地址: https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/#stable观察Google版本,下相应的驱动 运行代码试试,成功Google就会弹出 from se…

华为OD机试2024年C卷D卷 - 山脉的个数/攀登者1 (Java)

华为OD机试(C卷D卷)2024真题目录 题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如&#xff…

ARM 单片机裸机任务调度框架

前言: 在没有使用操作系统的情况下,一个合理的裸机任务调度方式,可以更好的提供数据的处理,和用户体验,有多种任务调度的方式。 方案 1: 从上到下的任务调度方式,C语言程序的代码是在main函数…

K8S 上部署 Prometheus + Grafana

文章目录 一、使用 Helm 安装 Prometheus1. 配置源2. 下载 prometheus 包3. 安装 prometheus4. 卸载 二、使用 Helm 安装 Grafana1. 配置源2. 安装 grafana3. 访问4. 卸载 一、使用 Helm 安装 Prometheus 1. 配置源 地址:https://artifacthub.io/packages/helm/pro…

[路由器]IP-MAC的绑定与取消

背景:当公司的网络不想与外部人员进行共享,可以在路由器页面配置IP-MAC的绑定,让公司内部人员的手机和电脑的mac,才能接入到公司。第一步:在ARP防护中,启动IP-MAC绑定选项,必须启动仅允许IP-MAC…

linux、windows、macos清空本地DNS缓存

文章目录 Linux:Windows:macOS: Linux: 对于使用systemd的操作系统(如CentOS 7、Ubuntu 16.04),可以使用以下命令重启systemd-resolved服务来清除缓存: sudo systemctl restart sys…