我正在尝试检测一维直方图中的第一个谷,以用作阈值点。 (处理暗到亮/从左到右)
不幸的是,一些直方图具有迷你峰,间隙和锯齿状边缘。我写的算法就是卡在这些上面。我认为我需要平滑粗糙的边缘,因为我需要的山峰非常突出。
有没有人对在OpenCV中平滑一维直方图的最佳方法有一些指示?
这显示了算法陷入锯齿状边缘并失败的地方:
http://applist.s3.amazonaws.com/junk/failed.png
蓝线:峰值
红线:山谷
答案 0 :(得分:2)
尝试模糊直方图或图像。
valeys可能存在,因为并非所有图像照明级别都在源图像上使用。在进行直方图之前,您可以通过模糊图像轻松解决此问题。或者尝试做一些直方图移动平均线,这样突然的变化就会消失。
答案 1 :(得分:1)
在我看来,你正在进行某种分割。您可以尝试使用自适应算法执行此操作,该算法通过计算点的某些平均值来设置阈值本身。该特定算法假设边界点代表背景,而其余点代表对象。这是算法:
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
这应该找到灰度图像的接近最佳阈值。
答案 2 :(得分:0)
克服这个问题的可能方法: