如何使用numpy为图像中所有相对白色的部分创建遮罩?

2024-09-29 21:26:02 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个白色图像(RGB 800x600图像),在一些未知位置“脏”,我想创建一个最终的组合图像,其中包含两个图像的所有脏部分

只需将图像添加在一起就可以减少每个斑点的“脏度”,因为我将像素值减半,然后再添加它们(以保持在0->;255 rgb范围内),当有两个以上的图像时,这一点会被放大

我想做的是为3通道图像中所有相对白色的像素创建一个遮罩,我已经看到,如果所有RGB值彼此在10-15范围内,则一个像素相对白色。如何使用numpy创建此遮罩

我想做的事情的伪代码:

img = cv2.imread(img) #BGR image
mask = np.where( BGR within 10 of each other)

然后我可以使用第一幅图像,在第二幅图像未被遮罩的地方替换像素,保持“脏度级别”相对脏。(我知道第二张图片的肮脏程度会取代第一张,但没关系)

编辑: 人们要求图像,所以我创建了一些示例图像,白色不会总是像这些示例中那样完全是白色的,这就是为什么我需要使用“在10 BGR范围内”的图像

图1 Image 1

图2 Image 2

图3(综合起来,忽略图2与此处黄色斑点的差异,它们应该是相同的) Image 3


Tags: 代码图像gtnumpy示例imgrgb像素
2条回答

我建议您转换为HSV colourspace并查找以下饱和(彩色)像素:

import cv2

# Load background and foreground images
bg = cv2.imread('A.jpg')
fg = cv2.imread('B.jpg')

# Convert to HSV colourspace and extract just the Saturation
Sat = cv2.cvtColor(fg, cv2.COLOR_BGR2HSV)[..., 1]

# Find best (Otsu) threshold to divide black from white, and apply it
_ , mask = cv2.threshold(Sat,0,1,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# At each pixel, choose foreground where mask is set and background elsewhere
res = np.where(mask[...,np.newaxis], fg, bg)

# Save the result
cv2.imwrite('result.png', res)

enter image description here

请注意,如果它拾取的彩色像素太多或太少,则可以对其进行修改。如果吸得太少,你可能会放大面膜,如果吸得太多,你可能会腐蚀面膜。您还可以在掩蔽之前将图像模糊一点,这可能不是一个坏主意,因为这是一个带有压缩伪影的“讨厌的”JPEG。如果你只想让某些颜色通过,或者某个亮度或混合,你可以改变饱和度测试,使其更具临床意义和针对性

你所要求的是让颜色之间的距离小于10的像素

在这里,翻译成numpy

img = cv2.imread(img) #  assuming rgb image in naming
r = img[:, :, 0]
g = img[:, :, 1]
b = img[:, :, 2]
rg_close = np.abs(r - g) < 10
gb_close = np.abs(g - b) < 10
br_close = np.abs(b - r) < 10

all_close = np.logical_and(np.logical_and(rg_close, gb_close), br_close)

然而,我相信这不是你真正想要的

我想你想要的是分割背景的面具

这实际上更简单,假设背景是完全白色的:

img = cv2.imread(img)
background_mask = 245 * 3 < img[: ,: ,0] + img[: ,: ,1] + img[: ,: ,2]

请注意这段代码需要阈值游戏,并且只显示了一个概念

相关问题 更多 >

    热门问题