Python笔记-使用SSIM找两张图不同及使用Opencv显示
Posted IT1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python笔记-使用SSIM找两张图不同及使用Opencv显示相关的知识,希望对你有一定的参考价值。
运行截图如下:
这里有几点要注意的:
①对比两张图片的函数SSIM具体是structural_similarity:
Ⅰ:第一个参数和第二个参数是要对比的两张图片;
Ⅱ:参数中有个full,默认为True,如果为True会把两张图的相似部分返回,如果为False就不返回了;
Ⅳ:返回值full为False的时候有2个,一个是mssim浮点型的相似度,1代表2张图一模一样。0代表完全不一样,grad返回两张图片不同的地方类型为ndarray;
②SSIM返回的ndarray里面的值为[0, 1]的float型,而OpenCV的[0, 255]为uint8型,可以通过这样的方式转换:
Ⅰ:diff = (diff * 255).astype("uint8")
③cv2.threshold函数,设置一个阈值和一个颜色,将传入的图片没有达到这个阈值的,转换为这个颜色。
源码如下:
from skimage.metrics import structural_similarity
import cv2
import numpy as np
if __name__ == '__main__':
before = cv2.imread('./pic/demo1.png')
after = cv2.imread('./pic/demo2.png')
# Convert images to grayscale
before_gray = cv2.cvtColor(before, cv2.COLOR_BGR2GRAY)
after_gray = cv2.cvtColor(after, cv2.COLOR_BGR2GRAY)
# Compute SSIM between two images
(score, diff) = structural_similarity(before_gray, after_gray, full=True)
print("Image similarity", score)
# The diff image contains the actual image differences between the two images
# and is represented as a floating point data type in the range [0,1]
# so we must convert the array to 8-bit unsigned integers in the range
# [0,255] before we can use it with OpenCV
diff = (diff * 255).astype("uint8")
# Threshold the difference image, followed by finding contours to
# obtain the regions of the two input images that differ
thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
contours = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
mask = np.zeros(before.shape, dtype='uint8')
filled_after = after.copy()
for c in contours:
area = cv2.contourArea(c)
if area > 40:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(before, (x, y), (x + w, y + h), (36, 255, 12), 2)
cv2.rectangle(after, (x, y), (x + w, y + h), (36, 255, 12), 2)
cv2.drawContours(mask, [c], 0, (0, 255, 0), -1)
cv2.drawContours(filled_after, [c], 0, (0, 255, 0), -1)
cv2.imshow('before', before)
cv2.imshow('after', after)
cv2.imshow('diff', diff)
cv2.imshow('mask', mask)
cv2.imshow('filled after', filled_after)
cv2.waitKey(0)
以上是关于Python笔记-使用SSIM找两张图不同及使用Opencv显示的主要内容,如果未能解决你的问题,请参考以下文章