如何遍历图像绘图边界框?

我想遍历图像并在图像中绘制边界框,然后使用图像的子矩阵进行一些计算。我试图让下面的代码在python中工作C++(取自这里的答案)。


for (int y = 0; y<resizedImage.cols - 32; y += 32) {

    for (int x = 0; x<resizedImage.rows - 32; x += 32) {

        // get the average for the whole 32x32 block

        Rect roi(x, y, 32, 32);

        Scalar mean, dev;

        meanStdDev(resizedImage(roi), mean, dev); // mean[0] is the mean of the first channel, gray scale value;

    }

}

我想计算平均值并打印 ROI。这是我使用Pillow的Python代码。我用于代码的图像在这里。


image = Image.open(path)

draw = ImageDraw.Draw(image)

step = 64

original_rows, original_cols = image.size

rows = original_rows + step

cols = original_cols + step

image_arr = np.asarray(image)


for row in range(0, rows, step):

    if row <= rows - step:

        for col in range(0, cols, step):

            if col <= cols - step:

                box = (col,row,step,step)

                region = image.crop(box)

                print(np.asarray(region))

                draw.rectangle([col,row,step,step], width = 1, outline="#FFFFFF")

image.show()

由于图像是,而我的步骤是,我期望打印16个区域,但它只打印第一个区域,其余的似乎是空的(看看Pillow对象的大小)。我也不明白为什么它打印了24次(),而我期待16次。这是我的输出:256 x 25664<PIL.Image.Image>


[[[255   0   0 255]

  [255   0   0 255]

  [255   0   0 255]

  ...

  [255   0   0 255]

  [255   0   0 255]

  [255   0   0 255]]]]


<PIL.Image.Image image mode=RGBA size=0x64 at 0x11937F5F8>

<PIL.Image.Image image mode=RGBA size=0x64 at 0x10E9A4748>

<PIL.Image.Image image mode=RGBA size=0x64 at 0x11937F3C8>

<PIL.Image.Image image mode=RGBA size=0x64 at 0x1193618D0>

<PIL.Image.Image image mode=RGBA size=64x0 at 0x11937F5F8>

<PIL.Image.Image image mode=RGBA size=0x0 at 0x10E9A4748>

<PIL.Image.Image image mode=RGBA size=0x0 at 0x11937F3C8>

<PIL.Image.Image image mode=RGBA size=0x0 at 0x1193618D0>

<PIL.Image.Image image mode=RGBA size=0x0 at 0x11937F5F8>

<PIL.Image.Image image mode=RGBA size=64x0 at 0x10E9A4748>

<PIL.Image.Image image mode=RGBA size=0x0 at 0x11937F3C8>

<PIL.Image.Image image mode=RGBA size=0x0 at 0x1193618D0>

按照这里的答案,我明白我需要在打开图像后立即将图像转换为NumPy数组,但是,这无济于事。


我做错了什么?我将不胜感激任何帮助。

潇湘沐
浏览 166回答 1
1回答

翻翻过去那场雪

我想知道,为什么你使用PIL,特别是你的代码源是基于OpenCV的,无论如何你都需要处理NumPy数组。这就是我的解决方案:import cv2import numpy as np# Read input image; create additional output image to draw onimage = cv2.imread('ZsyOG.png')image_out = image.copy()# Parametersstep = 64cols, rows = image.shape[:2]# Actual processing in loopi_region = 0for row in np.arange(0, rows, step):&nbsp; &nbsp; for col in np.arange(0, cols, step):&nbsp; &nbsp; &nbsp; &nbsp; mean = cv2.mean(image[row:row+step, col:col+step])&nbsp; &nbsp; &nbsp; &nbsp; image_out = cv2.rectangle(img=image_out,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pt1=(row, col),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pt2=(row + step, col + step),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color=(255, 255, 255),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thickness=1)&nbsp; &nbsp; &nbsp; &nbsp; image_out = cv2.putText(img=image_out,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text=str(i_region),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org=(int(col+1/2*step), int(row+1/2*step)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fontFace=cv2.FONT_HERSHEY_COMPLEX_SMALL,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fontScale=1.0,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color=(255, 255, 255))&nbsp; &nbsp; &nbsp; &nbsp; print('Region: ', i_region, '| Mean: ', mean)&nbsp; &nbsp; &nbsp; &nbsp; i_region += 1cv2.imshow('image_out', image_out)cv2.waitKey(0)cv2.destroyAllWindows()输出图像:打印输出:Region:&nbsp; 0 | Mean:&nbsp; (0.0, 0.0, 255.0, 0.0)Region:&nbsp; 1 | Mean:&nbsp; (0.0, 0.0, 255.0, 0.0)Region:&nbsp; 2 | Mean:&nbsp; (0.0, 255.0, 255.0, 0.0)Region:&nbsp; 3 | Mean:&nbsp; (0.0, 255.0, 255.0, 0.0)Region:&nbsp; 4 | Mean:&nbsp; (0.0, 0.0, 255.0, 0.0)Region:&nbsp; 5 | Mean:&nbsp; (0.0, 0.0, 255.0, 0.0)Region:&nbsp; 6 | Mean:&nbsp; (0.0, 255.0, 255.0, 0.0)Region:&nbsp; 7 | Mean:&nbsp; (0.0, 255.0, 255.0, 0.0)Region:&nbsp; 8 | Mean:&nbsp; (0.0, 0.0, 0.0, 0.0)Region:&nbsp; 9 | Mean:&nbsp; (0.0, 0.0, 0.0, 0.0)Region:&nbsp; 10 | Mean:&nbsp; (255.0, 0.0, 0.0, 0.0)Region:&nbsp; 11 | Mean:&nbsp; (255.0, 0.0, 0.0, 0.0)Region:&nbsp; 12 | Mean:&nbsp; (0.0, 0.0, 0.0, 0.0)Region:&nbsp; 13 | Mean:&nbsp; (0.0, 0.0, 0.0, 0.0)Region:&nbsp; 14 | Mean:&nbsp; (255.0, 0.0, 0.0, 0.0)Region:&nbsp; 15 | Mean:&nbsp; (255.0, 0.0, 0.0, 0.0)希望有所帮助!----------------------------------------System information----------------------------------------Platform:&nbsp; &nbsp; Windows-10-10.0.16299-SP0Python:&nbsp; &nbsp; &nbsp; 3.8.1NumPy:&nbsp; &nbsp; &nbsp; &nbsp;1.18.1OpenCV:&nbsp; &nbsp; &nbsp; 4.2.0----------------------------------------
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python