Background:
在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成标注图像文件夹(如图1)里的

图1:蓝框-转换后的图片
图2:红框原始图片

蓝框里的图片(看起来和原始图片一模一样,后来发现其每个pixel对应的RGB值相较于原始图片都发生了变化)替换了原始未标注前的图片(图2:红框里图片),导致我们没办法判别蓝框内图片的具体类,由于图片太多,人工去一一比对,耗时耗力(主要是因为懒QAQ),我们就准备用蓝框里的图片和每个类别里的原始图片进行一一比对(如果相似,则原始图片的类别也是蓝色框内图片的类别),但是由于蓝框内图片相较于原始图片像素值有了较大的改变(具体像素值变化很小,所以看起来和原始图片一模一样),没办法通过比较像素值来判断图片是否相似,故我们想尝试其他的方法去识别两张相识的图片,然后我看到了这个

Python+Opencv识别两张相似图片-CDA数据分析师官网​cda.pinggu.org

里面介绍了四种方法识别两张相似图片。

在图像识别中,HOG特征,LBP特征,Haar特征[1],颜色特征,纹理特征,形状特征,空间关系特征等,都可以用来描述图片。

一些概念:

  • 图像指纹:就是将图像按照一定的哈希算法,经过运算后得出的一组二进制数字。可以想象成人的指纹。
  • 汉明距离[2]:就是一组二进制数据变成另一组二进制数据所需的步骤数。如:101到100的汉明距离就是1
  1. 平均哈希法(aHash)

此算法基于比较灰度图每个像素与平均值来实现。

具体步骤如下:

  • 缩放图片,一般大小为8*8,64个像素值
  • 转化为灰度图
  • 计算平均值:计算灰度处理后图片所有像素点的平均值(可直接使用numpy中的mean()计算)
  • 比较像素灰度值:遍历灰度图每个像素,如果高于平均值记为1,否则为0
  • 得到信息指纹:组合64个bit位, 顺序随意保持一致性

2. 感知哈希算法(pHash)

平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法。

具体步骤如下:

  • 缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
  • 转化为灰度图
  • 计算DCT:利用Opencv中提供的dct()方法,注意输入的图像必须是32位浮点型,所以先利用numpy中的float32进行转换
  • 缩小DCT:DCT计算后的矩阵是32 * 32,保留左上角的8 * 8,这些代表的图片的最低频率
  • 计算平均值:计算缩小DCT后的所有像素点的平均值
  • 进一步减小DCT:大于平均值记录为1,反之记录为0
  • 得到信息指纹:组合64个信息位,顺序随意保持一致性
  • 最后比对两张图片的指纹,获得汉明距离即可

3. 直方图计算法

计算两张图相应直方图的重合度

计算方法如下:

其中

分别指两条直方图曲线的第
个点。

代码如下:

import 

经过反复的实验,发现对于我的需求,使用平均哈希法(aHash)效果最好,下面是针对我们的需求具体的代码:

import csv
import glob
import os
import cv2
import numpy as np
try:from scipy.misc import imread
except ImportError:from imageio import imreadroot_dir_1 = "C:/Users/chenxu/Desktop/image"   #目录1:无标签数据
root_dir_2 = "C:/Users/chenxu/Desktop/ori_match/"  #目录2:有标签数据
suffix = ".png"
target_lst = []
token2target = {}
data = []# 平均哈希算法计算
def classify_aHash(image1,image2):image1 = cv2.resize(image1, (8, 8))image2 = cv2.resize(image2, (8, 8))gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)hash1 = getHash(gray1)hash2 = getHash(gray2)return Hamming_distance(hash1, hash2)def classify_pHash(image1,image2):image1 = cv2.resize(image1, (32, 32))image2 = cv2.resize(image2, (32, 32))gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)# 将灰度图转为浮点型,再进行dct变换dct1 = cv2.dct(np.float32(gray1))dct2 = cv2.dct(np.float32(gray2))# 取左上角的8*8,这些代表图片的最低频率# 这个操作等价于c++中利用opencv实现的掩码操作# 在python中进行掩码操作,可以直接这样取出图像矩阵的某一部分dct1_roi = dct1[0:8, 0:8]dct2_roi = dct2[0:8, 0:8]hash1 = getHash(dct1_roi)hash2 = getHash(dct2_roi)return Hamming_distance(hash1, hash2)# 输入灰度图,返回hash
def getHash(image):avreage = np.mean(image)hash = []for i in range(image.shape[0]):for j in range(image.shape[1]):if image[i, j] > avreage:hash.append(1)else:hash.append(0)return hash# 计算汉明距离
def Hamming_distance(hash1,hash2):num = 0for index in range(len(hash1)):if hash1[index] != hash2[index]:num += 1return numif __name__ == "__main__":file_lst = os.listdir(root_dir_1)image_nums = len(file_lst)   #未标记图片总数for img_num in range(image_nums):addr1 = root_dir_1 + '/' + "image_" + str(img_num) + suffiximg_1 = cv2.imread(addr1)label = 0       #找到相应类别标记位target_lst = []  #存储对应7种分类对应数字名for dir_name in glob.glob(os.path.join(root_dir_2, "*")):target = os.path.split(dir_name)[-1]   #依次取每个类别下图片与未分类图片进行比较if target not in target_lst:            #若相似度很高,则将未分类图片标记为此分类图片对应的类别target_lst.append(target)token2target[len(target_lst)-1] = targetfor img_name in glob.glob(os.path.join(dir_name, "*" + suffix)):img_2 = cv2.imread(img_name)degree = classify_aHash(img_1, img_2)  #degree越小,相似度越高num = len(target_lst) - 1if degree < 3:           #degree=0,1,2,若限制degree=0,会有很多图片无法匹配到相应类别d1 = tuple(str(num))data.append(d1)label = 1breakif label == 1:breakif label == 0:d2 = tuple("N")  #如果没发现相应的分类,则标记为Ndata.append(d2)print(data)print(token2target)print(data)#将生成data导出为CSVwith open("./pic_match.csv", "w", newline="", encoding='utf-8-sig') as datacsv:csvwriter = csv.writer(datacsv, dialect=("excel"))csvwriter.writerows(data)

参考

  1. ^https://www.cnblogs.com/ranjiewen/p/5873514.html
  2. ^https://zh.wikipedia.org/wiki/%E6%B1%89%E6%98%8E%E8%B7%9D%E7%A6%BB

opencv resize_利用OpenCV 识别两张相似的图片相关推荐

  1. opencv 取roi_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  2. python图片识别-Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  3. Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  4. python相似图片识别_Python+Opencv识别两张相似图片

    Python+Opencv识别两张相似图片 在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话 ...

  5. php 比对两张图片,Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  6. python识别图片中数字_Python Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  7. python图像检测_Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  8. word表格分开快捷键_Word利用快捷键在两张以上无缝表格之间或表格前插入文字...

    在制作 Word 文档过程中,偶尔会遇到这样一种情况,就是要在两张或多张无缝表格之间插入文字,由于输入文字前必须插入光标,恰恰在无缝表格之间不容易插入光标,应该怎么办呢?毫无疑问把表格分离,至于如何分 ...

  9. 用opencv实现两张半透明png图片以一定透明度叠加

    例如我有如下两张透明.半透明图: 在photoshop中打开如下: 前景:一张四通道的png图,BGR通道的值全为[0,0,200],透明度完全靠alpha通道的不同值来体现. 后景:一张四通道的pn ...

最新文章

  1. 网络管理员&MCSE2003之12:第7章 使用组策略管理用户环境(下)
  2. BH38旋转编码器初步测试
  3. qpython3下载-QPython3
  4. 简述Java内存模型的由来、概念及语义
  5. python~文件遍历命令:glob、os.walk
  6. python删除为空值的列_python如何删除列为空的行
  7. workerman mmo_2020了,我们为什么还在做MMO端游
  8. wxWidgets:异形窗示例
  9. Swoole安装popen()找不到
  10. 国产自主可控的MBSE解决方案和全数字仿真平台(SkyEye)
  11. 使用CNN实现图像分类——理解卷积神经网络(卷积、池化、全连接)
  12. Transwarp Inceptor 问题记录与解决
  13. scara工业机器人外观_SCARA工业机器人研究现状
  14. 山西省太原市、运城市、大同等市全面推行建筑工地劳务实名制
  15. UE4插件共享汇总大全
  16. SSL 3.0 Poodle漏洞修复方法
  17. QTcpSocket客户端和服务端发送图片(或大文件)小Demo
  18. 不是每个音乐节都值得狂欢,抖音就不一样
  19. 印刷电路板(PCB)的制作工艺流程
  20. Android打包混淆压缩

热门文章

  1. R语言difftime函数计算时间差值实战
  2. 使用Stanford CoreNLP进行句法分析实战
  3. python使用正则表达式寻找具有特定后缀的文件
  4. php统计键出现的次数,php统计数组元素出现的次数
  5. 网站Web服务器测试及优化参考
  6. DDR: efficient computational method to predict drug–target interactions using graph mining and machi
  7. Real-Time DNA Sequencing from Single Polymerase Molecules
  8. Pacbio 纯三代组装复活草基因组
  9. ubuntu安装mysql 密码忘了怎么办_在ubuntu上面安装mysql都密码忘记及一些常用命令...
  10. three.js 加载显示文字