当前位置: 首页 > news >正文

矿山建设网站设计师培训学校排行榜

矿山建设网站,设计师培训学校排行榜,wordpress some chinese please,黄冈网站建设报价PythonOpencv识别两张相似图片在网上看到python做图像识别的相关文章后#xff0c;真心感觉python的功能实在太强大#xff0c;因此将这些文章总结一下#xff0c;建立一下自己的知识体系。当然了#xff0c;图像识别这个话题作为计算机科学的一个分支#xff0c;不可能就…PythonOpencv识别两张相似图片在网上看到python做图像识别的相关文章后真心感觉python的功能实在太强大因此将这些文章总结一下建立一下自己的知识体系。当然了图像识别这个话题作为计算机科学的一个分支不可能就在本文简单几句就说清所以本文只作基本算法的科普向。看到一篇博客是介绍这个但他用的是PIL中的Image实现的感觉比较麻烦于是利用Opencv库进行了更简洁化的实现。相关背景要识别两张相似图像我们从感性上来谈是怎么样的一个过程首先我们会区分这两张相片的类型例如是风景照还是人物照。风景照中是沙漠还是海洋人物照中两个人是不是都是国字脸还是瓜子脸(还是倒瓜子脸……哈哈……)。那么从机器的角度来说也是这样的先识别图像的特征然后再相比。很显然在没有经过训练的计算机(即建立模型)那么计算机很难区分什么是海洋什么是沙漠。但是计算机很容易识别到图像的像素值。因此在图像识别中颜色特征是最为常用的。(其余常用的特征还有纹理特征、形状特征和空间关系特征等)其中又分为直方图颜色集颜色矩聚合向量相关图直方图计算法这里先用直方图进行简单讲述。先借用一下恋花蝶的图片从肉眼来看这两张图片大概也有八成是相似的了。在Python中利用opencv中的calcHist()方法获取其直方图数据返回的结果是一个列表使用matplotlib画出了这两张图的直方图数据图如下是的我们可以明显的发现两张图片的直方图还是比较重合的。所以利用直方图判断两张图片的是否相似的方法就是计算其直方图的重合程度即可。计算方法如下其中gi和si是分别指两条曲线的第i个点。最后计算得出的结果就是就是其相似程度。不过这种方法有一个明显的弱点就是他是按照颜色的全局分布来看的无法描述颜色的局部分布和色彩所处的位置。也就是假如一张图片以蓝色为主内容是一片蓝天而另外一张图片也是蓝色为主但是内容却是妹子穿了蓝色裙子那么这个算法也很可能认为这两张图片的相似的。缓解这个弱点有一个方法就是利用Image的crop方法把图片等分然后再分别计算其相似度最后综合考虑。图像指纹与汉明距离在介绍下面其他判别相似度的方法前先补充一些概念。第一个就是图像指纹图像指纹和人的指纹一样是身份的象征而图像指纹简单点来讲就是将图像按照一定的哈希算法经过运算后得出的一组二进制数字。说到这里就可以顺带引出汉明距离的概念了。假如一组二进制数据为101另外一组为111那么显然把第一组的第二位数据0改成1就可以变成第二组数据111所以两组数据的汉明距离就为1简单点说汉明距离就是一组二进制数据变成另一组数据所需的步骤数显然这个数值可以衡量两张图片的差异汉明距离越小则代表相似度越高。汉明距离为0即代表两张图片完全一样。如何计算得到汉明距离请看下面三种哈希算法平均哈希法(aHash)此算法是基于比较灰度图每个像素与平均值来实现的一般步骤1.缩放图片一般大小为8*864个像素值。2.转化为灰度图3.计算平均值计算进行灰度处理后图片的所有像素点的平均值直接用numpy中的mean()计算即可。4.比较像素灰度值遍历灰度图片每一个像素如果大于平均值记录为1否则为0.5.得到信息指纹组合64个bit位顺序随意保持一致性。最后比对两张图片的指纹获得汉明距离即可。感知哈希算法(pHash)平均哈希算法过于严格不够精确更适合搜索缩略图为了获得更精确的结果可以选择感知哈希算法它采用的是DCT(离散余弦变换)来降低频率的方法一般步骤缩小图片32 * 32是一个较好的大小这样方便DCT计算转化为灰度图计算DCT利用Opencv中提供的dct()方法注意输入的图像必须是32位浮点型所以先利用numpy中的float32进行转换缩小DCTDCT计算后的矩阵是32 * 32保留左上角的8 * 8这些代表的图片的最低频率计算平均值计算缩小DCT后的所有像素点的平均值。进一步减小DCT大于平均值记录为1反之记录为0.得到信息指纹组合64个信息位顺序随意保持一致性。最后比对两张图片的指纹获得汉明距离即可。dHash算法相比pHashdHash的速度要快的多相比aHashdHash在效率几乎相同的情况下的效果要更好它是基于渐变实现的。步骤缩小图片收缩到9*8的大小以便它有72的像素点转化为灰度图计算差异值dHash算法工作在相邻像素之间这样每行9个像素之间产生了8个不同的差异一共8行则产生了64个差异值获得指纹如果左边的像素比右边的更亮则记录为1否则为0.最后比对两张图片的指纹获得汉明距离即可。整个的代码实现如下# -*- coding: utf-8 -*-#feimengjuan# 利用python实现多种方法来实现图像识别import cv2import numpy as npfrom matplotlib import pyplot as plt# 最简单的以灰度直方图作为相似比较的实现def classify_gray_hist(image1,image2,size (256,256)):# 先计算直方图# 几个参数必须用方括号括起来# 这里直接用灰度图计算直方图所以是使用第一个通道# 也可以进行通道分离后得到多个通道的直方图# bins 取为16image1 cv2.resize(image1,size)image2 cv2.resize(image2,size)hist1 cv2.calcHist([image1],[0],None,[256],[0.0,255.0])hist2 cv2.calcHist([image2],[0],None,[256],[0.0,255.0])# 可以比较下直方图plt.plot(range(256),hist1,r)plt.plot(range(256),hist2,b)plt.show()# 计算直方图的重合度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 degree# 计算单通道的直方图的相似值def calculate(image1,image2):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 degree# 通过得到每个通道的直方图来计算相似度def classify_hist_with_split(image1,image2,size (256,256)):# 将图像resize后分离为三个通道再计算每个通道的相似值image1 cv2.resize(image1,size)image2 cv2.resize(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/3return sub_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)# 输入灰度图返回hashdef 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__:img1 cv2.imread(10.jpg)cv2.imshow(img1,img1)img2 cv2.imread(11.jpg)cv2.imshow(img2,img2)degree classify_gray_hist(img1,img2)#degree classify_hist_with_split(img1,img2)#degree classify_aHash(img1,img2)#degree classify_pHash(img1,img2)print degreecv2.waitKey(0)以上就是本文的全部内容希望对大家学习python程序设计有所帮助。完 谢谢观看
http://www.zqtcl.cn/news/149191/

相关文章:

  • 做外贸网站设计上需要注意什么python做音乐网站
  • 英语门户网站织梦源码wordpress 推荐插件
  • 学做衣服网站有哪些网站建设算入会计分录
  • 京东网站开发技术织梦网站如何做404
  • 论坛类网站开发屏蔽wordpress缩略图
  • 南宁市两学一做网站logo设计网站官网
  • 中国建设工程造价管理协会网站查询网站开发者的设计构想
  • 华强北网站建设设计素材网站p开头的
  • 怎样让网站快速收录利用数据库修改wordpress密码
  • 网站建设群发广告词做网站首页多少钱
  • 黑彩网站建设中企动力 网站价格
  • 上海营销型网站报价深圳企业网站制作设计
  • 网站清理通知北京电商购物网站
  • 新开传奇网站180合击创建一个个人网站需要多少钱
  • 郑州建网站哪家好深圳企业网站制作公司介绍
  • 企业网站百度收录桂林网站建设价格
  • 砀山做网站的公司wordpress微视频主题
  • 免费的企业网站cms注册网站后邮箱收到邮件
  • 网站推广排名教程怀化职院网站
  • 房产门户网站模板新手做电商怎么起步
  • 成都网站建设科技公沈阳网站建设技术公司排名
  • 自建商城网站上海有哪些网络公司
  • 朋友 合同 网站制作手机网站建设服务商
  • 链接分析属于网站开发棋牌软件开发定制
  • top域名的网站搭建网站步骤
  • 个人网站建设背景和目的海南省网站
  • 山西成宁做的网站义乌网站建设优化排名
  • 东莞网站建设公司辉煌大厦阿里云服务器官方网站
  • 域名注册网站制作自己建网站需要钱吗
  • 东莞市房管局官方网站域名查询ip网站