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显示的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SSIM 确定图像质量?

不同图像分辨率之间的 SSIM

如何度量两幅图像的相似度--结构相似度 SSIM 原理及代码

python对比两张EXCEL表,将不同的数据生成新表?

opencv如何让两张图在下方

计算两张图片相似度的方法总结