首页 > 解决方案 > 如何使用循环重写二维数组切片(open cv 格式)

问题描述

我正在尝试从图像中获取特定区域(不是矩形)。从轮廓中,我能够生成包含该区域的所有点。

arialpoints = [[0,0],[0,1],[0,2]...]

我正在通过 opencv 中的一个示例,该示例基于左上角 x,y 坐标和宽度高度创建图像

testimage = cv2.imread("foo.jpg")
cropped = testimage[x:x+width, y:y+height]
cv2.imwrite('final.jpg', cropped)

但这是针对矩形裁剪区域的,我想为多边形做。有没有办法可以从我的坐标生成 testimage[x:x+width, y:y+height] ?

标签: pythonpython-3.xnumpyopencvimage-processing

解决方案


让我举个例子。

假设我们有一个随机图像

np.random.seed(42)
img = np.random.randint(255, size=(10,10,3))

在此处输入图像描述

和点列表

points = np.array([[2, 2],
                   [3, 2],
                   [3, 3],
                   [4, 2],
                   [4, 3],
                   [5, 2],
                   [5, 3],
                   [5, 4],
                   [6, 5],
                   [7, 6]])

您可以像这样为您的点创建一个二进制掩码(您可能必须np.fliplr(points)取决于如何定义 x 和 y 坐标)

mask = np.zeros_like(img)
mask[points.T.tolist()] = 1

在此处输入图像描述

您现在可以使用此蒙版来选择您想要的图像区域

img = img * mask

在此处输入图像描述

您还可以将选择限制在边界框内

xmin, ymin = np.min(points, axis=0)
xmax, ymax = np.max(points, axis=0)

cropped = img[xmin:xmax+1, ymin:ymax+1]

在此处输入图像描述


推荐阅读