【问题标题】:How do I create a white mask displaying only black in an image?如何创建仅在图像中显示黑色的白色蒙版?
【发布时间】:2019-12-16 16:48:04
【问题描述】:

我正在尝试获取专辑封面的轮廓,而边缘检测器(Canny、Laplace)检测到的噪音过多。我不完全了解图像遮罩的工作原理,并想在图像上放置一个白色遮罩,因此我只能看到黑色像素

我已应用 GaussianBlur 5x5 并将图像转换为 hsv 值。我有一系列黑色的值,我已经过滤掉了这些值。

# imported image and processing (shorthand here)
image = cv2.imread(args["image"])
blur = cv2.GaussianBlur(image, (5,5), 0)
blur_hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)

# set regions of color 
boundaries = [
    # black 
    ([0,0,0],[180, 255, 40])

    #pink
    #([151, 80, 50], [174, 255, 255])   
]

# loop over the boundaries
for (lower, upper) in boundaries:
    # create NumPy arrays from the boundaries
    lower = np.array(lower, dtype = "uint8")
    upper = np.array(upper, dtype = "uint8")

    # find the colors within the specified boundaries and apply
    mask = cv2.inRange(blur_hsv, lower, upper)  
    output = cv2.bitwise_and(image, image, mask = mask)

    # show the images
    cv2.imshow("images", np.hstack([image, output]))

我希望在最终输出中有所区别,但窗口只是黑色的。如何创建不同颜色的蒙版?

编辑:

不是确切的图像,而是一个示例 LEFT:原始;右:已处理

【问题讨论】:

  • 你能添加你的输入图像和预期的输出图像吗?
  • 帖子已更新为示例图像输出
  • 我不完全明白你想要做什么。你想创建一个高亮所有黑色像素的遮罩(这样遮罩上的任何黑色像素都会变成白色)吗?
  • @nathancy -- 正好相反。蒙版当前是黑色的,因此它将所有不是“黑色”的像素变成黑色,我看不到它检测到哪些像素为“黑色”。我想要在这些像素上使用白色蒙版
  • 所以你想创建一个所有非黑色像素都是白色的蒙版。当掩码是按位和原始图像时,您只想要一个只显示颜色的结果图像?

标签: python opencv


【解决方案1】:

据我了解,您希望获得一个所有彩色像素(非黑色)都是白色的蒙版。当我们使用cv2.inRange() 时,我们给它一个下/上阈值,以返回白色边界内的所有像素。然后当我们将cv2.bitwise_and() 与蒙版和原始图像一起使用时,生成的图像将是蒙版和原始图像都是白色的区域。基本上任何白色像素都是我们想要保留的区域。

您当前的输出显示原始图片中像素介于阈值下限/上限之间的所有区域。但是,如果您的目标是显示所有非黑色像素,那么您可以简单地反转遮罩。这是一个可视化:

这是您当前的蒙版,将原始图像中阈值内的所有像素表示为白色。

我们可以简单地反转掩码或使用cv2.bitwise_not() 来获得您想要的掩码。这个新蒙版将不在您的下/上限阈值内的所有彩色像素表示为白色。因此这个蒙版就是所有的彩色像素。

final_mask = 255 - mask

请记住,任何我们想要保留的像素,我们都应该将其设为白色,而任何我们想要丢弃的像素,我们将其设为黑色。所以如果我们cv2.bitwise_and()这个带有原始图像的新蒙版,我们会得到这个

这是一个很好的tutorial on bitwise operations and masking

import cv2
import numpy as np

image = cv2.imread('1.png')
blur = cv2.GaussianBlur(image, (5,5), 0)
blur_hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)

# create NumPy arrays from the boundaries
lower = np.array([0,0,0], dtype = "uint8")
upper = np.array([180,255,40], dtype = "uint8")

# find the colors within the specified boundaries and apply
mask = cv2.inRange(blur_hsv, lower, upper)  
mask = 255 - mask
output = cv2.bitwise_and(image, image, mask = mask)

# show the images
cv2.imshow("output", output)
cv2.imshow("mask", mask)
cv2.waitKey()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2017-02-05
    • 2018-07-18
    相关资源
    最近更新 更多