使用opencv进行彩色蒙版的好技术
Good technique for color masks with opencv
我一直在努力使用下图创建我自己的颜色蒙版
我正在尝试隔离此示例中的红色停车标志。我最初的策略是使用颜色选择器获取一系列红色值(HSV 格式):
下限:
上限:
代码:
import numpy as np
import cv2
img = cv2.imread("image.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 59, 49])
upper = np.array([0, 100, 100])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(hsv, hsv, mask=mask)
cv2.imshow("image", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
生成的图像(结果变量)是全黑的,我认为这意味着检测到 none 红色。我假设这与我选择的 HSV 值有关,但我不确定它们有什么问题。
当我使用 2 个掩码和修改后的 HSV 值(我在网上找到的)时,效果很好;停止标志并且只有停止标志在结果中突出显示:
import numpy as np
import cv2
img = cv2.imread("image.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 50, 50])
upper = np.array([10, 255, 255])
lower2 = np.array([170, 50, 50])
upper2 = np.array([180, 255, 255])
mask = cv2.inRange(hsv, lower, upper)
mask2 = cv2.inRange(hsv, lower2, upper2)
mask = mask + mask2
result = cv2.bitwise_and(hsv, hsv, mask=mask)
cv2.imshow("image", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
所以我的问题是,为什么第二个示例比第一个示例效果好得多?我应该总是使用 2 个面具并添加它们吗?第一个面具应该做什么,第二个面具应该做什么?如何选择更好的 HSV 值?
您的第一段代码选择 正好 0 度色调。那个停车标志可能不会完全是那种色调。因此,未被选中。
你的第二段代码给出了一些色调范围。这就是为什么它可以抓住停车标志。
第二段代码必须将色相范围分成两部分,因为所需的色相从 negative 到 positive( 0 +- 20 度)。 cv.inRange
没有允许您在单个范围内表达的逻辑。因此,两部分,或运算在一起(加法)。
我一直在努力使用下图创建我自己的颜色蒙版
我正在尝试隔离此示例中的红色停车标志。我最初的策略是使用颜色选择器获取一系列红色值(HSV 格式):
下限:
上限:
代码:
import numpy as np
import cv2
img = cv2.imread("image.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 59, 49])
upper = np.array([0, 100, 100])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(hsv, hsv, mask=mask)
cv2.imshow("image", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
生成的图像(结果变量)是全黑的,我认为这意味着检测到 none 红色。我假设这与我选择的 HSV 值有关,但我不确定它们有什么问题。
当我使用 2 个掩码和修改后的 HSV 值(我在网上找到的)时,效果很好;停止标志并且只有停止标志在结果中突出显示:
import numpy as np
import cv2
img = cv2.imread("image.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 50, 50])
upper = np.array([10, 255, 255])
lower2 = np.array([170, 50, 50])
upper2 = np.array([180, 255, 255])
mask = cv2.inRange(hsv, lower, upper)
mask2 = cv2.inRange(hsv, lower2, upper2)
mask = mask + mask2
result = cv2.bitwise_and(hsv, hsv, mask=mask)
cv2.imshow("image", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
所以我的问题是,为什么第二个示例比第一个示例效果好得多?我应该总是使用 2 个面具并添加它们吗?第一个面具应该做什么,第二个面具应该做什么?如何选择更好的 HSV 值?
您的第一段代码选择 正好 0 度色调。那个停车标志可能不会完全是那种色调。因此,未被选中。
你的第二段代码给出了一些色调范围。这就是为什么它可以抓住停车标志。
第二段代码必须将色相范围分成两部分,因为所需的色相从 negative 到 positive( 0 +- 20 度)。 cv.inRange
没有允许您在单个范围内表达的逻辑。因此,两部分,或运算在一起(加法)。