Как пройти сквозь ограничивающие рамки рисования изображений? - PullRequest
0 голосов
/ 09 марта 2020

Я хочу пройти по изображению и нарисовать на нем ограничивающие рамки, а также выполнить некоторые расчеты с подматрицей изображения. Я пытаюсь заставить следующий код на C ++ работать в Python ( взято из ответа здесь ).

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. Это мой код в 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()

Так как изображение 256 x 256 и мой шаг 64, я ожидаю напечатать 16 областей, но он печатает только первую, а остальные кажутся пустыми (посмотрите на размер объекта Подушка). Я также не понимаю, почему это печатает это 24 раза (<PIL.Image.Image>), в то время как я ожидаю 16. Вот мой вывод:

[[[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>
<PIL.Image.Image image mode=RGBA size=0x0 at 0x11937F5F8>
<PIL.Image.Image image mode=RGBA size=0x0 at 0x10E9A4748>
<PIL.Image.Image image mode=RGBA size=64x0 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=0x0 at 0x10E9A4748>
<PIL.Image.Image image mode=RGBA size=0x0 at 0x11937F3C8>
<PIL.Image.Image image mode=RGBA size=64x0 at 0x1193618D0>
<PIL.Image.Image image mode=RGBA size=0x0 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>

После ответа здесь , я понял что мне нужно было превратить изображение в массив NumPy сразу после открытия изображения, однако это не помогает.

Что я делаю не так? Буду признателен за любую помощь.

РЕДАКТИРОВАТЬ: Я сделал это, используя массив NumPy. Я все еще не понимаю, почему и как использование урожая Подушки не работало.

image = Image.open(path)
step = 64
rows, cols = image.size
image_arr = np.asarray(image) #Added this

for row in range(0, rows, step):
    for col in range(0, cols, step):
          roi = image_arr[row:row+step, col:col+step] #Added this instead of using Pillow
          print(np.mean(roi))

1 Ответ

2 голосов
/ 09 марта 2020

Мне интересно, почему вы вообще используете PIL, особенно ваш исходный код основан на OpenCV, и вам все равно нужно обрабатывать NumPy массивов.

Это было бы моим решением:

import cv2
import numpy as np

# Read input image; create additional output image to draw on
image = cv2.imread('ZsyOG.png')
image_out = image.copy()

# Parameters
step = 64
cols, rows = image.shape[:2]

# Actual processing in loop
i_region = 0
for row in np.arange(0, rows, step):
    for col in np.arange(0, cols, step):
        mean = cv2.mean(image[row:row+step, col:col+step])
        image_out = cv2.rectangle(img=image_out,
                                  pt1=(row, col),
                                  pt2=(row + step, col + step),
                                  color=(255, 255, 255),
                                  thickness=1)
        image_out = cv2.putText(img=image_out,
                                text=str(i_region),
                                org=(int(col+1/2*step), int(row+1/2*step)),
                                fontFace=cv2.FONT_HERSHEY_COMPLEX_SMALL,
                                fontScale=1.0,
                                color=(255, 255, 255))
        print('Region: ', i_region, '| Mean: ', mean)
        i_region += 1

cv2.imshow('image_out', image_out)
cv2.waitKey(0)
cv2.destroyAllWindows()

Вывод изображения:

Output image

Вывод на печать:

Region:  0 | Mean:  (0.0, 0.0, 255.0, 0.0)
Region:  1 | Mean:  (0.0, 0.0, 255.0, 0.0)
Region:  2 | Mean:  (0.0, 255.0, 255.0, 0.0)
Region:  3 | Mean:  (0.0, 255.0, 255.0, 0.0)
Region:  4 | Mean:  (0.0, 0.0, 255.0, 0.0)
Region:  5 | Mean:  (0.0, 0.0, 255.0, 0.0)
Region:  6 | Mean:  (0.0, 255.0, 255.0, 0.0)
Region:  7 | Mean:  (0.0, 255.0, 255.0, 0.0)
Region:  8 | Mean:  (0.0, 0.0, 0.0, 0.0)
Region:  9 | Mean:  (0.0, 0.0, 0.0, 0.0)
Region:  10 | Mean:  (255.0, 0.0, 0.0, 0.0)
Region:  11 | Mean:  (255.0, 0.0, 0.0, 0.0)
Region:  12 | Mean:  (0.0, 0.0, 0.0, 0.0)
Region:  13 | Mean:  (0.0, 0.0, 0.0, 0.0)
Region:  14 | Mean:  (255.0, 0.0, 0.0, 0.0)
Region:  15 | Mean:  (255.0, 0.0, 0.0, 0.0)

Надеюсь, что поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
OpenCV:      4.2.0
----------------------------------------
...