简单的图像相似度计算方法
文章目录
- 塑料瓶图像检测
- 说明
- 1.方法
- 2.测试结果(单张图片比对)
- 直方图
- 互信息
- 余弦相似度
- 感知哈希算法
- 3.评价
塑料瓶图像检测
目的:用于判断一张图片是否为塑料瓶;
条件:总计300多张图片分为70多类,同一类塑料瓶分别放置在同一个文件夹;
思路:选取每个文件夹的一张图片与目标图片对比计算返回相似度最高的值,通过多次试验确定阈值,超过阈值则判定为是塑料瓶,否则不是;
目录:
文章目录
- 塑料瓶图像检测
- 说明
- 1.方法
- 2.测试结果(单张图片比对)
- 直方图
- 互信息
- 余弦相似度
- 感知哈希算法
- 3.评价
说明
所有测试结果均为程序第一次运行结果
每一组测试的第一个(第一个样本)都是同一张图片相互比对
每一组测试的第二三四五个测试样本均是与第一个测试样本比对
以下为选用的5个测试样本
图片放置在与程序同一位置的images文件夹
1.方法
直方图
互信息
余弦相似度
感知哈希算法
2.测试结果(单张图片比对)
直方图
from time import *
begin_time = time()from PIL import Imagedef make_regalur_image(img, size=(256, 256)):return img.resize(size).convert('RGB')def hist_similar(lh, rh):assert len(lh) == len(rh)return sum(1 - (0 if l == r else float(abs(l - r)) / max(l, r)) for l, r in zip(lh, rh)) / len(lh)def calc_similar(li, ri):return hist_similar(li.histogram(), ri.histogram())if __name__ == '__main__':img1 = Image.open('images/WIN_20200111_21_56_10_Pro.jpg')img1 = make_regalur_image(img1)img2 = Image.open('images/WIN_20200111_21_56_52_Pro.jpg')img2 = make_regalur_image(img2)print(calc_similar(img1, img2))end_time = time()
run_time = end_time-begin_time
print ('该程序运行时间:',run_time)
测试方式 | (图像)文件名 | 耗时(s) | Result |
---|---|---|---|
素材(自比) | WIN_20200111_21_56_10_Pro.jpg | 0.055361032485961914 | 1.0 |
两张图片比对 | WIN_20200111_21_56_52_Pro.jpg | 0.06594681739807129 | 0.6108132256943336 |
两张图片比对 | WIN_20200111_21_57_05_Pro.jpg | 0.05501222610473633 | 0.6398035067201021 |
两张图片比对 | WIN_20200111_21_58_01_Pro.jpg | 0.05424642562866211 | 0.7139745065909696 |
两张图片比对 | WIN_20200111_22_02_08_Pro.jpg | 0.07813024520874023 | 0.7189068678053613 |
互信息
from time import *
begin_time = time()from sklearn import metrics as mr
from scipy.misc import imread
import numpy as npimg1 = imread('1.jpg')
img2 = imread('2.jpg')img2 = np.resize(img2, (img1.shape[0], img1.shape[1], img1.shape[2]))img1 = np.reshape(img1, -1)
img2 = np.reshape(img2, -1)
print(img2.shape)
print(img1.shape)
mutual_infor = mr.mutual_info_score(img1, img2)print(mutual_infor)end_time = time()
run_time = end_time-begin_time
print ('该程序运行时间:',run_time)
测试方式 | (图像)文件名 | 耗时(s) | Result |
---|---|---|---|
素材(自比) | WIN_20200111_21_56_10_Pro.jpg | 1.459466791152954 |
(6220800,) (6220800,) 4.842347326725792 |
两张图片比对 | WIN_20200111_21_56_52_Pro.jpg | 1.531355381011963 |
(6220800,) (6220800,) 1.3835594221461103 |
两张图片比对 | WIN_20200111_21_57_05_Pro.jpg | 1.5626063346862793 |
(6220800,) (6220800,) 1.2697158354875515 |
两张图片比对 | WIN_20200111_21_58_01_Pro.jpg | 1.5668601989746094 |
(6220800,) (6220800,) 1.40573402284614 |
两张图片比对 | WIN_20200111_22_02_08_Pro.jpg | 1.5644567012786865 |
(6220800,) (6220800,) 0.6813656974353114 |
余弦相似度
from time import *
begin_time = time()from PIL import Image
from numpy import average, linalg, dotdef get_thumbnail(image, size=(1200, 750), greyscale=False):image = image.resize(size, Image.ANTIALIAS)if greyscale:image = image.convert('L')return imagedef image_similarity_vectors_via_numpy(image1, image2):image1 = get_thumbnail(image1)image2 = get_thumbnail(image2)images = [image1, image2]vectors = []norms = []for image in images:vector = []for pixel_tuple in image.getdata():vector.append(average(pixel_tuple))vectors.append(vector)norms.append(linalg.norm(vector, 2))a, b = vectorsa_norm, b_norm = normsres = dot(a / a_norm, b / b_norm)return resimage1 = Image.open('images/WIN_20200111_21_56_10_Pro.jpg')
image2 = Image.open('images/WIN_20200111_21_56_10_Pro.jpg')
cosin = image_similarity_vectors_via_numpy(image1, image2)print(cosin)end_time = time()
run_time = end_time-begin_time
print ('该程序运行时间:',run_time)
测试方式 | (图像)文件名 | 耗时(s) | Result |
---|---|---|---|
素材(自比) | WIN_20200111_21_56_10_Pro.jpg | 19.579540729522705 | 0.9999999999999746 |
两张图片比对 | WIN_20200111_21_56_52_Pro.jpg | 19.23276400566101 | 0.9751567803348392 |
两张图片比对 | WIN_20200111_21_57_05_Pro.jpg | 19.25089430809021 | 0.9726385998457207 |
两张图片比对 | WIN_20200111_21_58_01_Pro.jpg | 0.9807553738212222 | 19.210497856140137 |
两张图片比对 | WIN_20200111_22_02_08_Pro.jpg | 0.9038901804349453 | 19.01563835144043 |
感知哈希算法
from time import *
begin_time = time()import cv2
import numpy as np
import os#感知哈希算法
def pHash(image):image = cv2.resize(image,(32,32), interpolation=cv2.INTER_CUBIC)image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# cv2.imshow('image', image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()# 将灰度图转为浮点型,再进行dct变换dct = cv2.dct(np.float32(image))
# print(dct)# 取左上角的8*8,这些代表图片的最低频率# 这个操作等价于c++中利用opencv实现的掩码操作# 在python中进行掩码操作,可以直接这样取出图像矩阵的某一部分dct_roi = dct[0:8,0:8]avreage = np.mean(dct_roi)hash = []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 hash#计算汉明距离
def Hamming_distance(hash1,hash2):num = 0for index in range(len(hash1)):if hash1[index] != hash2[index]:num += 1return numif __name__ == "__main__":image_file1 = 'images/WIN_20200111_21_56_10_Pro.jpg'image_file2 = 'images/1.jpg'img1 = cv2.imread(image_file1)img2 = cv2.imread(image_file2)hash1 = pHash(img1)hash2 = pHash(img2)dist = Hamming_distance(hash1, hash2)#将距离转化为相似度similarity = 1 - dist * 1.0 / 64print(dist)print(similarity)end_time = time()run_time = end_time-begin_time
print ('该程序运行时间:',run_time)
测试方式 | (图像)文件名 | 耗时(s) | distance | similarity |
---|---|---|---|---|
素材(自比) | WIN_20200111_21_56_10_Pro.jpg | 0.20314764976501465 | 0 | 1.0 |
两张图片比对 | WIN_20200111_21_56_52_Pro.jpg | 0.2085726261138916 | 4 | 0.9375 |
两张图片比对 | WIN_20200111_21_57_05_Pro.jpg | 0.20518183708190918 | 0 | 1.0 |
两张图片比对 | WIN_20200111_21_58_01_Pro.jpg | 0.20314764976501465 | 5 | 0.921875 |
两张图片比对 | WIN_20200111_22_02_08_Pro.jpg | 0.18751096725463867 | 8 | 0.875 |
3.评价
- 直方图计算结果与直观视觉严重不符合
- 余弦相似度准确度较高,但太耗时,比对平均耗时19s
- 互信息的方法从耗时和准确度上粗略观察,介于直方图和余弦相似度之间
- 感知哈希算法耗时较为可接受,且比对结果较有区分度且符合直观视觉
简单的图像相似度计算方法相关推荐
- 图像相似度计算方法和代码实现
互相关系数计算原理 在计算机视觉中,互相关系数常用于比较两幅图像的相似程度. 互相关系数的取值范围为[-1, 1].如果互相关系数为1,则表示两个随机变量完全正相关,如果为-1,则表示两个随机变量完全 ...
- linux图片相似度检测软件下载,移动端图像相似度算法选型
概述 电商场景中,卖家为获取流量,常常出现重复铺货现象,当用户发布上传图像或视频时,在客户端进行图像特征提取和指纹生成,再将其上传至云端指纹库对比后,找出相似图片,杜绝重复铺货造成的计算及存储资源浪费 ...
- 计算图像相似度——《Python也可以》之一
计算图像相似度--<Python也可以>之一 声明:本文最初发表于赖勇浩(恋花蝶)的博客http://blog.csdn.net/lanphaday,如蒙转载,敬请确保全文完整,未经同意, ...
- 计算图像相似度——《Python也可以》之一(转)
声明:本文最初发表于赖勇浩(恋花蝶)的博客http://blog.csdn.net/lanphaday,如蒙转载,敬请确保全文完整,未经同意,不得用于商业用途. 关于<Python也可以> ...
- 图像相似度测量与模板匹配总结
摘要 本文主要总结了进行目标跟踪.检测中经常使用到的图像相似度测量和模板匹配方法,并给出了具体的基于OpenCV的代码实现. 引言 模板匹配是一种在源图像中寻找与图像patch最相似的技术,常常用来进 ...
- 图像相似度算法的C#实现及测评
近日逛博客的时候偶然发现了一个有关图片相似度的Python算法实现.想着很有意思便搬到C#上来了,给大家看看. 闲言碎语 才疏学浅,只把计算图像相似度的一个基本算法的基本实现方式给罗列了出来,以至于在 ...
- 图像类似度測量与模板匹配总结
摘要 本文主要总结了进行目标跟踪.检測中常常使用到的图像相似度測量和模板匹配方法,并给出了详细的基于OpenCV的代码实现. 引言 模板匹配是一种在源图像中寻找与图像patch最相似的技术,经常常使用 ...
- 图像相似度测量和模板匹配方法
摘要 本文主要总结了进行目标跟踪.检测中经常使用到的图像相似度测量和模板匹配方法,并给出了具体的基于OpenCV的代码实现. 引言 模板匹配是一种在源图像中寻找与图像patch最相似的技术,常常用来进 ...
- r语言把两个折线图图像放到一个图里_图像相似度度量
图像相似度度量的应用场景很多,包括以图搜图,相似图像去重等多种功能,目前在项目中的场景是针对大量重复类似的图片,需要进行筛选剔除,自然需要用到图像相似度,简单调研了下图像相似度的方法,包括传统图像方法 ...
最新文章
- 好东西和大家分享阿!
- numpy 创建加一行_Python数据分析快速入门--NumPy amp; Pandas
- [我的1024开源程序]350元写的HTML5程序
- 设计模式之_Strategy_06
- 无需破解,Python这个神器帮你免费获取资源,赶紧收藏!
- ubuntu中的tftp用法
- python实现排列组合公式算法_Python实现卡尔曼滤波算法之贝叶斯滤波
- 青海贵德黄河岸边现雾凇奇观
- Java使用ODBC连接Access数据库
- 超级搜索术 总结篇2
- python数据挖掘的基本流程有哪些?
- 四、案例:北京二手房价影响因素分析
- Ubuntu终端打不开
- 美国地质勘探局官网(USGS)Landsat 8 OLI_TIRS 影像数据下载详解
- Androd 基本布局(其一)
- SQLServer身份证号或手机号字段隐藏某几位显示
- 基于Azure Percept 避障乐高汽车
- 服务器硬盘rad技术,服务器硬盘RAD选用.doc
- 黑马程序员——java基础之抽象与接口
- 一篇讲解iphone6 双核处理器的新闻稿
热门文章
- 做好公司各部门数据报表支撑的几个简单思维
- 【小记】LaTex 语法说明
- matlab 空间曲面的绘制
- 本地项目转git项目的详细操作方法
- CVer最想知道的,简单分析下《2020年度中国计算机视觉人才调研报告》
- 电脑端如何多开微信 如何用命令行打开程序(将快捷方式复制到C:\Windows\System32目录下)
- 机器人系统设计与制作:Python语言实现2.4 用LibreCAD生成机器人的二维CAD图
- request.getHeader、request.getHeaders、request.getHeaderNames
- ICA简介:独立成分分析
- REST-HATEOAS