【问题标题】:OpenCV findContours, how to check colors on both sidesOpenCV findContours,如何检查两边的颜色
【发布时间】:2018-07-27 14:24:18
【问题描述】:

我有一个使用精明边缘检测器派生的Mat 对象,我使用findContours 函数从此类图像中提取了轮廓。现在我想对每一个这样的轮廓做的就是以某种方式检查两边的颜色。

对于“颜色”位,我已经离散化 HSI 颜色空间,但是对于如何在给定轮廓的两侧“挑选颜色”感到非常困惑。

有没有办法轻松做到这一点?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    您可以使用您应用 Canny 边缘检测器的图像来执行此操作。获取该图像的gradient。梯度是一个向量。如 wiki 页面图像所示(如下所示),梯度指向增长率最大的方向。如果采用负梯度,则它指向下降率最大的方向。因此,如果您在轮廓点处对图像的梯度进行采样,则这些点处的正梯度和负梯度应指向轮廓点两侧的区域。因此,您可以沿这些方向对点进行采样,以了解您想要的颜色。

    图像渐变:

    示例 python 代码显示了如何为下面显示的简单图像完成此操作。它使用 Sobel 计算梯度。

    输入图片:

    Canny 边缘和采样点:

    绿色:轮廓上的点

    红色:指向正梯度方向

    蓝色:指向负梯度方向

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    im = cv2.imread('grad.png', 0)
    
    dx = cv2.Sobel(im, cv2.CV_32F, 1, 0)
    dy = cv2.Sobel(im, cv2.CV_32F, 0, 1)
    edge = cv2.Canny(im, 64, 192)
    
    dx = dx / np.sqrt(dx*dx + dy*dy + 0.01)
    dy = dy / np.sqrt(dx*dx + dy*dy + 0.01)
    
    r = 20
    
    y, x = np.nonzero(edge)
    
    pos1 = (np.int32(x[128]+r*dx[y[128], x[128]]), np.int32(y[128]+r*dy[y[128], x[128]]))
    pos2 = (np.int32(x[128]-r*dx[y[128], x[128]]), np.int32(y[128]-r*dy[y[128], x[128]]))
    
    im2 = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)
    cv2.circle(im2, pos1, 10, (255, 0, 0), 1)
    cv2.circle(im2, pos2, 10, (0, 0, 255), 1)
    cv2.circle(im2, (x[128], y[128]), 10, (0, 255, 0), 1)
    
    plt.imshow(im2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2018-03-20
      相关资源
      最近更新 更多