Как переписать двухмерный срез массива с помощью циклов (открытый формат cv)

1

Я пытаюсь получить определенную область (а не прямоугольник) из изображения. Из контура я смог сгенерировать все точки, содержащие эту область.

arialpoints = [[0,0],[0,1],[0,2]...]

Я просматриваю пример в opencv, который создал изображение, основанное на точках x, y координат и ширине

testimage = cv2.imread("foo.jpg")
cropped = testimage[x:x+width, y:y+height]
cv2.imwrite('final.jpg', cropped)

Но это для прямоугольной обрезанной области, я хотел бы сделать это для полигона. Есть ли способ, с помощью которого я могу генерировать testimage [x: x + width, y: y + height] из моих координат?

Теги:
opencv
image-processing
numpy
python-3.x

1 ответ

1
Лучший ответ

Позвольте мне попробовать на примере.

Скажем, у нас есть случайное изображение

np.random.seed(42)
img = np.random.randint(255, size=(10,10,3))

Изображение 174551

и список пунктов

points = np.array([[2, 2],
                   [3, 2],
                   [3, 3],
                   [4, 2],
                   [4, 3],
                   [5, 2],
                   [5, 3],
                   [5, 4],
                   [6, 5],
                   [7, 6]])

Вы можете создать двоичную маску для своих точек, как это (вам может потребоваться np.fliplr(points) зависимости от того, как определены координаты x и y)

mask = np.zeros_like(img)
mask[points.T.tolist()] = 1

Изображение 174551

Теперь вы можете использовать эту маску, чтобы выбрать область изображения, которое вы хотите

img = img * mask

Изображение 174551

и вы также можете ограничить свой выбор рамкой

xmin, ymin = np.min(points, axis=0)
xmax, ymax = np.max(points, axis=0)

cropped = img[xmin:xmax+1, ymin:ymax+1]

Изображение 174551

  • 0
    Я реализовал вышеупомянутое решение, оно работает как положено, спасибо, хотел бы знать, есть ли небольшая настройка, чтобы изменить фон на прозрачный, а не черный
  • 0
    @Saikiran все равно должно работать, если у вашего изображения есть альфа-канал. Если это не так, вы можете добавить один с img = np.dstack((img, 255 * np.ones((img.shape[:2])))) (предполагая, что альфа является последним столбцом, который по умолчанию с opencv)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню