基于HSV图像的值通道为图像创建条件蒙版

问题描述 投票:1回答:1

我有一个图像,我想基于图像的value-channel像素的xy的值在其上放置遮罩。

def rgb_mask(img):
   r, g, b = img[:,:,2], img[:,:,1], img[:,:,0]
   intensity = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)[:,:,2]

   mask_if_intensity_below_50 = (np.logical_and((0.85 * g > 0.95 * b), (0.95 * g > 0.85 * r)) * 255).astype(np.uint8)
   mask_if_intensity_between_50_and_200 = (np.logical_and((0.85 * g > 0.95 * b), (0.95 * g > 0.85 * r), (g - r + b > 30)) * 255).astype(np.uint8)
   mask_if_intensity_above_200 = (np.logical_and((0.85 * g > 0.95 * b), (0.95 * g > 0.85 * r), (g - b < 150)) * 255).astype(np.uint8)


   masked = cv2.bitwise_and(img, img, mask=?) # I typed ? because I am note sure how to include this in the code

   return masked

img.shape返回以下内容:

(720, 1280, 3)

如何为每个像素分配正确的遮罩?理想情况下,我不想使用for x, for y循环。在此先感谢

python opencv rgb mask
1个回答
1
投票
您可以在使用bitwise_and之前将遮罩复制为3D矩阵。

您可以使用numpy dstak函数复制蒙版。例如:np.dstack((msk, msk, msk))的形状为msk(720,1280),返回形状为(720,1280,3)

在以下示例中,我假设intensity矩阵在[0,255]范围内(而不是[0,1]):

mask_if_intensity_between_100_and_200 = (np.logical_and(intensity > 100, intensity < 200) * 255).astype(np.uint8) masked = cv2.bitwise_and(img, np.dstack((mask_if_intensity_between_100_and_200, mask_if_intensity_between_100_and_200, mask_if_intensity_between_100_and_200)))

当遮罩形状和图像形状相同时,可以按位和。 

样本蒙版图像:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.