Маскировка ROI без изменения размера изображения - PullRequest
1 голос
/ 07 июня 2019

У меня есть какое-то изображение скотоводческой фермы.Каждое изображение предполагает охват только двух загонов (небольшая комната для крупного рогатого скота).Тем не менее, камера также покрывает соседние ручки.Мне нужно избавиться от областей соседних ручек.

Входное изображение -

enter image here

Выходное изображение -

enter image here

Я попробовал следующую команду, и она выполняет свою работу.Тем не менее, он уменьшает размер изображения и выводит размер ограничивающего прямоугольника, сгенерированного в строке 2. Вывод становится меньше исходного изображения.В этом случае исходное изображение имеет размер 2560x1440, но его выход составляет 2536x1406.

import cv2
import numpy as np
import matplotlib.pyplot as plt

frame = cv2.imread("input.jpg")
# pts - location of the 4 corners of the roi
pts = np.array([[6, 1425],[953, 20 ],[1934, 40 ], [2541,1340]])
rect = cv2.boundingRect(pts)
x, y, w, h = rect
croped = frame[y:y + h, x:x + w].copy()
pts = pts - pts.min(axis=0)
mask = np.zeros(croped.shape[:2], np.uint8)
cv2.drawContours(mask, [pts], -1, (255, 255, 255), -1, cv2.LINE_AA)
frame_roi = cv2.bitwise_and(croped, croped, mask=mask)
cv2.imwrite("output.jpg", frame_roi)

Однако мне нужно, чтобы выходное изображение было того же размера, что и входное изображение, а все элементы из области интереса должны быть черными /белый (как показано ниже, это другая картина).Будет работать как белая, так и черная замаскированная область (на вышеприведенном выводе изображение черного цвета, а на отредактированном изображении ниже - белый).Есть ли способ сделать это с помощью opencv или любой другой библиотеки?

enter image description here

1 Ответ

2 голосов
/ 07 июня 2019

enter image description here

Ошибка была в этой строке

mask = np.zeros(croped.shape[:2], np.uint8)

, который должен быть точно такого же размера, что и исходное / входное изображение. Таким образом, изменение первоначальной формы должно дать правильное выходное изображение.

mask = np.zeros(original_image.shape, np.uint8)

Вот форма выходного изображения

(1440 л, 2560 л, 3 л)

import cv2
import numpy as np

original_frame = cv2.imread("1.jpg")
frame = original_frame.copy()

# pts - location of the 4 corners of the roi
pts = np.array([[6, 1425],[953, 20],[1934, 40], [2541,1340]])
(x,y,w,h) = cv2.boundingRect(pts)

pts = pts - pts.min(axis=0)
mask = np.zeros(original_frame.shape, np.uint8)
cv2.drawContours(mask, [pts], -1, (255, 255, 255), -1, cv2.LINE_AA)
result = cv2.bitwise_and(original_frame, mask)

cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.imwrite('result.png', result)
print(result.shape)
cv2.waitKey(0)
...