如何遮盖图像中除特定颜色以外的所有内容

5

我有一张图片,需要将除绿色以及绿色内部颜色之外的所有区域变成黑色。如何实现这个功能?

我将彩色图像从RGB转换为BGR,并将BGR转换为HSV。我创建了绿色色调的上下限。根据边界对图像进行了掩码处理,但是当我显示图像时,除了绿色以外,其他所有区域都变成了黑色。绿色矩形内部的颜色没有显示出来。

[enter image description here]

hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower = np.array([69,206,177], dtype = "uint8")
upper = np.array([69,206,177], dtype = "uint8")

green_mask = cv2.inRange(hsv,lower,upper)
green= cv2.bitwise_and(hsv,hsv,mask=green_mask )

cv2.imshow("Show colors in green ",green)


cv2.waitKey(0)
cv2.destroyAllWindows()

2
获取该区域的外轮廓并填充。然后将其用作掩码(ROI),反转它并将除反转掩码为白色的区域以外的所有内容变黑。请参见https://likegeeks.com/python-image-processing/#Remove-Background-from-an-image。建议:在此提问之前,请尝试进行Google或StackOverflow搜索。 - fmw42
OpenCV:将特定BGR值的所有像素设置为另一个BGR值 - Santhosh Dhaipule Chandrakanth
可能是重复的问题:OpenCV:将特定BGR值的所有像素设置为另一个BGR值 - Santhosh Dhaipule Chandrakanth
1个回答

4
这里有一个简单的方法:
  • 将图像转换为灰度
  • 使用颜色阈值来隔离绿色
  • 查找轮廓并填充掩膜
  • 使用位运算与操作获取结果

将图像转换为灰度后,我们进行颜色阈值处理,以获取仅在最小/最大范围内的绿色像素的掩码。

enter image description here

接下来,我们找到轮廓并使用cv2.fillPoly()填充掩码,以保持所有内容在内部。

enter image description here

现���我们使用cv2.bitwise_and()来获取我们的结果。

enter image description here

import numpy as np
import cv2

image = cv2.imread('1.png')
original = image.copy()
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([35, 0, 0], dtype="uint8")
upper = np.array([131, 255, 185], dtype="uint8")
mask = cv2.inRange(image, lower, upper)

cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cv2.fillPoly(mask, cnts, (255,255,255))
result = cv2.bitwise_and(original,original,mask=mask)

cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.waitKey()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接