python - 为什么 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”中只有一个点具有相关的最大值,但会出现几个。我尝试使用不同的关联模式,但无济于事。
这是我在关联时使用的测试图像。
这是模板,从原始图像中剪下。
任何人都可以对我在这里可能做错的事情有所了解吗?
解决方案
申请
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')
推荐阅读
- javascript - 来自缩小文件的全局变量在 js 文件中未定义?
- linux - 在 linux 中生成 Gsettings 架构文件
- apache-calcite - 测试我自己的适配器时如何使用 CalciteAssert?
- adsense - 如何防止 AdSense 广告在同一窗口中加载广告客户网站
- python - 从 postgreSQL 中的邮政编码/邮政编码获取时区
- excel - 链接到其他工作簿的单元格不显示小数位
- powershell - PowerShell 和 CSV:如何导入单元格的内容?(没有“@”和括号,只是内容)
- google-bigquery - 如何过滤掉谷歌bigquery中的空值
- python - Pexpect 脚本为输出提供“无”
- javascript - 按下外模态时停止关闭模态