Python:寻找二维图像直方图的外峰
Python: Finding the outer peaks of a 2d image histogram
我有以下问题。我想像图像分割教程 http://scikit-image.org/docs/dev/user_guide/tutorial_segmentation.html 中提供的那样进行基于区域的分割。教程很清楚。但是他们使用灰度值直方图的极端部分的部分对我来说似乎不清楚。他们使用以下直方图的值 30 和 150,但没有解释如何获取它们:
现在我的问题是如何得到这些外极值?
虽然你的图像是二维的,但你的灰度值直方图只是一维的。查找峰值或最大值基本上相当于搜索值高于所有相邻点的点。
但是,由于您的直方图曲线不平滑,请注意,如果您进行简单的搜索,您会发现许多由于微小振荡而导致的局部峰值。
您想要的是使用 "coarser" 版本的曲线找到最大值。你可以通过先平滑它来获得它。这是通过与低通滤波器的卷积来完成的,这类似于对某个 window.
内的值执行局部加权平均
scipy.signal.find_peaks_cwt 会自动为您平滑数组和 return 它的峰值。您需要做的就是指定您有兴趣查找的峰的预期宽度。
这将为您提供峰的索引。如果您想要 "outer" 个,只需选择第一个和最后一个。然后使用这些索引找到相应的直方图箱(灰度值)。
注意,但是,对于一般基于区域的分割,相关峰可能并不总是外部峰!这恰好是特定硬币图像的情况,但您可能需要根据图像进行一些试验。当背景和前景之间存在高对比度(并且它们大致相同)时,更有可能发生这种情况。在您提到的教程中,在我看来,峰值实际上是通过(人工)检查直方图来选择的。
我有以下问题。我想像图像分割教程 http://scikit-image.org/docs/dev/user_guide/tutorial_segmentation.html 中提供的那样进行基于区域的分割。教程很清楚。但是他们使用灰度值直方图的极端部分的部分对我来说似乎不清楚。他们使用以下直方图的值 30 和 150,但没有解释如何获取它们:
现在我的问题是如何得到这些外极值?
虽然你的图像是二维的,但你的灰度值直方图只是一维的。查找峰值或最大值基本上相当于搜索值高于所有相邻点的点。
但是,由于您的直方图曲线不平滑,请注意,如果您进行简单的搜索,您会发现许多由于微小振荡而导致的局部峰值。
您想要的是使用 "coarser" 版本的曲线找到最大值。你可以通过先平滑它来获得它。这是通过与低通滤波器的卷积来完成的,这类似于对某个 window.
内的值执行局部加权平均scipy.signal.find_peaks_cwt 会自动为您平滑数组和 return 它的峰值。您需要做的就是指定您有兴趣查找的峰的预期宽度。
这将为您提供峰的索引。如果您想要 "outer" 个,只需选择第一个和最后一个。然后使用这些索引找到相应的直方图箱(灰度值)。
注意,但是,对于一般基于区域的分割,相关峰可能并不总是外部峰!这恰好是特定硬币图像的情况,但您可能需要根据图像进行一些试验。当背景和前景之间存在高对比度(并且它们大致相同)时,更有可能发生这种情况。在您提到的教程中,在我看来,峰值实际上是通过(人工)检查直方图来选择的。