首页 > 解决方案 > 为什么 scipy.signal.correlate2d 在这个例子中不能工作?

问题描述

我正在尝试交叉关联两个图像,从而通过找到最大相关值将模板图像定位在第一个图像上。我画了一个带有一些随机形状的图像(第一张图像),并剪下其中一个形状(模板)。现在,当我使用 scipy 的 correlate2d 并在与最大值的相关性中定位点时,会出现几个点。据我所知,不应该只有一个重叠最大的点吗?

这个练习背后的想法是获取图像的某些部分,然后将其与数据库中的一些先前图像相关联。然后我应该能够根据相关性的最大值在旧图像上定位这部分。

我的代码看起来像这样:

from matplotlib import pyplot as plt
from PIL import Image 
import scipy.signal as sp

img = Image.open('test.png').convert('L')
img = np.asarray(img)

temp = Image.open('test_temp.png').convert('L')
temp = np.asarray(temp)
corr = sp.correlate2d(img, temp, boundary='symm', mode='full')

plt.imshow(corr, cmap='hot')
plt.colorbar()

coordin = np.where(corr == np.max(corr)) #Finds all coordinates where there is a maximum correlation

listOfCoordinates= list(zip(coordin[1], coordin[0]))

for i in range(len(listOfCoordinates)): #Plotting all those coordinates
    plt.plot(listOfCoordinates[i][0], listOfCoordinates[i][1],'c*', markersize=5)

这产生了这个数字: 青色星是具有最大相关值 (255) 的点

我希望“corr”中只有一个点具有相关的最大值,但会出现几个。我尝试使用不同的关联模式,但无济于事。

这是我在关联时使用的测试图像
这是模板,从原始图像中剪下

任何人都可以对我在这里可能做错的事情有所了解吗?

标签: pythonscipy

解决方案


申请

img = img - img.mean()
temp = temp - temp.mean()

在计算 2D 互相关之前corr应该会给你预期的结果。

清理代码,一个完整的例子:

from imageio import imread
from matplotlib import pyplot as plt
import scipy.signal as sp
import numpy as np

img = imread('https://i.stack.imgur.com/JL2LW.png', pilmode='L')
temp = imread('https://i.stack.imgur.com/UIUzJ.png', pilmode='L')

corr = sp.correlate2d(img - img.mean(), 
                      temp - temp.mean(),
                      boundary='symm',
                      mode='full')

# coordinates where there is a maximum correlation
max_coords = np.where(corr == np.max(corr))

plt.plot(max_coords[1], max_coords[0],'c*', markersize=5)
plt.imshow(corr, cmap='hot')

推荐阅读