最近项目中需要实现两组图片对比,并能将两者的区别标识出来。
在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下:
想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Python 两个工具以及scikit-image和imutils两个库:
安装方法,在这里不多说,我安装的是Python3.6 和openCV2,安装方法网上自行百度谷歌;
进入正题:
新建一个新的Python文件并命名为copmarePicture.py,写入下面的代码:
from skimage.measure
import compare_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为对标结果