Bene, ecco una soluzione se si desidera che lo sfondo sia diverso da un colore nero solido. Abbiamo solo bisogno di invertire la maschera e applicarla in un'immagine di sfondo della stessa dimensione e quindi combinare sia lo sfondo che il primo piano. Un professionista di questa soluzione è che lo sfondo potrebbe essere qualsiasi cosa (anche altra immagine).
Questo esempio viene modificato da Hough Circle Transform. La prima immagine è il logo OpenCV, secondo la maschera originale, terzo lo sfondo + primo piano combinato.
# http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html
import cv2
import numpy as np
# load the image
img = cv2.imread('E:\\FOTOS\\opencv\\opencv_logo.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# detect circles
gray = cv2.medianBlur(cv2.cvtColor(img, cv2.COLOR_RGB2GRAY), 5)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=50, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
# draw mask
mask = np.full((img.shape[0], img.shape[1]), 0, dtype=np.uint8) # mask is only
for i in circles[0, :]:
cv2.circle(mask, (i[0], i[1]), i[2], (255, 255, 255), -1)
# get first masked value (foreground)
fg = cv2.bitwise_or(img, img, mask=mask)
# get second masked value (background) mask must be inverted
mask = cv2.bitwise_not(mask)
background = np.full(img.shape, 255, dtype=np.uint8)
bk = cv2.bitwise_or(background, background, mask=mask)
# combine foreground+background
final = cv2.bitwise_or(fg, bk)
Nota: È preferibile utilizzare i metodi OpenCV perché sono ottimizzati.
cosa stai cercando di fare? dal momento che ha il supporto di numpy, puoi usare le funzioni di numpy. –
Sto facendo un po 'di filtraggio nello spazio colore HSV all'immagine originale – pzo