我正在尝试获取专辑封面的轮廓,并且边缘检测器(Canny,Laplace)拾取的噪音过多。我不完全了解图像遮罩的工作原理,想在图像上放一个白色的蒙版,这样我只能看到黑色的像素
我应用了高斯模糊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]))
我希望在最终输出中有所区别,但是窗口只是黑色的。如何创建其他颜色的蒙版?
编辑:
不是确切的图像,而是左样本:原始图像;右:已处理
答案 0 :(得分:1)
根据我的理解,您想获得一个蒙版,其中所有彩色像素(非黑色)均为白色。当我们使用cv2.inRange()
时,我们给它一个上下阈值,以 white 返回所有像素。然后,当我们将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()