我有以下问题。我想进行基于区域的分割,如图像分割教程http://scikit-image.org/docs/dev/user_guide/tutorial_segmentation.html中提供的那样。本教程非常清楚。但是对于他们来说,使用灰度直方图的极端部分的部分对我来说还不清楚。他们使用以下直方图的值30和150,而没有说明如何获取它们:
现在我的问题是如何获得这些外部极值?
答案 0 :(得分:1)
尽管图像为2D,但灰度值的直方图仅为1D。找到峰值或最大值基本上等于搜索具有比所有相邻点更高的值的点。
但是,由于您的直方图曲线不平滑,请注意,如果您进行天真的搜索,由于微小的振荡,您会发现很多局部峰。
您想要的是使用曲线的“粗糙”版本找到最大值。您可以先对其进行平滑处理。这是通过使用低通滤波器进行卷积来完成的,这类似于对某个窗口内的值进行局部加权平均。
scipy.signal.find_peaks_cwt将自动平滑阵列并为您返回其峰。您所需要做的就是指定您想要查找的峰的预期宽度。
这将为您提供峰的索引。如果您想要“外部”的,只需选择第一个和最后一个即可。然后使用这些索引找到相应的直方图块(灰度值)。
注意,但是,通常对于基于区域的分割,相关峰可能并不总是外部峰!对于特定的硬币图像,确实是这种情况,但是您可能需要根据图像进行一些试验。当背景和前景之间的对比度很高(并且两者大致相同)时,更可能发生这种情况。在您参考的教程中,在我看来,峰实际上是通过(人类)检查直方图来选择的。