Насколько я понимаю, вы хотите преобразовать содержимое ограничительной рамки в оттенки серого и установить оставшуюся часть изображения в белый цвет (фон).
Вот мое решениедобиться этого:
import cv2
import numpy as np
# Some input image
image = cv2.imread('path/to/your/image.png')
# Some pts
pts = np.array([[60, 40], [340, 40], [340, 120], [60, 120]])
# Get extreme x, y coordinates from box
x1 = pts[0][0]
y1 = pts[0][1]
x2 = pts[1][0]
y2 = pts[2][1]
# Build output; initialize white background
image2 = 255 * np.ones(image.shape, np.uint8)
image2[y1:y2, x1:x2] = cv2.cvtColor(cv2.cvtColor(image[y1:y2, x1:x2], cv2.COLOR_BGR2GRAY), cv2.COLOR_GRAY2BGR)
# Show bounding box in original image
cv2.polylines(image, [pts], True, (0, 255, 0), 2)
cv2.imshow('image', image)
cv2.imshow('image2', image2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Основной «трюк» заключается в том, чтобы дважды использовать метод OpenCV cvtColor
только для области интереса (ROI) изображения, впервые преобразовав BGR воттенки серого, а затем оттенки серого обратно в BGR. Доступ к прямоугольным областям интереса в «изображениях Python OpenCV» осуществляется с помощью правильной индексации массива NumPy и нарезки . Операции только с этими областями интереса поддерживаются большинством функций OpenCV (Python API).
РЕДАКТИРОВАТЬ: Если ваше конечное изображение представляет собой обычное изображение в оттенках серого, обратное преобразование, конечно, может быть опущено!
Вот несколько выходных данных, сгенерированных моим «стандартным изображением»:
![Output 1](https://i.stack.imgur.com/YVnDf.png)
![Output 2](https://i.stack.imgur.com/vnc5V.png)
Надеюсь, это поможет!