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)
我正在尝试(分别)从图像中分离出红色,蓝色,黄色和灰色。
到目前为止,它一直在工作,但是“灵敏度”很低。
该算法缺少一些较小的色斑。
有没有办法对此进行校准?
谢谢!
编辑:
输入图像
输出
最佳答案
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)
或者,您可以预先平滑图像以消除此类噪点。这将使像素值彼此更接近,因此边界之外的像素值可能会获得更接近范围的值。
关于python - Python OpenCV-cv.inRange() “sensitivity”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41683152/