Если мы рассматриваем (0,0) как верхний левый угол вызываемого изображения im с направлением слева направо в направлении x и сверху вниз в направлении y. и у нас есть (x1, y1) в качестве верхней левой вершины и (x2, y2) в качестве нижней правой вершины прямоугольной области внутри этого изображения, тогда:
roi = im[y1:y2, x1:x2]
вот исчерпывающий ресурс по индексации и нарезке массивов numpy, который может рассказать вам больше о таких вещах, как обрезка части изображения. изображения будут храниться в виде массива numpy в opencv2.
:)
Ответ 3
Этот код обрезает изображение от x = 0, y = 0 до h = 100, w = 200.
Обратите внимание, что нарезка изображения - это не создание копии cropped image, а создание pointer для roi. Если вы загружаете так много изображений, обрезаете соответствующие части изображений с помощью нарезки, а затем добавляете в список, это может привести к огромной трате памяти.
Предположим, вы загружаете по N изображений >1MP и вам нужна только 100x100 область из верхнего левого угла.
Slicing:
X = [] for i inrange(N): im = imread('image_i') X.append(im[0:100,0:100]) # This will keep all N images in the memory. # Because they are still used.
В качестве альтернативы вы можете скопировать соответствующую часть с помощью .copy(), так что сборщик мусора удалит ее im.
X = [] for i inrange(N): im = imread('image_i') X.append(im[0:100,0:100].copy()) # This will keep only the crops in the memory. # im's will be deleted by gc.
Узнав об этом, я понял, что в одном из комментариев от пользователя 1270710 упоминалось об этом, но мне потребовалось довольно много времени, чтобы выяснить это (т. Е. Отладка и т.д.). Итак, я думаю, это заслуживает упоминания.