Почему мои изображения неправильно обрезаются с помощью базовой нарезки NumPy?

Я пытаюсь вырезать квадратные патчи из изображений на основе координат центра и масштаба, используя базовую нарезку NumPy (точно так же, как этот вопрос):

label_index, photo_id, ratio_x, ratio_y = line.split(",")
label = LABELS[int(label_index)]
bgr = cv2.imread(DIR_DATASET + "images/" + folder + "/" + photo_id + ".jpg")
height, width = bgr.shape[:2]
center_x, center_y = int(width * float(ratio_x)), int(height * float(ratio_y))
print("center: " + str(center_x) + ", " + str(center_y))
patch_radius = int((min(width, height) * 0.23) / 2)
print("patch radius: " + str(patch_radius))
min_x = center_x - patch_radius
min_y = center_y - patch_radius
max_x = center_x + patch_radius
max_y = center_y + patch_radius
if min_x < 0 or min_y < 0 or max_x > width or max_y > height: continue
print("coords: min: " + str(min_x) + ", " + str(min_y) + "; max: " + str(max_x) + ", " + str(max_y))
patch = bgr[min_x:max_x,min_y:max_y,:] # bgr[min_x:max_x,min_y:max_y] gives the same results
print("patch shape: " + str(patch.shape))

Однако извлеченные патчи часто вовсе не квадратные, о чем свидетельствуют операторы печати:

NEWLINE
center: 2002, 598
patch radius: 230
coords: min: 1772, 368; max: 2232, 828
patch shape: (228, 460, 3)
NEWLINE
center: 2375, 727
patch radius: 230
coords: min: 2145, 497; max: 2605, 957
patch shape: (0, 460, 3)
NEWLINE
center: 2566, 820
patch radius: 230
coords: min: 2336, 590; max: 2796, 1050
patch shape: (0, 460, 3)
NEWLINE
center: 2195, 603
patch radius: 230
coords: min: 1965, 373; max: 2425, 833
patch shape: (35, 460, 3)

Минимальные и максимальные координаты рассчитаны правильно, так что очевидно, что мой способ нарезки должен быть неправильным? Что мне здесь не хватает?


person EmielBoss    schedule 11.07.2019    source источник
comment
Вы пытаетесь извлечь ROI, учитывая координаты прямоугольника/квадрата?   -  person nathancy    schedule 12.07.2019
comment
Да? Патчи/RoI должны быть строго квадратными, с размером 23% от наименьшего размера изображения.   -  person EmielBoss    schedule 12.07.2019
comment
Может быть полезно также распечатать bgr.shape   -  person Dave W. Smith    schedule 12.07.2019


Ответы (1)


Вы неправильно нарезаете. Синтаксис sub_image = full_image[y_start: y_end, x_start:x_end].

В вашем коде первые пределы координат в соединении — это координаты x, а вместо них должны быть координаты y. То есть, вы должны исправить свою линию сращивания на

patch = bgr[min_y : max_y, min_x : max_x] 
person Shawn Mathew    schedule 11.07.2019
comment
Разве ты не сказал это задом наперёд? По крайней мере, это несовместимо с вашим приказом. - person fmw42; 12.07.2019