用cv2.matchTemplate找图像的不同

作者 : RY    标签: opencv matchtemplate

用OpenCV的matchTemplate()函数找两幅图像中的不同点,本文中的图像为公司内部交流杂志中的题目,答对了有奖品拿。

首先载入两幅图像,我们需要找出两幅图之间除了网格线之外的不同之处。

In [11]:
import cv2
import numpy as np
In [5]:
%matplotlib inline
from matplotlib import pyplot as plt
In [134]:
img1 = cv2.imread("image1.png", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("image2.png", cv2.IMREAD_GRAYSCALE)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 16))
ax1.imshow(img1, cmap="gray")
ax2.imshow(img2, cmap="gray");

直接调用cv2.matchTemplate()cv2.minMaxLoc()img1中寻找img2最匹配的坐标,然后显示对齐之后两幅图像的差值,越白的区域表示差值越大。由下面的差值图像可以看出,两幅图像以中心部分对齐,所以中心部分偏黑,但是四周的区域都没有对齐,因此显示很多表示边缘的亮线条。从这副差值图像中我们只能找出一点不同之处。

In [135]:
match = cv2.matchTemplate(img1, img2, cv2.TM_CCORR_NORMED)
offset_x, offset_y = cv2.minMaxLoc(match)[-1]
w, h = 1000, 700
slice1 = img1[offset_y:offset_y+h, offset_x:offset_x+w].astype(np.float)
slice2 = img2[:h,:w].astype(np.float)
plt.figure(figsize=(12, 8))
plt.imshow(np.abs(slice1-slice2), cmap="gray");