在图像 Python 中裁剪自定义区域 [关闭]

Posted

技术标签:

【中文标题】在图像 Python 中裁剪自定义区域 [关闭]【英文标题】:Crop a custom region in image Python [closed] 【发布时间】:2020-10-29 13:51:51 【问题描述】:

您好,我有图像我想在图像中裁剪自定义区域,如示例所示,

原图:

面具:

我想通过蒙版的形状裁剪原始图像并保存..我该怎么做?

【问题讨论】:

“裁剪”是指从原始图像中删除掩码给出的信息,还是创建比原始图像更小的新图像并且掩码中的信息不出现?裁剪意味着应该从原始图像中选择一个矩形区域,但该区域不是矩形。 @rayryeng 嗨,我想裁剪并保留该区域并删除其他信息。我只想要原始图像中的区域。是的,它不是矩形,而是如何与设计的面具一样。 【参考方案1】:

您也可以使用按位与运算来解决问题。

首先在蒙版图像中,删除红线,然后确保您想要的区域是白色(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" 将包含所需的输出。此外,按位运算的速度很快。如果按照上面解释的方式存储掩码,那么这段代码在读取掩码图像和彩色图像后将成为单行代码。

【讨论】:

【参考方案2】:

谢天谢地,您提供的蒙版有一个 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 通道并对其进行阈值处理,以便任何非零像素创建一个二进制图像,使得非零值是 TrueFalse 否则。然后我们创建一个 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)

【讨论】:

如何打印并保存图像?我的意思是已经处理的图像 您可以只显示它,或将其保存到磁盘。我会更新答案。 很好,谢谢.. 好的,我怎样才能删除该区域,我的意思是,如果查看保存的图像,您会看到道路和树木,但带有蒙版的区域是黑色的。那么如何才能使信息变黑的区域以及道路和树木移除。只是反映它。 现在我想我知道了。你想使用修复吗? docs.opencv.org/master/df/d3d/tutorial_py_inpainting.html。您可以用边缘附近的像素填充蒙版的像素,但这不会是反射。请注意,这与您之前的要求相去甚远。裁剪/删除区域和填充/修复是两个完全不同的问题。 实际上我只想要原始图像中顶部的红色汽车区域。我不想修复图像

以上是关于在图像 Python 中裁剪自定义区域 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义参数在 Python 中多次裁剪图像

PHP实现的自定义图像居中裁剪函数示例

使用 Objective C 自定义相机捕捉图像和裁剪

从 Swift 中的自定义相机拍摄后裁剪图像

自定义图像裁剪器android

Swift 中的自定义相机和裁剪图像