поли обрезка изображения python: Как изменить цвет маски

#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)