基于 HSV 图像的值通道为图像创建条件掩码
Create conditional mask for image based on Value channel of HSV image
我有一张图片,我想根据图片的 xy
像素的 value-channel
的值放置一个蒙版。
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
returns 以下内容:
(720, 1280, 3)
如何为每个像素分配正确的遮罩?理想情况下,我不想使用 for x, for y
循环。提前致谢
在使用bitwise_and
之前,您可以将蒙版复制为 3D 矩阵。
您可以使用 numpy dstak 函数复制蒙版。
例如:np.dstack((msk, msk, msk))
得到形状为 (720, 1280) 的 msk 和 return 形状为 (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)))
当mask shape和image shape相同时,可以应用bitwise and。
蒙版图像示例:
我有一张图片,我想根据图片的 xy
像素的 value-channel
的值放置一个蒙版。
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
returns 以下内容:
(720, 1280, 3)
如何为每个像素分配正确的遮罩?理想情况下,我不想使用 for x, for y
循环。提前致谢
在使用bitwise_and
之前,您可以将蒙版复制为 3D 矩阵。
您可以使用 numpy dstak 函数复制蒙版。
例如:np.dstack((msk, msk, msk))
得到形状为 (720, 1280) 的 msk 和 return 形状为 (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)))
当mask shape和image shape相同时,可以应用bitwise and。
蒙版图像示例: