用openCV和Python 实现图片对比,并标识出不同点的方式
2020-03-11 17:36
701 查看
最近项目中需要实现两组图片对比,并能将两者的区别标识出来。
在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下:
想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Python 两个工具以及scikit-image和imutils两个库:
安装方法,在这里不多说,我安装的是Python3.6 和openCV2,安装方法网上自行百度谷歌;
进入正题:
新建一个新的Python文件并命名为copmarePicture.py,写入下面的代码:
from skimage.measure import compare_ssim #~ import skimage as ssim import argparse import imutils import cv2
加载两张图片并将他们转换为灰度:
imageA = cv2.imread("D:/111test/111.png") imageB = cv2.imread("D:/111test/444.png") grayA = cv2.cvtColor(imageA,cv2.COLOR_BGR2GRAY) grayB = cv2.cvtColor(imageB,cv2.COLOR_BGR2GRAY)
接下来,计算两个灰度图像之间的结构相似度指数:
(score,diff) = compare_ssim(grayA,grayB,full = True) diff = (diff *255).astype("uint8") print("SSIM:{}".format(score))
找到不同点的轮廓以致于我们可以在被标识为“不同”的区域周围放置矩形:
thresh = cv2.threshold(diff,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] cnts = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if imutils.is_cv2() else cnts[1]
找到一系列区域,在区域周围放置矩形:
for c in cnts: (x,y,w,h) = cv2.boundingRect(c) cv2.rectangle(imageA,(x,y),(x+w,y+h),(0,0,255),2) cv2.rectangle(imageB,(x,y),(x+w,y+h),(0,0,255),2)
用cv2.imshow 展现最终对比之后的图片, cv2.imwrite 保存最终的结果图片
cv2.imshow("Modified",imageB) cv2.imwrite("haha2.png",imageB) cv2.waitKey(0)
到这已经实现两张图片的对比并标识出不同。结果如下所示:(图1图2对比,图3为对标结果
以上这篇用openCV和Python 实现图片对比,并标识出不同点的方式就是小编分享给大家的全部内容了,希望能给大家一个参考
您可能感兴趣的文章:
相关文章推荐
- 如何利用Python3和OpenCV对比两张图片的不同,提取差异性
- 用python实现对比两张图片的不同
- Python实现图片裁剪的两种方式(Pillow和OpenCV)
- 用调整法和插入法建堆的Python实现,不同建堆方式对堆排序性能的影响
- 生成大量随机字符串不同实现方式的效率对比
- 不同方式实现的strcpy函数 使用时间对比
- 图片像素对比OpenCV实现,实现人工分割跟算法分割图像结果的对比
- Python OpenCV实现图片上输出中文
- 利用OpenCV和Python实现查找图片差异
- PCA实现步骤及其与opencv中PCA实现方式的对比
- python-opencv实现切变换,不裁减图片
- python3.6+opencv3.4实现鼠标交互查看图片像素
- python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
- python 使用socket传输图片视频等文件的实现方式
- opencv 矩阵元素不同获取方式及其效率对比
- 生成大量随机字符串不同实现方式的效率对比
- 通过OpenCV修改图片某一像素的数值 Python实现
- python通过opencv实现批量剪切图片
- python实战===用python对比两张图片的不同
- Python实现基于OpenCV批量旋转图片