对于一个学校项目,我正在尝试用 Python 编写一个程序来跟踪学生的运动。为了做到这一点,我正在使用 OpenCV。 在互联网上查找了一些教程后,我注意到几乎每个人都在使用阈值来实现这一点,因为几乎每一步都需要二进制图像(例如 HoughCircle Transofrmation、Contours)。然而,据我了解,阈值对光极其敏感,因此这种方法只能在最佳闪电条件下返回良好的结果。 所以我的问题是:除了对图像进行阈值处理之外,还有其他替代方法或更好的方法吗?或者我对 OpenCV 阈值的理解一开始就是错误的?
这是一个示例图像:
最佳答案
阈值处理的目的是从背景中分割所需的对象,然后您可以执行额外的处理(应用形态学操作),然后执行轮廓过滤以进一步隔离所需的对象。阈值处理允许我们获得二值图像,而不是在 BGR(3 channel )图像或范围 [0...255]
的灰度(1 channel )图像上应用图像处理技术,每个像素都是 0
或 1
,这使得区分对象变得更容易。根据您的情况,获取二值图像的方法有很多种,这里介绍几种方法:
cv2.Canny
- Canny 边缘检测,使用 minVal 和 maxVal 来确定边缘cv2.threshold
- 用户选择任意全局阈值的简单阈值cv2.threshold
+cv2.THRESH_OTSU
- Otsu 的阈值自动计算阈值。cv2.adaptiveThreshold
- 自适应阈值处理,其中图像在不同区域具有不同的照明条件。本质上,它会自动计算图像不同区域的阈值,并对不同照明的图像给出更好的结果cv2.inRange
- 颜色分割。这个想法是使用下限和上限阈值范围来获得二值图像。在尝试隔离单一颜色范围时很有用
关于python - 适应不同雷电条件的OpenCV阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60110313/