Algoritmo de fusión de capas (1)

Visualización de resultados mixtos comunes

 Oscurecer la capa después de mezclar

modo normal

Color de fusión*Opacidad+(100% - Opacidad del color de fusión)

void layerblend_normal(Mat &base,Mat &blend,Mat &dst,float opacity)
{
    if (base.rows != blend.rows ||
        base.cols != blend.cols ||
        base.type() != blend.type())
        return;

    dst = Mat::zeros(base.rows,base.cols,base.type());

    for (int h = 0;h < base.rows;h ++)
    {
        uchar *d1 = base.ptr<uchar>(h);
        uchar *d2 = blend.ptr<uchar>(h);
        uchar *d3 = dst.ptr<uchar>(h);
        for (int w = 0;w < base.cols;w ++)
        {
            int cw = w * base.channels();
            for (int c = 0;c < base.channels();c ++)
                d3[cw + c] = opacity * d1[cw + c] + (1.0f - opacity) * d2[cw + c];
        }
    }
}

Disolver

        Si la opacidad y el relleno del color mezclado en el modo de disolución son ambos del 100%, no podremos ver la capa de color base. Después de reducir la opacidad de la capa de color mezclada, notaremos que hay muchas partículas pequeñas en el color resultante. Estas partículas cambian con la opacidad del color de la mezcla. Cuanto menor sea la opacidad, más capa de color mezclada se disolverá. Queda menos parte. Cuanto mayor es la opacidad, menos parte de la capa de color mezclada se disuelve y más queda, y más cercano será el color resultante al color mezclado.

oscuridad

        En el modo de mezcla de oscurecimiento, comparará el color mezclado con el color base y seleccionará el valor más pequeño entre los tres conjuntos de valores R, G y B, es decir, el color más oscuro, como valor del color resultante. Esto oscurecerá toda la imagen y, si es una imagen en color, el color también cambiará mucho. (No habrá cambios si se intercambia la posición)

void layerblend_darkness(Mat &base,Mat &blend,Mat &dst)
{
    if (base.rows != blend.rows ||
        base.cols != blend.cols ||
        base.type() != blend.type())
        return;

    dst = Mat::zeros(base.rows,base.cols,base.type());

    for (int h = 0;h < base.rows;h ++)
    {
        uchar *d1 = base.ptr<uchar>(h);
        uchar *d2 = blend.ptr<uchar>(h);
        uchar *d3 = dst.ptr<uchar>(h);
        for (int w = 0;w < base.cols;w ++)
        {
            int cw = w * base.channels();
            for (int c = 0;c < base.channels();c ++)
                d3[cw + c] = d1[cw + c] < d2[cw + c] ? d1[cw + c] : d2[cw + c];
        }
    }
}

Multiplicar

        Principio de mezcla multiplicada: se calcula en función de los valores R, G y B del color mezclado y el color base. La fórmula de cálculo es: color resultante R = color mezclado R * color base R / 255. El valor G y el valor B se calculan de la misma manera. Los valores finales de R, G y B obtenidos son los colores de los colores resultantes. Dado que el valor máximo de cada canal es 255, el valor del color resultante es menor que los valores del color mezclado y el color base, es decir, el color resultante es más oscuro. (No habrá cambios si se intercambia la posición)

void layerblend_multiply(Mat &base,Mat &blend,Mat &dst)
{
    if (base.rows != blend.rows ||
        base.cols != blend.cols ||
        base.type() != blend.type())
        return;

    dst = Mat::zeros(base.rows,base.cols,base.type());

    for (int h = 0;h < base.rows;h ++)
    {
        uchar *d1 = base.ptr<uchar>(h);
        uchar *d2 = blend.ptr<uchar>(h);
        uchar *d3 = dst.ptr<uchar>(h);
        for (int w = 0;w < base.cols;w ++)
        {
            int cw = w * base.channels();
            for (int c = 0;c < base.channels();c ++)
                d3[cw + c] = 1.0f * d1[cw + c] * d2[cw + c] / 255;
        }
    }
}

color oscuro

        Color Burn puede agregar rápidamente oscuridad a una imagen. Su fórmula de cálculo: Color resultado = (color base + color mezclado - 255) * 255 / color mezclado. Entre ellos (color base + color mixto - 255), si hay un número negativo, se devolverá directamente a 0. Por lo tanto, cuando el color base y el color mezclado sean oscuros, directamente se volverán negros. Esto aumentará la oscuridad del color resultante. En contraste, el efecto general parece relativamente fuerte.

void layerblend_color_dark(Mat &base,Mat &blend,Mat &dst)
{
    if (base.rows != blend.rows ||
        base.cols != blend.cols ||
        base.type() != blend.type())
        return;

    dst = Mat::zeros(base.rows,base.cols,base.type());

    for (int h = 0;h < base.rows;h ++)
    {
        uchar *d1 = base.ptr<uchar>(h);
        uchar *d2 = blend.ptr<uchar>(h);
        uchar *d3 = dst.ptr<uchar>(h);
        for (int w = 0;w < base.cols;w ++)
        {
            int cw = w * base.channels();
            for (int c = 0;c < base.channels();c ++){
                d3[cw + c] = 1.0f * d1[cw + c] * d2[cw + c] / 255;

                 int temp = d1[cw + c] + d2[cw + c] - 255;

                 temp = temp < 0 ? 0 : temp;

                 int res = 0;
                 if (d2[cw + c] == 0)
                     res = d1[cw + c];
                 else
                     res = temp * 255.0f / d2[cw + c];

                 d3[cw + c] = saturate_cast<uchar>(res);
            }
        }
    }
}

 Modo oscuro (oscuro)

        El modo de fusión oscuro es más fácil de entender. Calcula los valores de todos los canales del color mezclado y del color base, y luego selecciona el valor más pequeño como color resultante. Por lo tanto, el color resultante es sólo el mismo que el color de la mezcla o el color base, y no se producen otros colores. El blanco se mezcla con el color base para obtener el color base y el negro se mezcla con el color base para obtener negro. En el modo oscuro, los valores del color mezclado y el color base son fijos. Después de invertir las posiciones, el color resultante del color mezclado no cambia. Este modo es similar al modo de oscurecimiento.

Supongo que te gusta

Origin blog.csdn.net/hulinhulin/article/details/133252870
Recomendado
Clasificación