#python #opencv #polygon #mask
#python #opencv #полигон #маска
Вопрос:
Я обрезаю изображение с помощью массива полигонов, но мне нужно изменить цвет маски swo на РОЗОВЫЙ, чтобы другая программа распознала его как маску. Как это сделать?
import numpy as np
import cv2
import time
img = cv2.imread("teste3.jpg")
start=time.time()
height = img.shape[0]
width = img.shape[1]
mask = np.zeros((height, width), dtype=np.uint8)
points = np.array([[[692,71],[1386,71],[1617,520],[1617,817],[495,817],[692,520]]])
cv2.fillPoly(mask, points, (255))
res = cv2.bitwise_and(img,img,mask = mask)
rect = cv2.boundingRect(points) # returns (x,y,w,h) of the rect
cropped = res[rect[1]: rect[1] rect[3], rect[0]: rect[0] rect[2]]
print(time.time() - start)
cv2.imshow("cropped" , cropped )
cv2.waitKey(0)
Ответ №1:
Есть несколько способов:
-
условное выражение numpy (выполняется за 35 мс):
pink = (255, 0, 255) res = img.copy() res[mask==0] = pink
-
разделение cv2 битовые изменения слияние (выполняется за 20 мс):
pink = (255, 0, 255) whitesheet = np.full_like(mask, 255) mask_inv = cv2.bitwise_not(mask) channels = cv2.split(img) for i in range(len(channels)): a = cv2.bitwise_and(whitesheet, channels[i], mask=mask) b = cv2.bitwise_and(whitesheet, pink[i], mask=mask_inv) channels[i] = cv2.bitwise_or(a, b) res = cv2.merge(channels)