es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , , , ,

Answer

  1. Avatar for 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, como cv2.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.

Comments are closed.