openCV 负值阈值处理

1 投票
1 回答
1343 浏览
提问于 2025-04-18 08:04

我正在尝试计算运动光流,并且想通过设定阈值来减少噪音,也就是把一些小的值去掉。在计算运动流的时候,我也得到了负值,我希望保留这些负值,但一旦我设定了阈值,这些负值就被丢掉了。

我考虑过使用绝对值来解决这个问题,但这样的话,我怎么才能把负值找回来呢?

另外,我正在使用numpy数组,如果这有帮助的话:

flow = cv2.calcOpticalFlowFarneback(frameGray, frame1Gray, 0.5,1,3,15,3,5,1)

thresh_flow = cv2.threshold(np.absolute(flow), 5, 255, cv2.THRESH_TOZERO)

1 个回答

2

Numpy提供了非常强大的索引功能。其中一种就是使用布尔数组进行索引。你可以把符合某个条件的元素赋值为特定的值,这正是你想要的。例如,

threshold = 2
flow[np.abs(flow) < threshold] = 0

这段代码会把flow中绝对值太接近零的每个元素进行处理。假设flow的内容是这样的:

[ 1  2  3]
[-1 -2 -3]

执行这个操作后的结果将是:

[0  2  3]
[0 -2 -3]

这样就正确地去掉了绝对值很小的正负元素,同时保留了负元素的符号。

撰写回答