Как сделать прозрачный прямоугольник с обратным заполнением с помощью OpenCV? - PullRequest
4 голосов
/ 28 февраля 2020

Я хочу сделать на этой картинке прямоугольник с обратной заливкой.

enter image description here

Код, который у меня есть:

import cv2

lena = cv2.imread('lena.png')

output = lena.copy()
cv2.rectangle(lena, (100, 100), (200, 200), (0, 0, 255), -1)
cv2.addWeighted(lena, 0.5, output, 1 - .5, 0, output)

cv2.imshow('', output)

enter image description here

Что я хочу:

enter image description here

Ответы [ 2 ]

3 голосов
/ 28 февраля 2020

Вот что я бы сделал:

# initialize output
output = np.zeros_like(lena, dtype=np.uint8)
output[:,:,-1] = 255

# this is your box top_x
tx,ly,bx,ry = 100,100,200,200

# copy lena to output
output[tx:bx,ly:ry] = lena[tx:bx,ly:ry]

cv2.addWeighted(lena, 0.5, output, 1 - .5, 0, output);

Выход:

enter image description here

1 голос
/ 29 февраля 2020

Вот еще один способ сделать это в Python / OpenCV. Хотя это не так элегантно, как решение Quang Hoang.

  • Считайте ввод
  • Создайте красное изображение того же размера
  • Смешайте красное изображение с входные данные
  • Создание белого изображения с черным прямоугольником для «дыры»
  • Объединение смешанного изображения и исходного изображения с использованием маски
  • Сохранение результата

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('lena.jpg')

# create red image
red = np.full_like(img,(0,0,255))

# add red to img and save as new image
blend = 0.5
img_red = cv2.addWeighted(img, blend, red, 1-blend, 0)

# create white image for mask base
mask = np.full_like(img, (1,1,1), dtype=np.float32)

# define rectangle for "hole" and draw as black filled on the white base mask
x1,y1,x2,y2 = 100,100,200,200
mask = cv2.rectangle(mask, (x1, y1), (x2, y2), (0, 0, 0), -1)

# combine img and img_red using mask
result = cv2.add(img*(1-mask),img_red*mask).astype(np.uint8)

cv2.imshow('img', img)
cv2.imshow('red', red)
cv2.imshow('img_red', img_red)
cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('lena_hole_mask.jpg', (255*mask).astype(np.uint8))
cv2.imwrite('lena_plus_red.jpg', result)


Маска:

enter image description here

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...