裁剪的边界框不正确

Posted

技术标签:

【中文标题】裁剪的边界框不正确【英文标题】:Incorrect bounding boxes cropped 【发布时间】:2021-05-30 13:19:30 【问题描述】:

这是我在图像上可视化边界框的代码:

 viz_utils.visualize_boxes_and_labels_on_image_array(
  image_np_with_detections,
  detections['detection_boxes'][0].numpy(),
  (detections['detection_classes'][0].numpy() + label_id_offset).astype(int),
  detections['detection_scores'][0].numpy(),
  category_index,
  use_normalized_coordinates=True,
  max_boxes_to_draw=200,
  min_score_thresh=.5,
  agnostic_mode=False,

 )

这个是在检测后裁剪边界框:

width=600
height=900

boxes = detections['detection_boxes']
ymin = int((boxes[0][0][0]*height))
xmin = int((boxes[0][0][1]*width))
ymax = int((boxes[0][0][2]*height))
xmax = int((boxes[0][0][3]*width))
print ("xmin:  ".format(xmin),"ymin: ".format(ymin),"xmax: ".format(xmax),"ymax: ".format(ymax))

from PIL import Image
img = Image.open(image_path)
img2 = img.crop((xmin,xmax,ymin,ymax))
img2.save("/content/gdrive/MyDrive/UrduDetection/Croped_images/img8.jpg")

这不是正确的本地化裁剪。

如何获得检测到的边界框的正确裁剪图像?

【问题讨论】:

【参考方案1】:

PIL 的 crop() 函数不接受您提供的参数。您应该像 (left, top, right, bottom) 一样使用它,在您的情况下是:

img2 = img.crop((xmin,ymin,xmax,ymax))

或者您可以将图像打开为 numpy 数组并使用索引来裁剪它。

img  = numpy.asarray(PIL.Image.open('test.jpg'))
img2 = img[ymin:ymax, xmin:xmax, ...]

编辑

我不知道你的可视化函数里面有什么,所以我不知道它是如何工作的或不工作的。但只要看看你的情节数字,我就知道xmin-xmax 应该大致是200-620 而不是143-420。并且对于ymin-ymax,您正在使用的是510-560,而不是779-856。 你给出了一个不存在的 y 范围,因此你的黑色输出。

您可能以错误的方式转换了可视化函数之外的坐标,您的坐标可能是 xc,yc,w,h 并且您将其视为 xmin,xmax,ymin,ymax

【讨论】:

img2 = img.crop((xmin,ymin,xmax,ymax)) 它给出了一个空白的黑色图像。 我有一个图像的 numpy 数组,当我尝试 img2 = img[ymin:ymax, xmin:xmax]; img2.save("/content/gdrive/MyDrive/UrduDetection/Croped_images/img13.jpg") 它说 TypeError: 'JpegImageFile' object is not subscriptable。 @maryammehboob 它说“JpegImageFile”不可下标,因为它不是一个 numpy 数组。首先将其转换为 numpy 数组。 @maryammehboob 如果你得到一张空白的黑色图像,那么你的坐标是错误的。 如果图像上出现的边界框是正确的,坐标怎么可能是错误的?

以上是关于裁剪的边界框不正确的主要内容,如果未能解决你的问题,请参考以下文章

ghostscript 裁剪 pdf 不正确

Python:为啥我的代码没有正确裁剪选定的图像?

使用边界框列表从图像中裁剪多个边界框

如何使用边界框裁剪图像

如何将 .OBJ 3D 模型自动裁剪为边界框?

使用 python 裁剪边界框