假设我有2张白色图像(RGB 800x600图像),在某些未知位置上是“脏”的,我想创建一个包含两个图像所有脏部分的最终组合图像。
只需将图像加在一起即可减少每个斑点的“脏污”,因为我将像素值减半,然后将它们相加(以保持在0-> 255 rgb范围内),所以当您拥有2个以上图像时,会放大
我要做的是为3通道图像中所有相对白色的像素创建一个蒙版,我已经看到,如果所有RGB值都在彼此的10-15之内,则一个像素就相对白色。我将如何使用numpy创建此蒙版?
我想做什么的伪代码:
img = cv2.imread(img) #BGR image
mask = np.where( BGR within 10 of each other)
然后,我可以使用第一张图像,并在未遮盖第二张图片的地方替换其上的像素,从而使“脏污程度”相对较脏。 (我知道第二张图片有些肮脏会取代第一张图片,但这没关系)
编辑: 人们要求提供图像,所以我创建了一些示例图像,白色并不总是像这些示例中那样完全白,这就是为什么我需要使用“ 10 BGR以内”范围的原因。
答案 0 :(得分:1)
您要的是像素之间的颜色之间的距离小于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]
请注意,此代码需要阈值游戏,并且仅显示一个概念。
答案 1 :(得分:1)
我建议您转换为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)
请注意,如果它拾取太多或太少的彩色像素,则可以对其进行修改。如果拾取的东西太少,则可以扩张面罩;如果拾取的东西太多,则可以腐蚀面罩。您还可以在遮罩之前稍微模糊图像,这可能不是一个坏主意,因为它是带有压缩伪像的“讨厌” JPEG。如果您只想允许某些颜色通过,或者某种亮度或某种组合,则可以更改饱和度测试,使其更具临床意义和针对性。