Daw*_*wid 2 python numpy image image-processing scikit-image
我正在尝试遵循scikit-image中有关模板匹配的教程(在此处检查)。
仅使用此示例,我想找到图像中所有匹配的硬币(最大值),而不仅仅是得分最高的硬币。我在考虑使用:
maxima = argrelextrema(result, np.greater)
Run Code Online (Sandbox Code Playgroud)
但是问题在于它还发现了很小的局部最大值,这只是一种噪声。有什么办法可以筛选numpy数组并找到最强的最大值?谢谢!
要找到所有硬币,文档建议“ ...您应该使用适当的峰值发现功能”。 其中最简单的可能是peak_local_max(如注释中所建议),也来自skimage,并在此处提供了手册页。在* args中使用一些合理的数字可使峰值脱离响应图像。
文档中还讨论了有关峰顶移位的第二条评论
“请注意,match_template输出中的峰值与模板的原点(即左上角)相对应。”
可以手动纠正此问题(通过将峰与模板的边长平移),也可以将pad_inputbool 设置为True(source),这是副产品,意味着响应函数中的峰与中心对齐模板在最大重叠点的角度。
将这两位合并到脚本中,我们得到如下结果:
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage.feature import match_template
from skimage.feature import peak_local_max # new import!
image = data.coins()
coin = image[170:220, 75:130]
result = match_template(image, coin,pad_input=True) #added the pad_input bool
peaks = peak_local_max(result,min_distance=10,threshold_rel=0.5) # find our peaks
# produce a plot equivalent to the one in the docs
plt.imshow(result)
# highlight matched regions (plural)
plt.plot(peaks[:,1], peaks[:,0], 'o', markeredgecolor='r', markerfacecolor='none', markersize=10)
Run Code Online (Sandbox Code Playgroud)