查找峰值的方法(简单的阈值)当然对阈值的选择非常敏感:将阈值设置得太低,您将“检测”出不是峰值的事物。设置得太高,您将错过有效的峰值。
有更健壮的替代方案,它将检测图像强度中的所有局部最大值,而不管其强度值如何。我的首选方法是应用具有较小(5x5或7x7)结构元素的膨胀,然后找到原始图像及其膨胀版本具有相同值的像素。之所以起作用,是因为根据定义,dilation(x,y,E,img)= {E内以像素(x,y)为中心的img的最大值}},因此dilation(x,y,E,img)= img(x ,y)每当(x,y)是E尺度??上的局部最大值的位置。
随着形态运算符的快速实现(例如,OpenCV中的一个),该算法在空间和时间上图像的大小都是线性的(一个额外的图像大小的缓冲区用于膨胀图像,一个在两者上传递)。紧要关头,它也可以在线实现,而无需额外的缓冲区和一点点的复杂性,并且它仍然是线性时间。
要在存在盐和胡椒粉或类似噪声(可能会引入许多错误的最大值)的情况下进一步增强其稳定性,可以对结构大小不同的元素(例如5x5和7x7)应用两次该方法,然后仅保留稳定的元素。最大值,可以通过不变最大值的位置或不超过一个像素的位置变化来定义稳定性,等等。此外,当您有理由认为它们是由噪声引起的时,您可能希望抑制附近的较低最大值。一种有效的方法是首先检测上述所有局部最大值,按高度降序对它们进行排序,然后在排序后的列表中查找并保留它们,如果它们在图像中的值未更改,并且将其保留,则将其设置为将(2d + 1)x(2d + 1)邻域中的所有像素归零,其中d是您愿意容忍的附近最大值之间的最小距离。