使用Python,OpenCV进行图像哈希

  • 1. 效果图
  • 2. 原理
  • 3. 源代码
  • 参考

这篇博客将介绍图像哈希,感知哈希以及这些算法如何用于(快速)确定图像的视觉内容是否相同或相似。并实现了差异散列,一个常见的感知散列算法(1)非常快,而(2)非常准确。以此来判断图片是否发生变化。

1. 效果图

2. 原理

图像哈希或者感知哈希的步骤是: 基于图像的内容,构建唯一标识输入图像的散列值。
通过利用图像散列算法,可以在恒定的时间内或最差,O(Log n)时间找到近似相同的图像。

  • 为什么传统哈希不起作用

    传统的md5、sha等密码散列算法的本质:更改文件中的单个位会导致不同的哈希。 实质上图像哈希希望只有单个像素变化的,认为图像没有变化,或者图像缩放也认为没有变化;

  • 差异哈希(DHASH)的好处:
    1)输入图像的宽高比更改(由于忽略了纵横比),图像哈希不会改变;
    2)调整亮度或对比度(1)不会改变哈希值或(2)只会稍微改变它,确保散列将靠近;
    3)差异散列非常快且准确;

  • 通常使用 汉明距离 来比较哈希值。两个汉明距离很小的哈希意味着两个散列是相同的,并且两个图像也是相同的/感知相似的。

3. 源代码

# USAGE
# python hash.py --images images# 导入必要的包
from imutils import paths
import argparse
import time
import sys
import cv2# 设置图像散列为8,表示构建8*8=64位哈希值
def dhash(image, hashSize=8):# 缩放输入图像,增加一列以计算水平梯度差值resized = cv2.resize(image, (hashSize + 1, hashSize))# 计算相邻水平梯度列像素差值diff = resized[:, 1:] > resized[:, :-1]# 转换图像差异为hashreturn sum([2 ** i for (i, v) in enumerate(diff.flatten()) if v])# 构建命令行参数及解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--images", required=True,help="dataset of images to search through (i.e., the haytack)")
args = vars(ap.parse_args())# 获取hastach、needle文件图片
print("[INFO] computing hashes for images...")
hashmapsPaths = list(paths.list_images(args["images"]))# 移除文件名中的\
if sys.platform != "win32":hashmapsPaths = [p.replace("\\", "") for p in hashmapsPaths]# 初始化存放图像名及其hash值的map,并计时
hashmaps = {}
start = time.time()# 遍历hashmaps路径
for p in hashmapsPaths:# 从磁盘加载图像image = cv2.imread(p)# 如果图像为None,则跳过if image is None:continue# 转换图像为灰度图,并计算图像hash值image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)imageHash = dhash(image)# 更新hashmaps字典l = hashmaps.get(imageHash, [])l.append(p)hashmaps[imageHash] = l# 展示hash耗时及hashmaps照片数,开始计算needles文件夹的图像hash值
print("[INFO] processed {} images in {:.2f} seconds".format(len(hashmaps), time.time() - start))
print("[INFO] computing hashes for needles...")for k,v in hashmaps.items():print("[INFO] {}: {}".format(k,v))

参考

  • https://www.pyimagesearch.com/2017/11/27/image-hashing-opencv-python/

使用Python,OpenCV进行图像哈希相关推荐

  1. Python+OpenCV:图像修复(Image Inpainting)

    Python+OpenCV:图像修复(Image Inpainting) 理论 Most of you will have some old degraded photos at your home ...

  2. Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features)

    Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features) 理论 We know SIFT us ...

  3. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

  4. Python+OpenCV:图像Shi-Tomasi角点检测器

    Python+OpenCV:图像Shi-Tomasi角点检测器 理论 The scoring function in Harris Corner Detector was given by: Inst ...

  5. Python+OpenCV:图像Harris角点检测(Harris Corner Detection)

    Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...

  6. Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)

    Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization) ############ ...

  7. Python+OpenCV:图像轮廓

    Python+OpenCV:图像轮廓 轮廓是什么? 轮廓可以简单地解释为一条连接所有连续点(沿边界)的曲线,具有相同的颜色和强度. 轮廓线是形状分析.目标检测和识别的重要工具. 为了获得更好的精度,可 ...

  8. Python+OpenCV:图像金字塔

    Python+OpenCV:图像金字塔 理论 通常情况下,我们使用固定大小的图像.但在某些情况下,我们需要处理(相同的)不同分辨率的图像. 例如,当搜索图像中的某些东西时,比如脸,我们不确定该物体在图 ...

  9. Python+OpenCV:图像梯度

    Python+OpenCV:图像梯度(Image Gradients) 理论 OpenCV提供了三种类型的梯度滤波器或高通滤波器,Sobel, Scharr和Laplacian. 1. Sobel和S ...

最新文章

  1. 3.请执行命令取出linux中eth0的IP地址(考试题答案系列)
  2. 《Java程序书面采访猿收藏》之 instanceof的作用是什么
  3. ProjectEuler 005题
  4. CentOS安全配置(转)
  5. 找不到redis得pid文件_电脑提示Windows找不到文件?试试这两个技巧,轻松解决!...
  6. 【项目介绍】搜索引擎
  7. 查看dataloader的大小_一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
  8. 带有Spring Security的OAuth 2.0快速指南
  9. android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法](转)
  10. MAC安装chromedriver碰到的问题:mv: rename chromedriver to /usr/bin/chromedriver: Operation not permitted
  11. Cocos2d-x移植Android 常见问题处理办法
  12. 杭电计算机2012年硕士研究生笔试详解
  13. JAVA创建会话的方法_javaweb学习——会话技术(二)
  14. ios13 无法传参_Win版iOS13越狱最新消息汇总丨拼音字体更新
  15. Linux_无法运行可执行文件
  16. java下载服务器资源
  17. 概率论与数理统计——总结
  18. 【年薪百万之IT界大神成长之路零】年薪百万之IT界大神成长之路
  19. Required request body is missing 错误解决
  20. 建房遮阳标准的计算机方法,农村建房遮阴计算标准,看看怎么计算?

热门文章

  1. Docker核心技术之网络管理
  2. 微信小程序修改整体背景颜色
  3. 多版本Python共存时pip给指定版本的python安装package的方法
  4. 御水.20180506
  5. Leetcode 50. Pow(x, n)
  6. 双击进入物料数据的指定视图
  7. 读取 android的内存、cpu、流量等 信息
  8. firebug 的使用
  9. java 集合 接口_Java集合之Collection接口
  10. mysql不同实例数据同步_两台Mysql数据库数据同步实现实例