Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NumPy/OpenCV 2:如何裁剪非矩形区域?_Python_Opencv_Image Processing_Numpy - Fatal编程技术网

Python NumPy/OpenCV 2:如何裁剪非矩形区域?

Python NumPy/OpenCV 2:如何裁剪非矩形区域?,python,opencv,image-processing,numpy,Python,Opencv,Image Processing,Numpy,我有一组点构成一个形状(闭合多段线)。现在,我想复制/裁剪此形状内某个图像的所有像素,剩下的像素为黑色/透明。我该怎么做 例如,我有: 我想得到这个: *编辑-已更新以处理具有alpha通道的图像 这对我很有用: 制作一个全黑的面具(所有面具) 在ROI的形状中用白色填充多边形 将遮罩和图像结合起来,在其他地方获得黑色的ROI 对于接受遮罩的函数,您可能只想将图像和遮罩分开。然而,我相信这是你特别要求的: import cv2 import numpy as np # original

我有一组点构成一个形状(闭合多段线)。现在,我想复制/裁剪此形状内某个图像的所有像素,剩下的像素为黑色/透明。我该怎么做

例如,我有:

我想得到这个:


*编辑-已更新以处理具有alpha通道的图像

这对我很有用:

  • 制作一个全黑的面具(所有面具)
  • 在ROI的形状中用白色填充多边形
  • 将遮罩和图像结合起来,在其他地方获得黑色的ROI
对于接受遮罩的函数,您可能只想将图像和遮罩分开。然而,我相信这是你特别要求的:

import cv2
import numpy as np

# original image
# -1 loads as-is so if it will be 3 or 4 channel as the original
image = cv2.imread('image.png', -1)
# mask defaulting to black for 3-channel and transparent for 4-channel
# (of course replace corners with yours)
mask = np.zeros(image.shape, dtype=np.uint8)
roi_corners = np.array([[(10,10), (300,300), (10,300)]], dtype=np.int32)
# fill the ROI so it doesn't get wiped out when the mask is applied
channel_count = image.shape[2]  # i.e. 3 or 4 depending on your image
ignore_mask_color = (255,)*channel_count
cv2.fillPoly(mask, roi_corners, ignore_mask_color)
# from Masterfool: use cv2.fillConvexPoly if you know it's convex

# apply the mask
masked_image = cv2.bitwise_and(image, mask)

# save the result
cv2.imwrite('image_masked.png', masked_image)

下面的代码将有助于裁剪图像并将其置于白色背景中

import cv2
import numpy as np

# load the image
image_path = 'input image path'
image = cv2.imread(image_path)

# create a mask with white pixels
mask = np.ones(image.shape, dtype=np.uint8)
mask.fill(255)

# points to be cropped
roi_corners = np.array([[(0, 300), (1880, 300), (1880, 400), (0, 400)]], dtype=np.int32)
# fill the ROI into the mask
cv2.fillPoly(mask, roi_corners, 0)

# The mask image
cv2.imwrite('image_masked.png', mask)

# applying th mask to original image
masked_image = cv2.bitwise_or(image, mask)

# The resultant image
cv2.imwrite('new_masked_image.png', masked_image)
输入图像:

遮罩图像:

结果输出图像:

我相信您会希望使用不规则的ROI(感兴趣区域)。您可以从这里开始:以防万一:这个问题不是重复的,因为前面提到的问题描述的是C API,而不是Python(尽管这个问题仍然很有用)@kobejohn创建遮罩以使用此裁剪制作透明背景?@kju你的意思是要在ROI外使用透明而不是黑色?@kju这似乎很有限,我只是更新了答案,而不是提出了一个新问题。我想很多这样做的人可能也想要一个透明的遮罩。如果你的形状是凸多边形,你应该使用
cv2.FillConveropoly
。声明此方法比
cv2.fillPoly
快得多。因为我的fillPoly不起作用,但fillConvexPoly起作用。谢谢@master傻瓜这与公认的答案非常相似。你能解释一下这是如何增加这个问题的价值的吗?下面的代码将有助于获得白色背景遮罩图像而不是黑色背景遮罩图像。这并没有添加任何新内容。简单地反转蒙版。从第一个答案开始,如果你能创建一个反转蒙版,并且能够提供相同的结果,那将是非常有帮助的。我很感谢你的评论,因为它有代表性的图片。