又是时隔多日了,日子过的有点荒废了,必须在这里找点存在感了,最近为了优化项目中的流程和算法,接触到了哈希算法,这个跟深度学习没什么关系,我用这个仅仅是来判断图片的正反,最后把图片归一化到同一个方向,可能还有更简单的方法,不过,无所谓了,能解决项目上的事情就先分享出来。

所以我们先来看看哈希算法是个什么东西

对我来说哈希算法分为三个:1.均值哈希算法  2.差值哈希算法  3感知哈希算法。我们分别来研究研究。

1.均值哈希算法

算法步骤:

1.读取图像后转换为灰度图

2.resize成8*8大小的图像

3.求这个64个点的均值,也就是说累加起来再除以64

4.再拿这个8*8的举证和这个均值做比较,大于均值的地方为1,小于均值的地方为0

5.得到一个8*8或者说是64个值的0和1的数据,这个数据也就是我们这个图片的哈希编码

2.差值哈希算法

1.读取图像后转换为灰度图

2.resize成9*8大小的图像,需要注意的是这里是9*8

3.每行前一个像素大于后一个像素为1,相反为0,生成哈希,这里也可以看出,为什么要resize成9*8

4.得到一个8*8或者说是64个值的0和1的数据,这个数据也就是我们这个图片的哈希编码

3.感知哈希算法

1.读取图像后转换为灰度图

2.resize成32*32,其实这里也可以resize成32*32,我也是试过128*128,256*256,结果上的差异并不大

3.对这个32*32的图像做一个离散余弦变化,别吃惊,离散余弦变换你要是不知道是什么的话,就当成一个变换函数好了,因为我也暂时还没搞清楚,等我搞清楚了,我再回来更新,哈哈哈

4.离散余弦变换后,我们去这个举证的前8行8列

5.这样我们又得到一个8*8或者说是64个值的0和1的数据,这个数据也就是我们这个图片的哈希编码

然后,我们就可以根据两张图片的哈希编码来判断两张图片的相似度了。判断方法是就是拿哈希编码对应位置比对,不相同就+1,所以如果最后的值越大,就表示两个图片越不相似。

4.实战

我们根据这个,原来进行一个判断图片正反的实例,我们采用感知哈希算法来做。

先说一下这个的逻辑,然后再上代码

逻辑:1.选取文件夹中的一张图作为模板图1,然后将这张图旋转180°,作为模板图2。

2.计算这两张模板图的哈希编码。

3.遍历这个文件夹下其他图片,然后计算哈希编码,那计算出来的哈希编码和两张模板图的哈希编码求相似度

4.这样,我们这个文件夹里的图片就可以分为两个反方向了,上效果图看看

和模板1相似的图片

和模板2相似的图片

可以看到明显是分出来的。

我们上代代码吧

# -*- coding: utf-8 -*-
# @Time : 2022/7/21 17:01
# @Author : guligedong
# coding: utf-8import operator
import timefrom PIL import Image
import numpy as np
import cv2
import os
import shutil"""图片处理: 图片截取、图片相似度比对、哈希算法比对"""def cmp_pic(pic1, pic2):"""比对图片相似度@param pic1:@param pic2:@return:"""a = Image.open(pic1)b = Image.open(pic2)return operator.eq(a, b)def image_interception(image):"""图片截取@param image:  目标图片@return:"""img = cv2.imread(image)print('图片{}高度、宽度、通道数为:{}'.format(image, img.shape))  # (1792, 828, 3) 高度、宽度、通道数cropped = img[170:650, 0:900]  # 裁剪坐标为[y0:y1, x0:x1]cv2.imwrite(image, cropped)return imagedef aHash(img):"""均值哈希算法@param img:@return:"""# 缩放为8*8img = cv2.resize(cv2.imread(img), (8, 8))# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# s为像素和初值为0,hash_str为hash值初值为''s = 0hash_str = ''# 遍历累加求像素和for i in range(8):for j in range(8):s = s + gray[i, j]# 求平均灰度avg = s / 64# 灰度大于平均值为1相反为0生成图片的hash值for i in range(8):for j in range(8):if gray[i, j] > avg:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_strdef dHash(img):"""差值感知算法@param img:@return:"""# 缩放8*8img = cv2.resize(cv2.imread(img), (9, 8))# 转换灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hash_str = ''# 每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(8):for j in range(8):if gray[i, j] > gray[i, j + 1]:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_strdef pHash(img,rotate_flag=False):"""感知哈希算法(pHash)@param img:@return:"""# 缩放32*32img = cv2.resize(cv2.imread(img), (265, 256))  # , interpolation=cv2.INTER_CUBICif rotate_flag:img = cv2.rotate(img,cv2.ROTATE_180)# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将灰度图转为浮点型,再进行dct变换dct = cv2.dct(np.float32(gray))# opencv实现的掩码操作dct_roi = dct[0:8, 0:8]hash = []avreage = np.mean(dct_roi)for i in range(dct_roi.shape[0]):for j in range(dct_roi.shape[1]):if dct_roi[i, j] > avreage:hash.append(1)else:hash.append(0)return hashdef classify_hist_with_split(image1, image2, size=(256, 256)):"""通过得到RGB每个通道的直方图来计算相似度@param image1:@param image2:@param size:@return:"""# 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值image1 = cv2.resize(cv2.imread(image1), size)image2 = cv2.resize(cv2.imread(image2), size)sub_image1 = cv2.split(image1)sub_image2 = cv2.split(image2)sub_data = 0for im1, im2 in zip(sub_image1, sub_image2):sub_data += calculate(im1, im2)sub_data = sub_data / 3# print(sub_data)return sub_datadef calculate(image1, image2):"""计算单通道的直方图的相似值@param image1:@param image2:@return:"""hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])# 计算直方图的重合度degree = 0for i in range(len(hist1)):if hist1[i] != hist2[i]:degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))else:degree = degree + 1degree = degree / len(hist1)return degreedef cmpHash(hash1, hash2):"""Hash值对比@param hash1:@param hash2:@return:"""n = 0# hash长度不同则返回-1代表传参出错if len(hash1) != len(hash2):return -1# 遍历判断for i in range(len(hash1)):# 不相等则n计数+1,n最终为相似度if hash1[i] != hash2[i]:n = n + 1return nif __name__ == '__main__':base_folder = r'C:\Users\59436\Desktop\0720output\DB30723CAS_Q1_SolderLight\TRAIN'img1 = base_folder + '/' + '2022-7-19-14-27-7-284797-DB30723CAS_Q1-SolderLight.jpg'output_folder = r'D:\demo'if not os.path.exists(output_folder):os.makedirs(output_folder)hash_value = pHash(img1)hash_value_rotate = pHash(img1,True)print(hash_value)print(hash_value_rotate)for i in os.listdir(base_folder):t1 = time.thread_time()image2_path = os.path.join(base_folder,i)result1 = cmpHash(hash_value,pHash(image2_path))result2 = cmpHash(hash_value_rotate, pHash(image2_path))t2 = time.thread_time()if result1 > result2:save_folder = os.path.join(output_folder,'temp2')if not os.path.exists(save_folder):os.makedirs(save_folder)shutil.copy(image2_path,os.path.join(save_folder,i))else:save_folder = os.path.join(output_folder, 'temp1')if not os.path.exists(save_folder):os.makedirs(save_folder)shutil.copy(image2_path,os.path.join(save_folder,i))

好了不多说了

salute!!!!老规矩上咩咩

[哈希算法]----判断图片正反相关推荐

  1. java 图片 哈希值_上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中...

    上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 企业用户后台管理系统 - 谭人才招聘系统 function ajaxfile( ...

  2. python查重算法_用Python实现通过哈希算法检测图片重复的教程

    Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...

  3. python图像检测_用Python实现通过哈希算法检测图片重复的教程

    Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...

  4. 常见数据结构-哈希算法

    一,什么是哈希算法 哈希和散列其实意思是一样的,只是中文翻译的区别,英文是 Hash. 哈希算法也叫 hash 算法或散列算法.哈希算法的定义:将任意长度的二进制串映射为固定长度(一般是 128 bi ...

  5. 相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现

    相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现 原文:http://blog.sina.com.cn/s/blog_56fd58ab0102xpqf.html 感知哈 ...

  6. 相似图片检测:感知哈希算法之dHash的Python实现

    原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...

  7. python检测图片相同部分_用 Python 实现哈希算法检测重复图片

    在 Python 中导入 hashlib 模块,调用函数就可以生成某一个字符串或者文件的哈希值.这个算法对于未被篡改的上传文件非常有效,如果输入数据有细微变化,加密哈希算法都会导致雪崩效应,从而造成新 ...

  8. 感知哈希算法——找出相似的图片

    参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格 ...

  9. 【转】感知哈希算法——找出相似的图片

    Google 图片搜索功能 在谷歌图片搜索中, 用户可以上传一张图片, 谷歌显示因特网中与此图片相同或者相似的图片. 比如我上传一张照片试试效果: 原理讲解 参考Neal Krawetz博士的这篇文章 ...

最新文章

  1. 【错误记录】Visual Studio 编译 C++ 代码报错 ( To disable deprecation, use _CRT_SECURE_NO_WARNINGS. )
  2. MySQL Connector/ODBC 5.2.2 发布
  3. 点击桌面计算机图打不开,idf,手把手教你怎么解决电脑桌面图标打不开
  4. c++17(23)-typedef
  5. python 一次输入10个数_python 如何一次输入3个整数
  6. ffmpeg 命令画中画效果
  7. vue之watch用法
  8. centos6.5安装sublime text 2
  9. 联合主键使用in和not in
  10. Android.DebugTools.Traceview dmtracedump
  11. 个人号微信SCRM客服系统功能介绍
  12. Ubuntu在线音乐盒-亦歌
  13. 主题狗themes.dog-精选上百种优秀开源网站主题、博客主题、商城模板
  14. java是什么?好学吗?
  15. 串口/U(A/S)RT(RS232/RS485/RS422协议等)
  16. java 环境变量 locale_locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别 zz
  17. SQL leetcode 刷题答案(二)
  18. 1 实验9_7_设计函数int getVowel(char str[],char vowel[]); (100分)
  19. 你曾后悔进入 IT 行业吗?为什么?(转自知乎)--一生不悔入IT
  20. [翻译] Anders Hejlsberg访谈录——Geek of the Week

热门文章

  1. basicdbobject java_java mongol数据库怎么连接
  2. UVAlive6807 Túnel de Rata (最小生成树)
  3. 【图像增广库imgaug】官方文档翻译(二):在多个 CPU 内核上进行扩充
  4. semantic-ui的使用
  5. flink-on-k8s-operator部署安装及alink集成
  6. oracle 查询条件 if,oracle查询语句if
  7. 2016-12-23
  8. 【音频处理】Melodyne 导入音频 ( 使用 Adobe Audition 录制音频 | 在 Melodyne 中打开录制的音频 | Melodyne 对音频素材的操作 | 音频分析算法 )
  9. 软考高级通过率(转)
  10. (附源码)node.js-医院预约挂号系统的设计与实现 毕业设计141041