使用opencv实现图片相似度检测

1.为什么学这个,我对图像处理非常感兴趣,我联想到海尔的指纹识别门锁是如何进行检测的,我在想不应该呀,单片机性能这么差,应该是使用了训练后的数据去检测图片的,如果我要实现草莓检测,知道它是不是草莓,我觉得单纯使用图片处理是不够的,我考虑过使用指纹模块来接触草莓从而实现判断他是不是草莓,从而联想到学习图像相似度检测,我们人类的手指事实上是有大量的传感器的,机器如果想要实现那科技含量太高了,而且成本高,就算实现了也只能放在家里自己玩…

2.代码基于python3.1 opencv,先使用直方图判断是否是简单的图形(运算快)如果不是在判断是否是复杂的图形(运算慢)

import cv2
def calculate_complexity_similarity(img1str, img2str):# 加载两张图片img1 = cv2.imread(img1str)img2 = cv2.imread(img2str)# 将图片转换为灰度图像gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 创建ORB特征检测器orb = cv2.ORB_create()# 检测特征点和描述符kp1, des1 = orb.detectAndCompute(gray_img1, None)kp2, des2 = orb.detectAndCompute(gray_img2, None)# 创建暴力匹配器bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)# 进行特征匹配matches = bf.match(des1, des2)similarity=0.0# 根据特征点匹配结果计算相似度if len(matches) > 0:similarity = sum([match.distance for match in matches]) / len(matches)print('图片相似度为:', similarity)else:print('未找到匹配的特征点')# 调用函数进行图片相似度计算,计算简单的图片相似度return similarity
def calculate_histogram_similarity(img1_path, img2_path):# 读取两张图片img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)# 计算直方图hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256])hist2 = cv2.calcHist([img2], [0], None, [256], [0, 256])# 归一化直方图cv2.normalize(hist1, hist1, 0, 1, cv2.NORM_MINMAX)cv2.normalize(hist2, hist2, 0, 1, cv2.NORM_MINMAX)# 比较直方图similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)if similarity<0.6:similarity=calculate_complexity_similarity(img1str, img2str)return similarityif __name__ == '__main__':img1str='straw1.png'img2str='straw3.png'sim = calculate_histogram_similarity(img1str, img2str)print('图片相似度为:', sim)

3.测试效果
//简单的图片使用直方图归一化处理
在这里插入图片描述
在这里插入图片描述
//不同的图片之间比较

在这里插入图片描述
//2和22比较
在这里插入图片描述
//2和23无法检测出来,可能是2个2颜色不一样,2和24也一样
在这里插入图片描述
//straw1和straw2 这两张是在一张图片的两颗草莓
图片相似度为: 0.8582924959300794
//straw1和straw3,不同图片的草莓
在这里插入图片描述
图片相似度为: 69.67826086956522

//与倒立的草莓
在这里插入图片描述
图片相似度为: 68.84821428571429
在这里插入图片描述
图片相似度为: 73.10416666666667

//带有草莓花的草莓,比较符合实际情况
在这里插入图片描述

图片相似度为: 0.7757366241694935

//啊这汽车和草莓是相似的?而且是多个草莓,改了下代码 如果形状都不同了,similarity<0直接返回
在这里插入图片描述
在这里插入图片描述

3.改进后的代码

import cv2
def calculate_complexity_similarity(img1str, img2str):# 加载两张图片img1 = cv2.imread(img1str)img2 = cv2.imread(img2str)# 将图片转换为灰度图像gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 创建ORB特征检测器orb = cv2.ORB_create()# 检测特征点和描述符kp1, des1 = orb.detectAndCompute(gray_img1, None)kp2, des2 = orb.detectAndCompute(gray_img2, None)# 创建暴力匹配器bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)# 进行特征匹配matches = bf.match(des1, des2)similarity=0.0# 根据特征点匹配结果计算相似度if len(matches) > 0:similarity = sum([match.distance for match in matches]) / len(matches)print('图片相似度为:', similarity)else:print('未找到匹配的特征点')# 调用函数进行图片相似度计算,计算简单的图片相似度return similarity
def calculate_histogram_similarity(img1_path, img2_path):# 读取两张图片img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)# 计算直方图hist1 = cv2.calcHist([img1], [0], None, [256], [0, 256])hist2 = cv2.calcHist([img2], [0], None, [256], [0, 256])# 归一化直方图cv2.normalize(hist1, hist1, 0, 1, cv2.NORM_MINMAX)cv2.normalize(hist2, hist2, 0, 1, cv2.NORM_MINMAX)# 比较直方图similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)print(similarity)#30%的几率是那应该不是一个东西if similarity <0.3:return similarityif similarity<0.6:similarity=calculate_complexity_similarity(img1str, img2str)return similarityif __name__ == '__main__':img1str='straw4.png'img2str='straw7.png'sim = calculate_histogram_similarity(img1str, img2str)print('图片相似度为:', sim)

//改进后的结果
在这里插入图片描述
//不同的形状的都返回负数
图片相似度为: -0.07563206074940822

4.以后改进的地方,上面的代码可以简单的检测颜色相同形状相同的问题,但是也面临着检测精度的不精确,我们可以录入多个图片如果取相似度最高的一张,当然性能不大好, 识别苹果和草莓达到40%相似率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/222058.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【受体 + 二系统 】

GPCR A级超家族家庭成员/基因评论胺受体受体的六个亚家族总共包括45个基因&#xff08;其中4个是假基因&#xff09;;这六个亚家族是5-羟色胺&#xff08;5-HT&#xff0c;血清素&#xff09;受体&#xff08;13个基因&#xff09;&#xff0c;多巴胺受体&#xff08;5个基…

抖音开新店,十个设置,实操满满全是干货

抖店开店的第一天手足无措不知从哪入手&#xff1f;我给大家分享一个新手开店必须完成的十个设置&#xff0c;实操满满全是干货&#xff0c;每一项都很重要&#xff01;特别是新手一定要认真看&#xff0c;因为这个直接关系到你店铺能否正常经营&#xff0c;跟着我一起来实操一…

【活动回顾】sCrypt在柏林B2029开发者周

B2029 是柏林的一个区块链爱好者、艺术家和建设者聚会&#xff0c;学习、讨论和共同构建比特币区块链地方。 在2023年6月9日至11日&#xff0c;举行了第7次Hello Metanet研讨会。本次研讨会旨在为参与者提供一个学习、讨论和共同构建比特币区块链的平台。 在这个充满激情和创意…

机器人制作开源方案 | 网球自动拾取机

作者&#xff1a;柳文浩、李浩杰、苏伟男、贾思萌、张天芸 单位&#xff1a;西安外事学院 指导老师&#xff1a;胡宝权、陈小虎 1. 产品说明 1.1 设计目的 近年来&#xff0c;网球运动越来越受到老百姓的欢迎&#xff0c;各种规模的比赛层出不穷。然而由于网球运动极为激烈…

OpenCvSharp从入门到实践-(03)像素

目录 像素 1、确定像素位置 2、获取像素的BGR值 3、修改像素的BGR值 像素 图像数字化是指用数字表示图像&#xff0c;每一幅数字图像都是有M行N列的像素组成的&#xff0c;其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别&#xff0c;这256个灰…

VMWare虚拟机ubuntu克隆打不开

ubuntu克隆打不开 复制的存有ubuntu克隆的文件夹&#xff0c;导入vmware打不开 说找不到这个文件&#xff0c;那就到目录把它的删掉 的删掉 换000001.vmdk后缀的

Centos7上面部署redis

Centos7上面部署redis 编写这个部署redis&#xff0c;只是为了另一个文章入侵redis做准备&#xff0c;网上还有好多类似的文章&#xff0c;这个单纯的就是部署安装&#xff0c;并简单的测试使用以下 关联其他文章 [1]VMware上面安装部署centos7镜像系统【详细含镜像】 [2]血的教…

汽车转向桥设计转向节转向桥机械设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;转向桥 获取完整报告说明书工程源文件 转向节图 装配图 本文设计的是JY1061A型采用前置后轮驱动的载货汽车转向桥&#xff0c;因此该转向桥为从动桥。从动桥的功用&#xff1a;从动桥也称非驱动桥&#xff0c;又称从动车轴…

【沐风老师】3DMAX快速地板屋顶墙面铺设插件使用方法详解

3DMAX快速地板屋顶墙面铺设插件使用教程 3DMAX快速地板屋顶墙面铺设插件&#xff0c;一键生成各种地板、墙面纹理模型&#xff0c;是一款非常实用的室内设计和建筑建模插件。 【适用版本】 3dMax7或更新版本 【安装方法】 该插件无需安装&#xff0c;直接在建模过程中使用&a…

基于单片机寻迹巡线避障智能小车系统设计

**单片机设计介绍&#xff0c; 基于单片机寻迹巡线避障智能小车系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的寻迹巡线避障智能小车系统是一种能够自动跟随线路并避开障碍物的智能小车。下面是一个简要的系…

“2024杭州人工智能展览会”加快推进浙江省人工智能产业创新发展

杭州市人民政府加快推进人工智能产业创新发展&#xff0c;贯彻党的二十大精神和新的发展理念&#xff0c;把握人工智能技术演进趋势和创新发展新范式&#xff0c;以促进人工智能与实体经济深度融合为主线&#xff0c;以优质算力普惠供给为基础&#xff0c;到2025年&#xff0c;…

图论——最小割问题

Capacity&#xff08;S&#xff0c;T) Min-Cut(通俗的说就是用最小的力气隔断&#xff09; 最小割并不唯一 最大流最小割定理 对于一个网络流问题&#xff0c;最大流的流量最小割的容量 寻找最小割 可以使用Edmonds-karp or Dinic algorithm 首先寻找任意一个最大流&#xff…