You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何imgaug的Flipud对多边形不生效?Fliplr与Affine可正常运行

Fixing imgaug Flipud Not Transforming Polygon Coordinates

我看了你的代码,发现问题出在提取多边形坐标时错误混用了原多边形的y坐标,而不是使用增强后的y坐标。

问题原因分析

  • 当使用Fliplr(水平翻转)时,只有x坐标会发生变换,y坐标保持不变,所以你用原多边形的yy_int看起来效果正常;
  • 但Flipud(垂直翻转)会改变y坐标,这时候你仍然使用原多边形的y值,自然就看不到多边形跟着图像翻转的效果了;
  • 边界框(BBox)功能正常是因为你没有混用原边界框的坐标,直接使用了增强后的结果。

解决方案

只需要把提取坐标时的polygons[0][0].yy_int和polygons[0][1].yy_int替换成polygons_aug里对应的yy_int即可,也就是完全使用增强后的多边形坐标。

修正后的完整代码

import imgaug as ia
import imgaug.augmenters as iaa
import cv2
import numpy as np
import matplotlib.pyplot as plt
# image is numpy array of size (327, 327, 3).
images = np.expand_dims(image, axis=0)
# define polygons
polygons = [
    [
        ia.Polygon([(169, 173), (140, 196), (134, 225), (142, 239), (156, 250), (174, 245), (187, 230), (187, 212), (174, 197), (165, 194), (182, 178)]),
        ia.Polygon([(149, 96), (164, 72), (183, 99), (200, 93), (171, 51), (135, 92)])
    ]
]
# define augmentor
seq = iaa.OneOf([
    #iaa.Affine(rotate=(-20, 20)),
    #iaa.Fliplr(1),
    iaa.Flipud(1)
])
# apply augmentation
images_aug, polygons_aug = seq(images=images, polygons=polygons)
# 修正:使用增强后的多边形的x和y坐标
p1 = np.array(list(zip(polygons_aug[0][0].xx_int.tolist(), polygons_aug[0][0].yy_int.tolist())))
p2 = np.array(list(zip(polygons_aug[0][1].xx_int.tolist(), polygons_aug[0][1].yy_int.tolist())))
# combine polygons into list and draw onto the augmented image
p = [p1, p2]
cv2.drawContours(images_aug[0], p, -1, 255, 3)
plt.imshow(images_aug[0])

补充说明

imgaug的seq()函数返回的polygons_aug已经包含了和增强后图像完全匹配的变换后坐标——不管是旋转、翻转还是仿射变换,都应该直接使用这个增强后的多边形对象的坐标,不要混合原坐标。

内容的提问来源于stack exchange,提问作者Sanchit.Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:21:44