【发布时间】:2022-01-02 04:17:31
【问题描述】:
我正在尝试使用 opencv 从图像中抓取特定元素。到目前为止,我所做的是减少了图像中的颜色数量,并得到了一个颜色字典及其计数。我现在要做的是将所有与此特定颜色不匹配的颜色替换为白色,以便我可以遍历图像并创建不同的图像,其中每个图像只有一个特定颜色的对象。
这是我到目前为止所做的:
def showOnlyOneColor(img, rgb_key):
print("Getting only one color")
rgb_key = rgb_key.split("-")
r = int(rgb_key[0])
g = int(rgb_key[1])
b = int(rgb_key[2])
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
rgb_low = np.array([r,g,b])
rgb_high = np.array([r,g,b])
mask = cv2.inRange(hsv, rgb_low, rgb_high)
contours = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
cv2.fillPoly(mask, contours, (255, 255, 255))
result = cv2.bitwise_and(img,img,mask=mask)
return result
第二次尝试:
def showOnlyOneColor(img, rgb_key):
print("Getting only one color")
rgb_key = rgb_key.split("-")
r = int(rgb_key[0])
g = int(rgb_key[1])
b = int(rgb_key[2])
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
rgb_low = np.array([r,g,b])
rgb_high = np.array([r,g,b])
mask = cv2.inRange(hsv, rgb_low, rgb_high)
img[mask!=255] = (255, 255, 255)
return img
这会在所有迭代中生成白色图像
这是我用来减少图像中颜色数量的方法:
def reduceNumberOfColors(img):
div = 128
return img // div * div + div // 2
最新尝试:
def showOnlyOneColor(img, rgb_key):
print("Getting only one color")
rgb_key = rgb_key.split("-")
r = int(rgb_key[0])
g = int(rgb_key[1])
b = int(rgb_key[2])
hsv_color = colorsys.rgb_to_hsv(r,g,b)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
rgb_low = np.array(hsv_color)
rgb_high = np.array(hsv_color)
mask = cv2.inRange(hsv, rgb_low, rgb_high)
img[mask!=255] = (255, 255, 255)
return img
其中一张图片显示了一些东西,其余的图片是白色的
我如何组织 rgb:
def getColorCount(img):
color_dict = {}
print("Getting color count")
for i in tqdm(range(img.shape[0])):
for j in range(img.shape[1]):
color = img[i,j]
r = color[0]
g = color[1]
b = color[2]
rgb_askey = str(r)+"-"+str(g)+"-"+str(b)
if rgb_askey not in color_dict.keys():
color_dict[rgb_askey] = 1
else:
color_dict[rgb_askey] += 1
return color_dict
【问题讨论】:
-
为您想要保留的理想颜色设置阈值。然后使用蒙版将所有其他像素更改为白色。假设您的输入图像为
image,掩码为mask,请执行以下操作:image[mask!=255] = (255, 255, 255) -
@fmw42 如果我按照你刚才指定的方式实现蒙版,我只会得到一张白色图像
-
你的面具是什么样子的?它是否显示一些白色和一些黑色?您的面罩是 1 通道还是 3 通道?如果是 3 个频道,则设为 1 个频道。
-
请出示您输入的图片
-
为什么要转换为 HSV,但使用 RGB 值?