Stu*_*PhD 4 python opencv colors image-processing computer-vision
我已经以 RGB 和 HSV 格式生成了我的图像的散点图,并且我正在使用inRange()通过观察该图来设置单一颜色的阈值。
为了获得准确的 RGB 和 HSV 值,我使用paint.net 的颜色选择器来获取 RGB 值,然后使用RGB 到 HSV 转换器来获取 HSV 值。
像素颜色和散点图由以下生成:
img = cv2.imread('C:\\b_.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pixel_colors = img.reshape((np.shape(img)[0]*np.shape(img)[1], 3))
norm = colors.Normalize(vmin=-1., vmax=1.)
norm.autoscale(pixel_colors)
pixel_colors = norm(pixel_colors).tolist()
h, s, v = cv2.split(img_hsv)
fig = plt.figure()
axis = fig.add_subplot(1, 1, 1, projection="3d")
axis.scatter(h.flatten(), s.flatten(), v.flatten(), facecolors=pixel_colors, marker=".")
axis.set_xlabel("Hue")
axis.set_ylabel("Saturation")
axis.set_zlabel("Value")
plt.show()
Run Code Online (Sandbox Code Playgroud)
我需要从我的图像中提取黄色。如前所述,我使用paint.net 颜色选择器来获取浅黄色和深黄色的RGB 值。然后使用转换器获取inRange()函数的 HSV 值。
light_yellow = (60, 89, 97) # HSV VALUES
dark_yellow = (61, 36.6, 43.9)
mask = cv2.inRange(img_hsv, light_yellow, dark_yellow)
result = cv2.bitwise_and(img, img, mask=mask)
Run Code Online (Sandbox Code Playgroud)
但是生成的结果是黑色图像,但是如果我直接使用浅黄色和深黄色的 RGB 值并使用 RGB 图像,而不是 HSV 转换的图像,则分割有效。
light_yellow = (249, 249, 125) # RGB VALUES
dark_yellow = (111, 112, 71)
mask = cv2.inRange(img, light_yellow, dark_yellow)
result = cv2.bitwise_and(img, img, mask=mask)
Run Code Online (Sandbox Code Playgroud)
虽然上面是RGB分割,但感觉在HSV中可能会有所改进。为什么我的 HSV 范围没有输出?
正如cvtColor的文档中所表达的那样。当是CV_8U时,H值通常从0到360,除以2,从0到180。S 和 V 值通常是百分比 (0-100%),范围为 0-255。
所以你的价值:
light_yellow = (60, 89, 97) # HSV VALUES
dark_yellow = (61, 36.6, 43.9)
Run Code Online (Sandbox Code Playgroud)
应该更像:
# (H/2, (S/100) * 255, (V/100) * 255)
light_yellow = (30, 227, 247) # HSV VALUES
dark_yellow = (31, 93, 112)
Run Code Online (Sandbox Code Playgroud)
现在你有另一个问题,inRanges 寻找低和高范围内的值,而不是浅黄色和深黄色。所以你的限制应该是:
low = (30,93,112)
high = (31, 227,247)
mask = cv2.inRange(img_hsv, low, high)
Run Code Online (Sandbox Code Playgroud)
还有一件事,我会为 H 颜色使用更大的范围...... 30-31 相当小,也许 20-32 更好?
| 归档时间: |
|
| 查看次数: |
2626 次 |
| 最近记录: |