微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

裁剪后如何变换相对边界框?

如何解决裁剪后如何变换相对边界框?

根据tf.image.draw_bounding_boxes,我需要使用这种格式的边界框:

[y_min,x_min,y_max,x_max]

我的这张图片的形状为(720,1280,3)(原图为here):

enter image description here

我有边界框:

array([[0.134722,0.425,0.327778,0.5      ],[0.294444,0.3140625,0.444444,0.4124995],[0.473611,0.294531,0.636111,0.417969 ],[0.5972225,0.392968,0.7986115,0.497656 ],[0.5416665,0.486719,0.6999995,0.645313 ],[0.3986115,0.5319445,0.546094 ],[0.3499995,0.5726565,0.5041665,0.6710935],[0.215278,0.507031,0.383334,0.590625 ]])

它适用于矩形图像:

image = plt.imread(myimage) 
x = tf.image.draw_bounding_Boxes(image[None,...],np.array(bBoxes)[None,[[255.,0.,0.] for i in range(len(bBoxes))])
plt.imshow(x[0,...].numpy().astype(np.uint8))
plt.show()

enter image description here

但是当我将图片裁剪成正方形时,一切都会失败:

image = plt.imread(myimage)[:,280:-280]
x = tf.image.draw_bounding_Boxes(image[None,...].numpy().astype(np.uint8))
plt.show()

enter image description here

裁剪为正方形后,如何拥有正确的边框?我希望有一个640x640的正方形,然后将尺寸调整为320x320。

**编辑:**这有效:

 h,w,c = image.shape
    h_pad = 640 - h
    w_pad = 640 - w
    image = np.pad(image,[[h_pad//2,h_pad//2],[w_pad//2,w_pad//2],[0,0]],mode='edge')
    train_images_np.append(image) 
    
    annotations = []
    labels_temp = []
    with open(annot_path) as txtfile:
        reader = csv.reader(txtfile,delimiter=',')
        for row in reader:
            annotations.append(list([(h*(2*float(row[0])-1)/640+1)/2,(w*(2*float(row[1])-1)/640+1)/2,(h*(2*float(row[2])-1)/640+1)/2,(w*(2*float(row[3])-1)/640+1)/2
                                    ]))

解决方法

这是因为您没有考虑调整边界框的大小。
首先,您将从原始图像中获取边界框,然后根据正方形图像调整框的大小。
因此,通过这样做,您的所有边界框都将缩小,与我从输出图像中看到的数量相同。
解决方案:请勿调整边界框的大小,请使用delta替换其x坐标

delta = (width_orginal_image - width_new_image)//2
for each_boundary_box in all_boundary_box:
    new_box_x = each_boundary_box[0] - delta

从边界框的x条线中减去此增量

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?