嗨,我有图像,我想裁剪图像中的自定义区域,如示例所示,
原图:
面具:
我会根据蒙版的形状裁剪原始图像并保存它。我该怎么做呢?
发布于 2020-07-09 05:01:07
您也可以使用按位AND运算来解决问题。
首先,在蒙版图像中,删除红线,然后确保您想要的区域是白色(255),其余区域是黑色(0)。
还要检查蒙版图像是否应该是三通道图像(白色- (255,255,255);黑色- (0,0,0))。如果不是,您可以通过以下方式将其从1通道转换为3通道图像,以保留白黑颜色信息-
# Read mask image by cv2.imread("mask.jpg") - without -1 flag
mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
现在,您可以执行简单的逐位操作-
mask_output = cv2.bitwise_and(img, mask)
"mask_output“将包含所需的输出。此外,按位操作的速度也很快。如果如上所述地存储掩模,则在读取掩模图像和彩色图像之后,该代码将成为一行代码。
发布于 2020-07-09 04:18:09
谢天谢地,您提供的遮罩有一个alpha通道,其中您想要遮罩的区域的内部是在alpha通道中定义的。因此,在alpha通道完好无损的情况下读取图像,然后使用此命令删除此区域中的像素:
假设您的遮罩存储在mask.png
中,图像存储在image.png
中,您可以执行以下操作:
img = cv2.imread('image.png', -1)
mask = cv2.imread('mask.png', -1)
mask = mask[...,3] > 0
mask = np.repeat(mask[..., None], img.shape[2], axis=2)
masked_out = img.copy()
masked_out[mask] = 0
cv2.imshow('Masked Out', masked_out)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('masked_out.png', masked_out)
我们读取原始图像和相应的掩码。然后,我们查看alpha通道并对其设置阈值,以便任何非零像素都会创建一个二进制图像,使得非零值为True
,否则为False
。然后我们创建一个3D版本,以便将蒙版复制到与输入图像中相同数量的通道中。然后,我们将掩码中True
的位置设置为全零,以便将它们设置为黑色像素。最后,我们将图像显示到屏幕上,然后在按下任意键后将图像写入屏幕。
如果你对3D蒙版不满意,你可以使用广播,简单地将蒙版的逆与输入图像相乘:
img = cv2.imread('image.png', -1)
mask = cv2.imread('mask.png', -1)
mask = mask[...,3] == 0
masked_out = img * (mask[...,None].astype(img.dtype))
cv2.imshow('Masked Out', masked_out)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('masked_out.png', masked_out)
https://stackoverflow.com/questions/62806883
复制