OpenCV:带降噪的对象跟踪

时间:2018-10-09 18:10:13

标签: python opencv image-segmentation

我正在尝试提取一个蓝色对象,非常类似于https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html#object-tracking中描述的对象

具有三个要提取的蓝色形状的原始图像的示例在这里:

Three shapes that should be segmented

捕获的图像有噪点,未经过滤的形状检测会返回数百到数千个“蓝色”形状。为了减轻这种情况,我应用了以下步骤:

  • 在过滤图像之前模糊图像,导致表面闭合
  • 将蒙版图像(bitwise_and之后)转换回灰度
  • 应用OTSU阈值
  • 最后,检测轮廓

完整的代码是:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
while(True):
    ret, frame = cap.read()
    blur = cv2.GaussianBlur(frame, (15, 15), 0)

    hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
    lower_red = np.array([115, 50, 50])
    upper_red = np.array([125, 255, 255])
    mask = cv2.inRange(hsv, lower_red, upper_red)
    blue = cv2.bitwise_and(blur, blur, mask=mask)
    gray = cv2.cvtColor(blue, cv2.COLOR_BGR2GRAY)

    (T, ted) = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

    im2, contours, hierarchy = cv2.findContours(
        ted, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    for cnt in contours:
        cv2.drawContours(frame, [cnt], 0, (0, 255, 0), 3)

    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(frame, str(len(contours)), (10, 500), font, 2, (0, 0, 255), 2, cv2.LINE_AA)

    cv2.imshow('mask', mask)
    cv2.imshow('blue', blue)
    cv2.imshow('grey', gray)
    cv2.imshow('thresholded', ted)
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

不幸的是,还剩下6-7个轮廓,而应该有三个。

如何进一步优化图像处理以仅获得三种形状?

1 个答案:

答案 0 :(得分:1)

您可以将形态学运算与关联的成分分析结合使用:

如果您要查找的是特定形状(例如形状),则可以使用一些形状描述符。

最后,我建议您尝试用双边滤波器(https://docs.opencv.org/3.0-beta/modules/imgproc/doc/filtering.html#bilateralfilter)替换高斯滤波器,以更好地保留形状。如果您想要更好的过滤器,请查看有关NL-均值过滤器(https://docs.opencv.org/3.3.1/d5/d69/tutorial_py_non_local_means.html)的本教程