首页 > 其他分享 >基于业务需求的图片对比

基于业务需求的图片对比

时间:2023-08-20 21:22:46浏览次数:26  
标签:基于 old pic cv2 location new diff 对比 图片

  1 """
  2 1.先将文件夹内的图片进行遍历,获取所有文件名称,放到列表中。只需要获取一个文件夹内的名称即可,因为新旧文件夹内图片的名称都是一样的,只是截图时候的版本不同
  3 2.通过ssim将新旧文件夹内的图片进行对比,得到相似度评分,并将差异处进行框选
  4 3.将旧图、新图、对比图、对比结果 放置在excel表中
  5 4.将excel表和对比报告通过email发送给指定人
  6 """
  7 
  8 import os
  9 import cv2
 10 import imutils
 11 import xlsxwriter
 12 import numpy as np
 13 from skimage.metrics import structural_similarity as ssim
 14 
 15 """找到图片的坐标"""
 16 def find_all_pic(new_pic_location, old_pic_location):
 17     new_pic_location_list = []
 18     old_pic_location_list = []
 19     for root, dirs, files in os.walk(new_pic_location):
 20         for file in files:
 21             new_pic_location_list.append(file)
 22         # print(new_pic_location_list)
 23     for root, dirs, files in os.walk(old_pic_location):
 24         for file in files:
 25             old_pic_location_list.append(file)
 26         # print(old_pic_location_list)
 27     if new_pic_location_list == old_pic_location_list:
 28         """如果说新截图的图片名和旧截图的名一样的话,说明坐标位置是相同的,随便取一组就好了"""
 29         pic_location_list = new_pic_location_list
 30         # print(pic_location_list)
 31         return pic_location_list
 32     else:
 33         print('=-=-=-=-=-=')
 34 
 35 def ssim_check(new_pic, old_pic):
 36     new_pic  = cv2.imread(new_pic)
 37     old_pic = cv2.imread(old_pic)
 38 
 39     "转灰度图"
 40     new_pic_gray = cv2.cvtColor(new_pic, cv2.COLOR_BGR2GRAY)
 41     old_pic_gray = cv2.cvtColor(old_pic, cv2.COLOR_BGR2GRAY)
 42 
 43     (score, diff) = ssim(new_pic_gray, old_pic_gray,win_size = 111, gaussian_weights = True, full = True)
 44     print("图片相似度: {:.4f}%".format(score * 100))
 45 
 46 
 47     return  score, diff, new_pic, old_pic
 48 
 49 def find_contours(diff, before, after):
 50 
 51     """diff 图像包含两个图像之间的实际图像差异,并表示为 0到 1 范围内的浮点数据类型
 52     将数组转换为 [0,255] 范围内的整型8位无符号"""
 53     diff = (diff * 255).astype("uint8")
 54     # print(diff)
 55     # cv2.imshow('two img different',diff)
 56 
 57     # diff_box = cv2.merge([diff, diff, diff])
 58     '''使用numpy stack()函数将数组进行2维堆叠 结果和cv2.merge算法相同,在大型矩阵中使用numpy速度更快'''
 59     diff_box = np.stack((diff, diff, diff), axis = 2)  # 灰度图层面对比
 60     # print(diff_box)
 61 
 62 
 63     '''二值化并对差异图像进行阈值设置阈值,查找轮廓以获得两个图像的不同区域  使用cv2.THRESH_OTSU方法时注意阈值要设定为0 '''
 64     thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]  # [0]返回的是阈值  [1]是返回灰度图二值化后的结果
 65     # print('这是thresh{}'.format(thresh))
 66     # cv2.imshow('thresh', thresh)
 67 
 68     '''轮廓提取'''
 69     contours = cv2.findContours(thresh.copy(),
 70                                 cv2.RETR_EXTERNAL,  # CV.RETR_EXTERNAL仅检索外轮廓。并为所有轮廓设置层级结构
 71                                 cv2.CHAIN_APPROX_SIMPLE)  # CV.CHAIN_APPROX_SIMPLE -压缩水平、垂直、对角线方向的元素,仅留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
 72     # print('轮廓坐标{}'.format(contours))
 73     # print(len(contours))
 74     # print('=============')
 75     contours = imutils.grab_contours(contours)
 76 
 77     for c in contours:
 78         area = cv2.contourArea(c)
 79         if area > 500:  # 异常点绿框阈值控制
 80             x, y, w, h = cv2.boundingRect(c)
 81             # cv2.rectangle(before, (x, y), (x + w, y + h), (0, 255, 0), 2)
 82             cv2.rectangle(after, (x, y), (x + w, y + h), (0, 255, 0), 2)
 83             # cv2.rectangle(diff_box, (x, y), (x + w, y + h), (0, 255, 0), 2)
 84 
 85     '''原始图片对比结果'''
 86     # cv2.imshow('before', before)
 87 
 88     '''更改后图片对比结果'''
 89     # cv2.imshow('after', after)
 90 
 91     '''灰度图片'''
 92     # cv2.imshow('diff', diff)
 93     # cv2.imshow('diff_box', diff_box)
 94 
 95     cv2.waitKey()
 96     cv2.destroyAllWindows()
 97     return after
 98 
 99 def put_pic_into_contrast(pic_name, after):
100     if not os.path.exists("contrast_jpg"):
101         os.makedirs(r'D:\opencvtest\contrast_jpg')
102     cv2.imwrite(r'D:\opencvtest\contrast_jpg\{}'.format(pic_name), after)
103 
104 def excel_workbook(pic_name, score, worksheet, row, col):
105     score *= 100
106     worksheet.write(row, col, pic_name)
107     worksheet.insert_image(row, col + 1, r'D:\opencvtest\old_jpg\{}'.format(pic_name),
108                                {'x_scale': 1, 'y_scale': 1})
109     worksheet.insert_image(row, col + 2, r'D:\opencvtest\contrast_jpg\{}'.format(pic_name),
110                                {'x_scale': 0.81, 'y_scale': 0.81})
111     worksheet.write(row, col + 3, str(round(score, 3))+'%')
112     print(row)
113 
114 def main(new_jpg_location, old_jpg_location):
115     workbook = xlsxwriter.Workbook('version_contrast.xlsx')
116     worksheet = workbook.add_worksheet("版本截图对比")
117     worksheet.set_column('A:A', 20)
118     worksheet.set_column('B:C', 40)
119     worksheet.set_column('D:D', 10)
120     worksheet.write(0, 0, '图片名称')
121     worksheet.write(0, 1, '旧版本截图')
122     worksheet.write(0, 2, '新版本截图')
123     worksheet.write(0, 3, '图像相似度')
124     row, col = 1, 0
125     for pic_name in find_all_pic(new_jpg_location, old_jpg_location):
126         # print(pic_name)
127         pic_old = r'D:\opencvtest\old_jpg\{}'.format(pic_name)
128         pic_new = r'D:\opencvtest\new_jpg\{}'.format(pic_name)
129 
130         score, diff, new_pic, old_pic = ssim_check(pic_new, pic_old)
131 
132         after = find_contours(diff, before = old_pic, after = new_pic)
133 
134         put_pic_into_contrast(pic_name, after = after)
135 
136         excel_workbook(pic_name, score, worksheet, row, col)
137         row += 1
138 
139 
140     workbook.close()
141 
142 
143 if __name__ == '__main__':
144     new_jpg_location = r'D:\opencvtest\new_jpg'
145     old_jpg_location = r'D:\opencvtest\old_jpg'
146     main(new_jpg_location, old_jpg_location)

 

标签:基于,old,pic,cv2,location,new,diff,对比,图片
From: https://www.cnblogs.com/pantom0122/p/17644592.html

相关文章

  • WordPress、Drupal和Joomla!等PHP系统的对比分析 - 开源CMS比较
    选择一个适合自己网站的内容管理系统(CMS)是非常重要的。在众多的选择中,我们经常听到的有WordPress、Drupal和Joomla!等PHP系统。本文将对这三个开源CMS进行详细的比较和分析,帮助您做出最佳选择。1.WordPressWordPress是目前最受欢迎的开源CMS之一,它简单易用且拥有强大的生态系统......
  • 随记:记几个查看图片及其隐藏信息的命令
    记几个查看图片及其隐藏信息的命令:1.Exiftool:查看图片的元数据信息安装:apt-getinstallexiftool使用:exiftoolpicname 2.Steghide查看、合并或者分离图片中的信息安装:apt-getinstallsteghide使用:Echo"hello,world">1.txt   //准备一个待写入图片的文件Steghideembed......
  • 自动上传博客图片
    背景​ 我们写博客难免需要大量图片,如果把图片一张张上传到博客相册再引用图片链接,就很麻烦。所以需要一种手段,让我们可以在本地写完博客内容后,自动把博客引用的图片传到网上,并在网上发布。​ 这时候就需要dotnet-cnblog :博客园文章快捷发布工具环境准备开启.net功能​ 我使......
  • 基于Java的校园打字练习系统的设计与实现-计算机毕业设计源码+LW文档
    一、研究目的和意义研究目的:随着互联网的进一步发展,打字这项技能几乎成为所以大学生的必备技能。校园打字系统已经成为大学生练习打字的重要帮手,它可以将古代和现代诗歌、网红文章、中外著名名著全部存储在里面,便于使用者自行选择文本进行练习打字;随着电脑的普及,各行各业都会有使......
  • 基于springboot校园管理系统的设计与实现
    研究的内容目前许多人仍将传统的纸质工具作为信息管理的主要工具,而网络技术的应用只是起到辅助作用。在对网络工具的认知程度上,较为传统的office软件等仍是人们使用的主要工具,而相对全面且专业的校园管理系统的信息管理软件仍没有得到大多数人的了解或认可。本选题宗旨在通过标签分......
  • 基于SpringBoot的在线视频教育平台的设计与实现
    拟解决的问题:(1)根据指导老师提供的原始材料和课题要求按照管理信息系统的生命周期开发方法和步骤,经过细致的系统分析、合理的系统设计,高效率的系统试试,引发web开发的思想,选择可行的开发工具,实现在线教育平台。本课题充分利用面向对象开发环境的可视化特点,合理的设计用户界面,按照数......
  • 基于springboot房产销售系统
    房产销售也都将通过计算机进行整体智能化操作,对于房产销售系统所牵扯的管理及数据保存都是非常多的,例如管理员;首页、个人中心、用户管理、销售经理管理、房源信息管理、房源类型管理、房子户型管理、交易订单管理、预约看房管理、评价管理、我的收藏管理、系统管理,用户;首页、个人中......
  • 基于hexo和aws云搭建个人博客,0基础0费用(2W字超详细图文教程)
    这是篇概述文章,详细参考Hexo建站专栏 最近几个月一直在整理之前的技术笔记,目前虽在体系上还尚有欠缺,但内容方面整理的七七八八了,这些内容一部分记录在了云笔记中另一部分记录在了博客上。于是决定搭建一个个人的技术博客网站以方便技术体系和相关资料的展示和推广,初步的想法和需求......
  • 基于Springboot学生读书笔记共享
    本文主要论述了如何使用JAVA语言开发一个读书笔记共享平台,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述读书笔记共享平台的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计......
  • 基于springboot母婴商城
    课题简介本课题后端使用SpringBoot+SpringCloud框架,前端采用html,JQuery,JS,DIV+CSS技术进行编程,设计在线商城。系统具有前台和后台两大服务。前台主要有用户登录注册、浏览商品、加入购物车、提交订单、支付等模块;后台主要有商品管理、用户管理、订单管理、分类管理等模块。课题内容......