在范围内对灰度图像进行阈值处理

7

OpenCV的cv.InRange函数只适用于RGB图像吗?我能使用这个函数对灰度图像进行阈值处理吗?

我遇到了一个错误,以下是我的代码:

   import cv2
   image=cv2.imread("disparitySGB.jpg")
   thresh=cv2.inRange(image,190,255);

出现以下错误:

thresh = cv2.inRange(image, 190, 255); TypeError:未知的不是NumPy数组

我尝试通过以下方法来解决:

  thresh=cv2.inRange(image,numpy.array(190),numpy.array(255));

现在没有错误,但它生成了黑色的图像。
4个回答

12
在numpy中形状为(M,N)、大小为MxN且只有一个通道的灰度图像,使用OpenCV的cv2.inRange函数时,需要传入标量边界值:
gray = cv2.imread(filename, cv2.CV_LOAD_IMAGE_GRAYSCALE)
gray_filtered = cv2.inRange(gray, 190, 255)

但是对于在numpy中形状为(M,N,3)且大小为MxN具有三个通道的RGB图像,在OpenCV中您需要使边界与“通道大小”匹配。

rgb = cv2.imread(filename, cv2.CV_LOAD_IMAGE_COLOR)
rgb_filtered = cv2.inRange(gray, (190, 190, 190), (255, 255, 255))

虽然不是非常清晰,但这在文档中有解释。


1
非常感谢!它起作用了 :). 是的,文档不清楚,我读了很多遍,仍然没有理解。 - Maham

1
cv2.inRange(src, lowerb, upperb[, dst]) → dst

src作为数组,将lowerupper作为arrayscalar,这意味着您可以使用它来阈值灰度图像。 您只需要为upperlower使用标量即可。
示例:
myResult = cv2.InRange(myGrayscale, 50, 100)

谢谢!我之前尝试过,但是出现了错误,所以我想也许它只接受 RGB 图像。 - Maham
我已经编辑了问题并包含了一些代码,请帮忙解决。 - Maham
1
我误解了你的问题。我以为你的目标是在灰度图像上使用inRange而不是RGB。但是@kigurai发布了一个很好的答案。 - Mailerdaimon
实际上,这张图片是灰度图像,但它是三通道的图像。我没有将其转换为单通道(设置标志cv2.CV_BGR2GRAY),因此得到了黑色图像。 - Maham

0
你只需要在代码中加入'import numpy as np',原本的代码就可以正常运行了。

抱歉!但这不是答案。使用numpy或者as np并没有什么区别。 - Maham

0

你的cv2.imread正在读取RGB图像。要读取灰度图像,请使用

image = cv2.imread("disparitySGB.jpg", 0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接