python - 如何使用循环重写二维数组切片(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] ?
解决方案
让我举个例子。
假设我们有一个随机图像
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]
推荐阅读
- php - 如何在 PHP 中实现 iOS DeviceCheck - 使用现有私钥签署 JWT 令牌的问题
- youtube-api - 无法在谷歌开发者控制台上创建新项目
- javascript - 如何在控制台中调试 jQuery?
- r - 使用 R 中的 lapply 将值列表作为列添加到现有数据框
- node.js - firebase.storage 不是使用 node.js 的函数错误
- mysql - 数据库设计、邀请和活动
- ios - 终止应用程序两次以上后如何让定位服务提示
- javascript - 如何通过值 [JS] 获取对象的属性名称
- javascript - MUI瀑布工具栏实现
- python - 匹配所有出现的点并在字符串中的单词后用连字符替换