Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何在OpenCV中的两个图像之间应用SoftLight blender?_Image_Opencv_Image Processing_Gimp - Fatal编程技术网

Image 如何在OpenCV中的两个图像之间应用SoftLight blender?

Image 如何在OpenCV中的两个图像之间应用SoftLight blender?,image,opencv,image-processing,gimp,Image,Opencv,Image Processing,Gimp,关于(和)我正在拍摄一张花的普通图像,然后是一张白色图像,然后我应用柔和的光线 这些是图像(花朵和白色图像): 结果应该与我在GIMP中得到的结果类似: 但它最终还是一张白色图像 我修改了代码以便将其放入函数中,这是我的代码: // function uint convSoftLight(int A, int B) { return ((uint)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A

关于(和)我正在拍摄一张花的普通图像,然后是一张白色图像,然后我应用柔和的光线

这些是图像(花朵白色图像):

结果应该与我在GIMP中得到的结果类似:

但它最终还是一张白色图像

我修改了代码以便将其放入函数中,这是我的代码:

// function
uint convSoftLight(int A, int B) {

    return ((uint)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A>>1)+64))*(float)(255-B)/255))));
}

void function() {
    Mat flower = imread("/Users/rafaelruizmunoz/Desktop/flower.jpg");
    Mat white_flower = Mat::zeros(Size(flower.cols, flower.rows), flower.type());
    Mat mix = Mat::zeros(Size(flower.cols, flower.rows), flower.type());

    for (int i = 0; i < white_flower.rows; i++) {
        for (int j = 0; j < white_flower.cols; j++) {
            white_flower.at<Vec3b>(i,j) = Vec3b(255,255,255);
        }
    }

    imshow("flower", flower);
    imshow("mask_white", white_flower);

    for (int i = 0; i < mix.rows; i++) {
        for (int j = 0; j < mix.cols; j++) {
            Vec3b vec = flower.at<Vec3b>(i,j);
            vec[0] = convSoftLight(vec[0], 255); // 255 or just the white_flower pixel at (i,j)
            vec[1] = convSoftLight(vec[1], 255); // 255 or just the white_flower pixel at (i,j)
            vec[2] = convSoftLight(vec[2], 255); // 255 or just the white_flower pixel at (i,j)
            mix.at<Vec3b>(i,j) = vec;
        }
    }


    imshow("mix", mix);
}
//函数
uint convSoftLight(内部A、内部B){
返回((uint)((B<128)?(2*((A>>1)+64))*((浮动)B/255):(255-(2*(255-((A>>1)+64))*(浮动)(255-B)/255));
}
空函数(){
Mat flower=imread(“/Users/rafaelruizmunoz/Desktop/flower.jpg”);
Mat white_flower=Mat::零(大小(flower.cols,flower.rows),flower.type());
Mat mix=Mat::零(大小(flower.cols,flower.rows),flower.type());
对于(int i=0;i
我做错了什么

多谢各位


编辑:我尝试翻转顺序(
convsoflight(B,A);
而不是
convsoflight(A,B)
),但是没有发生任何事情(黑色图像)

基于我重写的函数:

uint convSoftLight(int A, int B) {

    float a = (float)A / 255;
    float b = (float)B / 255;
    float result = 0;

    if (b < 0.5)
        result = 2 * a * b + pow(a,2) * (1 - 2*b);
    else
        result = 2 * a * (1-b) + sqrt(a) * (2*b - 1);

    return (uint)255* result;
}
uint convSoftLight(内部A、内部B){
浮动a=(浮动)a/255;
浮动b=(浮动)b/255;
浮动结果=0;
如果(b<0.5)
结果=2*a*b+pow(a,2)*(1-2*b);
其他的
结果=2*a*(1-b)+sqrt(a)*(2*b-1);
返回(uint)255*结果;
}

以下是如何在Python中实现soft light(使用OpenCV和NumPy):

将numpy导入为np
def applySoftLight(底部、顶部、遮罩):
“应用柔和的灯光混合
"""
断言全部(对于[底部、顶部、掩码]中的图像,image.dtype==np.float32)
blend=np.zeros(bottom.shape,dtype=np.float32)
低=np。其中((顶部<0.5)和(遮罩>0))
混合[低]=2*底部[低]*顶部[低]+底部[低]*底部[低]*(1-2*顶部[低])
高=np。其中((顶部>=0.5)和(遮罩>0))
混合[高]=2*底部[高]*(1-顶部[高])+np.sqrt(底部[高])*(2*顶部[高]-1)
#根据掩模进行阿尔法混合
结果=底部*(1-遮罩)+混合*遮罩
返回结果
所有矩阵必须是转换为np.float32类型的单通道2D矩阵。掩码是GIMP/Photoshop中的“层掩码”

import numpy as np

def applySoftLight(bottom, top, mask):
    """ Apply soft light blending
    """

    assert all(image.dtype == np.float32 for image in [bottom, top, mask])

    blend = np.zeros(bottom.shape, dtype=np.float32)

    low = np.where((top < 0.5) & (mask > 0))
    blend[low] = 2 * bottom[low] * top[low] + bottom[low] * bottom[low] * (1 - 2 * top[low])

    high = np.where((top >= 0.5) & (mask > 0))
    blend[high] = 2 * bottom[high] * (1 - top[high]) + np.sqrt(bottom[high]) * (2 * top[high] - 1)

    # alpha blending accroding to mask
    result = bottom * (1 - mask) + blend * mask

    return result