【发布时间】:2010-08-10 09:19:31
【问题描述】:
我正在尝试检测一维直方图中的第一个谷值,以用作阈值点。 (处理从暗到亮/从左到右)
不幸的是,有些直方图有小峰、间隙和锯齿状边缘。我写的算法被困在这些上面。我认为我需要平滑粗糙的边缘,因为我需要的峰谷非常突出。
有没有人指出在 OpenCV 中平滑一维直方图的最佳方法?
这显示了算法在锯齿状边缘被卡住并失败的地方:
【问题讨论】:
我正在尝试检测一维直方图中的第一个谷值,以用作阈值点。 (处理从暗到亮/从左到右)
不幸的是,有些直方图有小峰、间隙和锯齿状边缘。我写的算法被困在这些上面。我认为我需要平滑粗糙的边缘,因为我需要的峰谷非常突出。
有没有人指出在 OpenCV 中平滑一维直方图的最佳方法?
这显示了算法在锯齿状边缘被卡住并失败的地方:
【问题讨论】:
尝试模糊直方图或图像。
谷可能存在,因为并非所有图像照明级别都用于源图像。您可以通过在制作直方图之前模糊图像来轻松解决此问题。或者尝试做一些直方图移动平均,这样突然的变化就会消失。
【讨论】:
在我看来,您正在执行某种细分。您可以尝试使用自适应算法来执行此操作,该算法通过计算点的一些平均值来设置阈值本身。该特定算法假定边界点代表背景,而其余点代表对象。算法如下:
calculate u1 -> the grayscale average of boundary points
calculate u2 -> the grayscale average of all other points
T_old = 0
T_new = (u1 + u2) / 2
while (T_new != T_old)
//you might want to modify this by introducing an epsilon value, something like
// if T_new near T_old (abs(T_new-T_old)>1)
u1 = grayscale average of points where grayscale intensity is lower than T_new
u2 = grayscale average of points where grayscale intensity is higher or equal to T_new
T_old =T _new
T_new = (u1 + u2) / 2
end
threshold = T_new
这应该找到灰度图像的接近最佳阈值。
【讨论】:
克服这个问题的可能方法:
【讨论】: