在使用Python枕头从图像裁剪区域

问题描述 投票:2回答:2

Rectangle with lines which are not parallel to the margins

我想从Python中使用枕头的图像裁剪矩形区域。问题是,该矩形是不与图像边缘必要平行,所以我不能使用.crop((左,上,右,下))函数。

有没有办法用枕头来实现这一目标? (假设我们知道所有4个矩形的坐标)。如果没有,怎么可以使用不同的Python库做了什么?

The end result should look like this

python opencv image-processing computer-vision python-imaging-library
2个回答
2
投票

您可以使用分钟OpenCV中旋转矩形:

rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)

其结果是您有:中心坐标(X,Y),宽度,高度,长方形的旋转角度。你可以从这个矩形角度旋转整个图像。您现在图像将被旋转:

Rotated image

你可以计算出四个矩形的顶点(你有角)的新坐标。然后,只需计算该点正常矩形(矩形正常=不是最小的,无任何旋转)。有了这个矩形您可以裁剪旋转图像。在这种作物的图像将是你想要什么,如果我理解正确。类似的东西:

result

所以你只需要opencv的。也许有一些库,你可以做更容易。


2
投票

下面是基于scikit图像(不枕),你可能会发现有用的解决方案。

你可以通过想要剪裁到函数skimage.draw.polygon,然后使用所检索的像素坐标来掩盖原始图像(例如,通过alpha通道)的区域的顶点。

import numpy as np
from skimage import io, draw

img = io.imread('https://i.stack.imgur.com/x5Ym4.png')

vertices = np.asarray([[150, 140],
                       [300, 240],
                       [210, 420],
                       [90, 320],
                       [150, 150]])

rows, cols = draw.polygon(vertices[:, 0], vertices[:, 1])

crop = img.copy()
crop[:, :, -1] = 0
crop[rows, cols, -1] = 255

io.imshow(crop)

Masked image

© www.soinside.com 2019 - 2024. All rights reserved.