隔离单个相似颜色区域的最佳方法是什么?

What is the best approach for isolating a single area of similar colour?

我有一张卫星图像,正试图根据它的颜色隔离一个屋顶。我的计划是采用图像中选定点的颜色,并从中创建一个稍亮 > 稍暗的范围(允许基于阳光和阴影的变化)并删除该范围内以外的所有颜色。

那么我只需要保留包含最初选择的点的颜色区域。

下面是我想在 photoshop 中手动编辑的示例图像、颜色范围和最终图像。

我在将 RGB 颜色转换为 HSV 值时也遇到了问题,这些值在以下脚本中产生了可预测的结果。我已经尝试使用 python 遵循各种绿色筛选指南,例如: and this.

我一直在尝试使用以下内容,但 运行 遇到了一些问题:

img = cv2.imread("static.jpg".format(latlon, zoom))
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# light color in RGB = [153, 139, 130]
# dark color in RGB = [82, 74, 71]
# How to convert these to HSV?
# using 150,0,0 here as it creates a valid range
hsv_color1 = np.array([150,0,0])

# using 180,255,255 here as it creates a valid range
hsv_color2 = np.array([180,255,255])
mask = cv2.inRange(img_hsv, hsv_color1, hsv_color2)
res = cv2.bitwise_and(img, img, mask = mask)
cv2.imshow('mask', mask)
cv2.imwrite("mask.jpg".format(latlon, zoom), mask)
cv2.imshow('img_hsv', img_hsv)
cv2.imwrite("img_hsv.jpg".format(latlon, zoom), img_hsv)
cv2.imshow('res', res)
cv2.imwrite("res.png".format(latlon, zoom), res)

所以我的两个问题是:

  1. 如何将 RGB 转换为 HSV 值以创建有效的 inRange 来隔离这些颜色?
  2. 如何根据给定的像素位置只有一个区域的inRange颜色?
  3. 还有一个加分项,如何使隔离 inRange 区域的遮罩成为一个漂亮的紧密遮罩?

我需要输出一个图像来隔离给定像素位置周围的颜色区域。

原创

期望的输出

浅色

深色

您的暗值在 HSV 中变为 16/13/32。而你的光值在HSV中变成了23/14/60。

OpenCV 通过除以 2 来缩放 Hue 值,以便 360 的整个范围变为 180,并且仍然适合无符号的 8 位数字。因此,您需要使用 8 的深色相值和 12 的浅色相值。我会在每一端将该范围扩大 3-5 以留出一些余地,并使用低饱和度来仅拾取不饱和的灰色值.所以代码变成:

#!/usr/bin/env python3

import cv2
import numpy as np

img = cv2.imread("static.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# light color in RGB = [153, 139, 130]
# dark color in RGB = [82, 74, 71]

hsv_lo = np.array([5,0,0])
hsv_hi = np.array([15,50,255])
mask = cv2.inRange(img_hsv, hsv_lo, hsv_hi)
res = cv2.bitwise_and(img, img, mask = mask)
cv2.imwrite("result.png", res)