cv2.addweighted: la imagen ponderada aparece demasiado brillante.
Estoy utilizando la caja de herramientas cv2 y quiero mezclar/pesar dos imágenes, donde una imagen es una máscara de una prenda de vestir que aparece en la primera imagen. Sin embargo, la imagen ponderada aparece demasiado brillante, independientemente de los valores de los parámetros. Cambié alfa, beta, gamma varias veces sin ninguna diferencia significativa. ¿Alguien sabe por qué todos los colores parecen estar suprimidos y cómo puedo mezclar realmente las dos imágenes para resaltar visiblemente el objeto enmascarado en la imagen original?
Puedes ver las tres imágenes aquí. Utilizo el siguiente código en colab:
import pdb
for i in range(len(md)):
imag = cv2.imread("chloe/"+md.ImageId[i]+".jpg")
# pdb.set_trace()
imag = _scale_image(imag, 1024)
mask = cv2.resize(np.float32(md.Maskdata[i]), (imag.shape[1],imag.shape[0]), interpolation=cv2.INTER_NEAREST)
where = np.where(mask!=0)
y1,y2,x1,x2 = 0,0,0,0
if len(where[0]) > 0 and len(where[1]) > 0:
y1,y2,x1,x2 = min(where[0]),max(where[0]),min(where[1]),max(where[1])
if y2>y1+80 and x2>x1+80 and np.sum(mask)/255 > 1000:
print("image id=",md.ImageId[i])
plt.subplot(1,3,1)
plt.imshow(imag)
plt.subplot(1,3,2)
plt.imshow(mask)
plt.subplot(1,3,3)
mask2 = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
dst = cv2.addWeighted(np.float32(imag), 0.5, mask2, 0.5, 0)
plt.imshow(dst)
plt.show()
con la función:
import math
def _scale_image(img, long_size):
if img.shape[0] < img.shape[1]:
scale = img.shape[1] / long_size
size = (long_size, math.floor(img.shape[0] / scale))
else:
scale = img.shape[0] / long_size
size = (math.floor(img.shape[1] / scale), long_size)
return cv2.resize(img, size, interpolation=cv2.INTER_NEAREST)
davy.ai
Parece que el problema está relacionado con la mezcla de alfa que se está utilizando en la función
addWeighted
, lo cual está haciendo que los colores se vean desvanecidos. Una solución podría ser utilizar un método diferente para mezclar las dos imágenes, comocv2.multiply
, que multiplica los valores de píxeles en lugar de mezclarlos. Puedes intentar reemplazar esta línea:dst = cv2.addWeighted(np.float32(imag), 0.5, mask2, 0.5, 0)
con:
dst = cv2.multiply(np.float32(imag), mask2/255)
Esto debería dar un mejor resultado con una máscara más visible en la imagen original. También puedes ajustar los valores pasados a
multiply
para controlar la intensidad de la máscara.