python图像处理工具opencv练习:比较图像差异

为了计算两幅图像之间的差异,我们将利用Wang等人介绍的结构相似性指数:Image Quality Assessment: From Error Visibility to Structural Similarity。此方法已在scikit-image库中实现,论文下载:https://itbooks.pipipan.com/fs/18113597-326895607 。

首先需要安装Python,OpenCV,scikit-image和imutils。

计算图像差异

你能发现这两个图像之间的区别吗?

图片.png

代码:

执行结果

图片.png

源码: https://github.com/china-testing/python-api-tesing/blob/master/practices/cv/image_diff_pil.py 代码及配套图片:https://itbooks.pipipan.com/fs/18113597-326879233

使用scikit-image中的compare_ssim函数,我们计算得分和差异图像diff。

分数表示两个输入图像之间的结构相似性指数。 该值在[-1,1]范围内,值为1是“完美匹配”。

差异图像包含我们希望可视化的两个输入图像之间的实际图像差异。 差异图像当前表示为[0,1]范围内的浮点数据类型,因此我们首先将数组转换为[0,255]范围内的8位无符号整数,然后我们才能使用OpenCV进一步处理它 。

然后我们找到轮廓,以便我们可以在标识为“不同”的区域周围放置矩形。 。我们使用门限cv2.THRESH_BINARY_INV和cv2.THRESH_OTS。参考:https://docs.opencv.org/trunk/d7/d4d/tutorial_py_thresholding.html。

下面图4中的图像清楚地显示了已被操纵的图像的ROI:

图片.png

我们将轮廓存储在列表中,并为图像的不同区域周围绘制矩形:

使用cv2.boundingRect函数计算轮廓周围的边界框。然后我们使用这些值在cv2.rectangle的图像上绘制红色矩形。此时可以基于长宽,过滤掉过小的矩形区域。

执行: python image_diff.py --first images/original_01.png --second images/modified_01.png

图片.png

参考资料

更多实例

$ python image_diff.py --first images/original_02.png --second images/modified_02.png

图片.png

$ python image_diff.py --first images/original_03.png --second images/modified_03.png

图片.png

参考资料

links