当前位置:   article > 正文

使用OpenCV和Python进行图像比对_python opencv 图像对比

python opencv 图像对比

原文参考这里
例如,我们想要对比下面两张图的不同
在这里插入图片描述
先安装scikit-imageimutils这两个库

pip install scikit-image
pip install imutils
  • 1
  • 2

安装完成后在执行from skimage.measure import compare_ssim时报错AttributeError: module 'skimage.measure' has no attribute 'compare_ssim'
因为自动安装了最新版本的scikit,新版本的skimage的内置程序被重置了,可以卸载scikit-image之后重装一个旧版本,如下pip install scikit-image==0.15.0
完整代码如下,注释均在代码里。

import argparse
import imutils
import cv2
from skimage.measure import compare_ssim

# # 建立两个命令行参数,-first和-second,用于两个图像的路径
# ap = argparse.ArgumentParser()
# ap.add_argument("-f", "--first", required=True, help = "first input image")
# ap.add_argument("-s", "--second", required=True, help= "second input image")
# args = vars(ap.parse_args())

imageA = cv2.imread('imageA.jpg')
imageB = cv2.imread('imageB.jpg')
rowA, colA, channelA = imageA.shape
rowB, colB, channelB = imageB.shape
print([rowA, colA, channelA], [rowB, colB, channelB])
# 将imageA和imageB处理成同样尺寸
imageB = cv2.resize(src = imageB, dsize=(colA, rowA))
# x, y, z = imageB.shape
# print([x,y,z])


#转为灰度图
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
garyB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
cv2.imshow('grayA', grayA)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 计算两个灰度图之间的结构相似性指数SSIM,得到score得分和差异图像diff
# score表示两个输入图像之间的结构相似性指数,可以落在[-1,1]范围内,值为1
# 是“完美匹配”
# diff包含实际“图像的差异”,我们希望可视化这个diff,diff当前表示[0,1]
# 范围内的浮点数据类型,首先将数组转换为[0,255]范围内的8位无符号整数,才能
# 进一步用openCV处理
(score, diff) = compare_ssim(X = grayA, Y = garyB, full=True)
diff = (diff * 255).astype("uint8")
print("SSIM:{}".format(score))

# 现在,让我们找到轮廓,以便我们可以在标识为“不同”的区域周围放置矩形
# 使用cv2.THRESH_BINARY_INV和cv2.THRESH_OTSU对diff进行阈值处理
thresh = cv2.threshold(src=diff, thresh = 0, maxval=255, type = cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# cnts为轮廓
cnts = imutils.grab_contours(cnts)

for c in cnts:
    # compute the bounding box of the contour and then draw the
    # bounding box on both input images to represent where the two
    # images differ
    (x, y, w, h) = cv2.boundingRect(c) #计算轮廓周围的边界框,矩形的宽度/高度为w/h
    cv2.rectangle(imageA, (x,y), (x+w, y+h), (0, 0, 255), 2) #用x, y, w, h绘制红色矩形
    cv2.rectangle(imageB, (x,y), (x+w, y+h), (0, 0, 255), 2)

# show the output images
cv2.imshow("Original", imageA)
cv2.imshow("Modified", imageB)
cv2.imshow("Diff", diff)
cv2.imshow("Thresh", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

最后呈现的效果如下,没有原文那么完美,因为我是两幅图分别截图后保存,再调整两幅图的尺寸一致,与理想有偏差,无法保证除了右下角外所以地方都完全一致,还需改进。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/103733?site
推荐阅读
相关标签
  

闽ICP备14008679号