为何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
相关产品推荐
相关产品推荐

