调整图像大小及其边界框

时间:2018-03-24 14:46:59

标签: python-3.x numpy opencv math image-processing

我有一个带有边界框的图像,我想调整图像大小。

img = cv2.imread("img.jpg",3)
x_ = img.shape[0]
y_ = img.shape[1]
img = cv2.resize(img,(416,416));

现在我想计算比例因子:

x_scale = ( 416 / x_)
y_scale = ( 416 / y_ )

绘制图像,这是原始边界框的代码:

( 128, 25, 447, 375 ) = ( xmin,ymin,xmax,ymax)
x = int(np.round(128*x_scale))
y = int(np.round(25*y_scale))
xmax= int(np.round  (447*(x_scale)))
ymax= int(np.round(375*y_scale))

然而,使用这个我得到:

enter image description here

原作是:

enter image description here

我没有在这个逻辑中看到任何标志,出了什么问题?

整个代码:

imageToPredict = cv2.imread("img.jpg",3)
print(imageToPredict.shape)

x_ = imageToPredict.shape[0]
y_ = imageToPredict.shape[1]

x_scale = 416/x_
y_scale = 416/y_
print(x_scale,y_scale)
img = cv2.resize(imageToPredict,(416,416));
img = np.array(img);


x = int(np.round(128*x_scale))
y = int(np.round(25*y_scale))
xmax= int(np.round  (447*(x_scale)))
ymax= int(np.round(375*y_scale))
Box.drawBox([[1,0, x,y,xmax,ymax]],img)

和drawbox

def drawBox(boxes, image):
    for i in range (0, len(boxes)):
        cv2.rectangle(image,(boxes[i][2],boxes[i][3]),(boxes[i][4],boxes[i][5]),(0,0,120),3)
    cv2.imshow("img",image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

分别加载边界框的图像和数据。我正在图像中绘制边界框。图像不包含框本身。

3 个答案:

答案 0 :(得分:6)

我认为有两个问题:

  1. 您应该交换x_y_,因为shape[0]实际上是y维度,shape[1]是x维度
  2. 您应该在原始和缩放图像上使用相同的坐标。在原始图片上,矩形为(160, 35) - (555, 470),而不是您在代码中使用的(128,25) - (447,375)
  3. 如果我使用以下代码:

    import cv2
    import numpy as np
    
    
    def drawBox(boxes, image):
        for i in range(0, len(boxes)):
            # changed color and width to make it visible
            cv2.rectangle(image, (boxes[i][2], boxes[i][3]), (boxes[i][4], boxes[i][5]), (255, 0, 0), 1)
        cv2.imshow("img", image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    
    def cvTest():
        # imageToPredict = cv2.imread("img.jpg", 3)
        imageToPredict = cv2.imread("49466033\\img.png ", 3)
        print(imageToPredict.shape)
    
        # Note: flipped comparing to your original code!
        # x_ = imageToPredict.shape[0]
        # y_ = imageToPredict.shape[1]
        y_ = imageToPredict.shape[0]
        x_ = imageToPredict.shape[1]
    
        targetSize = 416
        x_scale = targetSize / x_
        y_scale = targetSize / y_
        print(x_scale, y_scale)
        img = cv2.resize(imageToPredict, (targetSize, targetSize));
        print(img.shape)
        img = np.array(img);
    
        # original frame as named values
        (origLeft, origTop, origRight, origBottom) = (160, 35, 555, 470)
    
        x = int(np.round(origLeft * x_scale))
        y = int(np.round(origTop * y_scale))
        xmax = int(np.round(origRight * x_scale))
        ymax = int(np.round(origBottom * y_scale))
        # Box.drawBox([[1, 0, x, y, xmax, ymax]], img)
        drawBox([[1, 0, x, y, xmax, ymax]], img)
    
    
    cvTest()
    

    并将您的“原始”图片用作“49466033 \ img.png”,

    Original image

    我得到以下图片

    Processed image

    正如您所看到的那样,我的较细蓝线恰好位于原始红线内,并且无论您选择targetSize,它都会保留在那里(因此缩放实际上可以正常工作)。

答案 1 :(得分:0)

您可以使用resize_dataset_pascalvoc

使用python3 main.py -p <IMAGES_&_XML_PATH> --output <IMAGES_&_XML> --new_x <NEW_X_SIZE> --new_y <NEW_X_SIZE> --save_box_images <FLAG>"

很容易

它调整所有数据集的大小并重写新的注释文件以调整图像的大小

答案 2 :(得分:0)

另一种方法是使用 CHITRA

image = Chitra(img_path, box, label)
# Chitra can rescale your bounding box automatically based on the new image size.
image.resize_image_with_bbox((224, 224))

print('rescaled bbox:', image.bounding_boxes)
plt.imshow(image.draw_boxes())

https://chitra.readthedocs.io/en/latest/

<块引用>

pip 安装 chitra