重复图片查找:巧用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.xdnf.cn/news/1486064.html

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

相关文章

C++:内存管理(new,delete)

目录 C/C内存分布 C语言内存管理 C内存管理: new和delete的原理 new delete malloc/free和new/delete的区别 C/C内存分布 在C/C中,都有一块虚拟地址,内部井然有序的将代码分成了几部分,如下表: 栈:…

C++实现LRU缓存(新手入门详解)

LRU的概念 LRU(Least Recently Used,最近最少使用)是一种常用的缓存淘汰策略,主要目的是在缓存空间有限的情况下,优先淘汰那些最长时间没有被访问的数据项。LRU 策略的核心思想是: 缓存空间有限&#xff1…

深入浅出C语言指针(进阶篇)

深入浅出C语言指针(基础篇) 深入浅出C语言指针(进阶篇) 目录 引言 一、指针和数组 1.数组名的理解 2.指针访问数组 3.一维数组传参的本质 二、二级指针 1.二级指针的概念 2.二级指针的内存表示 3.二级指针的解引用 三、字符指针 1.指针指向单个字符 2.指针指向字…

【目标检测】Anaconda+PyTorch配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch关键步骤安装,为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程,为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网:https://www.anaconda.com/ 另外&#…

Golang | Leetcode Golang题解之第278题第一个错误的版本

题目: 题解: func firstBadVersion(n int) int {return sort.Search(n, func(version int) bool { return isBadVersion(version) }) }

Elasticsearch基础(六):使用Kibana Lens进行数据可视化

文章目录 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 二、基础可视化 1、指标可视化 2、垂直堆积条形图 3、表格 三、高级可视化 1、多图层和索引 2、子桶 3、树状图 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 在Kibana主页,单击页面…

vxe-table——实现切换页码时排序状态的回显问题(ant-design+elementUi中table排序不同时回显的bug)——js技能提升

之前写的后台管理系统,都是用的antdelement,table组件中的【排序】问题是有一定的缺陷的。 想要实现的效果: antv——table组件一次只支持一个参数的排序 如下图: 就算是可以自行将排序字段拼接到列表接口的入参中&#xff0c…

Druid【基础 01】是什么+主要特点+设计原则+架构+数据结构(简单入门Druid)

Druid入门 1. 是什么2. 主要特点3. 三个设计原则4. Architecture 架构5. 数据结构5.1 DataSource 结构5.2 Segment 结构 Druid 非中文官网,内容不少且介绍的挺详细的,需要英文阅读能力或者翻译工具进行辅助。 1. 是什么 先看看官网怎么说: A…

请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理

BeanPostProcessor的postProcessBeforeInitialization方法是在bean的依赖注入(即属性填充)完成后,但在bean的初始化回调(如PostConstruct注解的方法或InitializingBean接口的afterPropertiesSet方法)之前被调用的。 具…

证书上的服务器名错误解决方法

方法 win r ,输入mmc 点击文件——>添加/删除管理单元 找到证书——> 添加 根据自己的存放选择存放位置 点击控制台根节点——> 受信任的根证书颁发机构——>导入 若还出现问题,则参考https://blog.csdn.net/mm120138687/article/details/…

立创梁山派--移植开源的SFUD万能的串行 Flash 通用驱动库

SFUD是什么 关于SFUD库的介绍,其开源链接(gitee,github)已经详细的阐述了. 这里是截取自它的一部分介绍: SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SF…

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,其安装后会默认开启ajp连接器,方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和…

【接口自动化_07课_Pytest+Excel+Allure完整框架集成_下】

目标:优化框架场景 1. 生成对应的接口关联【重点】 2. 优化URL基础路径封装【理解】 3. 利用PySQL操作数据库应用【理解】--- 怎么用python连接数据库、mysql 4. 通过数据库进行数据库断言【重点】 5. 通过数据库进行关联操作【重点】 一、接口关联&#xff1a…

MSP430M03507最小系统板的keil环境搭配,用keil编辑ti单片机

转载自嘉立创MSP430M03507开发手册 这篇文章只是因为我的keil版本与嘉立创的不一样,所以添加了我自己遇到的问题解析 先说说为什么要用keil编辑,因为ti单片机自己的ccs编译环境需要对应仿真器,那个加芯片都240了,哪有那么多钱买…

node.js中nodemon : 无法加载和使用问题,这是由于windows安全策略影起的按如下操作即可

1、用管理员权限打开vscode 2、文件终端中打开,输入 Set-ExecutionPolicy -Scope CurrentUser 3、再输入RemoteSigned 4、使用get-ExecutionPolicy查看权限,可以看到变为了RemoteSigned 重启问题解决

MySQL面试索引篇

1、什么是索引? 作为一个数据库,首要任务就是把数据存储好,并快速查询出用户需要的数据,而索引就相当于图书的目录一样,是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 …

TypeScript 教程(九):类型声明文件与异步编程

目录 前言回顾装饰器与高级类型操控1. 类型声明文件a. 什么是类型声明文件(.d.ts)b. 编写和使用类型声明文件 2. 异步编程a. Promise 类型b. async/awaitc. 异步迭代器 3. 并行执行与错误处理a. Promise.allb. Promise.racec. 错误处理 结语 前言 在前几…

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

数学建模(7)——Logistic模型

一、马尔萨斯人口模型 import numpy as np import matplotlib.pyplot as plt# 初始人口 N0 100 # 人口增长率 r 0.02 # 时间段(年) t np.linspace(0, 200, 200)# 马尔萨斯人口模型 N N0 * np.exp(r * t)# 绘图 plt.plot(t, N, labelPopulation) plt.…

图片转pdf的软件有哪些?这几种转换工具了解下

在日常的办公学习中,图片转PDF的需求愈发普遍。不论是工作汇报、学习笔记还是生活点滴,我们都希望将重要的图片内容整理成易于查阅的PDF格式。那么,有哪些软件可以做到将图片转换成PDF格式呢?给大家介绍5种简单好用的转换方法&…