【问题标题】:Python OpenCV - cv.inRange() "sensitivity"?Python OpenCV - cv.inRange()“敏感度”?
【发布时间】:2017-01-16 18:49:52
【问题描述】:
img = cv2.imread('/home/user/Documents/workspace/ImageProcessing/img.JPG');
image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

#red, blue, yellow, and gray
boundaries = [
([17, 15, 100], [50, 56, 200]),
([86, 31, 4], [220, 88, 50]),
([25, 146, 190], [62, 174, 250]),
([103, 86, 65], [145, 133, 128])]


for i, (lower, upper) in enumerate(boundaries):

    lower = np.array(lower, dtype="uint8")
    upper = np.array(upper, dtype="uint8")

    mask = cv2.inRange(image, lower, upper)
    output = cv2.bitwise_and(image, image, mask=mask)

    cv2.imwrite(str(i) + 'image.jpg', output)

我正在尝试从图像中分离出红色、蓝色、黄色和灰色(分别)。 到目前为止它正在工作,但是“灵敏度”很低。 该算法缺少一些较小的色点。 有没有办法校准这个? 谢谢!

编辑: 输入图像

输出

【问题讨论】:

  • 如果您还可以添加输入/输出图像,这将有助于我们更好地理解问题。

标签: python opencv image-processing color-detection


【解决方案1】:

inRange 函数没有内置灵敏度。它只比较值。 inRange(x,10,20) 只会给你 {10,11,...,20}。

克服这个问题的一种方法是引入您自己的敏感度度量。

s = 5 # for example sensitivity=5/256 color values in range [0,255]

for i, (lower, upper) in enumerate(boundaries):

    lower = np.array([color-s if color-s>-1 else 0 for color in lower], dtype="uint8")
    upper = np.array([color+s if color+s<256 else 255 for color in upper], dtype="uint8")

    mask = cv2.inRange(image, lower, upper)
    output = cv2.bitwise_and(image, image, mask=mask)

    cv2.imwrite(str(i) + 'image.jpg', output)

或者您可以事先对图像进行平滑处理,以去除这些嘈杂的像素。这将使像素值彼此更接近,因此超出边界的像素值可能会更接近范围。

【讨论】:

  • 但我尝试了从灵敏度 0.01 到 200 的所有方法,但都没有好转
  • 灵敏度=20之后的一切都是黑色的
  • 是的,因为如果您的敏感度较高,您的界限会超过 0 和/或 255。您可以通过添加条件来检查灵敏度是否会扭曲超出实际可能像素值的边界。我正在为此更新代码。
猜你喜欢
  • 2021-10-24
  • 2018-10-20
  • 1970-01-01
  • 2023-04-08
  • 2020-11-15
  • 2010-12-26
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
相关资源
最近更新 更多