Image 如何在OpenCV中的两个图像之间应用SoftLight blender?
关于(和)我正在拍摄一张花的普通图像,然后是一张白色图像,然后我应用柔和的光线 这些是图像(花朵和白色图像): 结果应该与我在GIMP中得到的结果类似: 但它最终还是一张白色图像 我修改了代码以便将其放入函数中,这是我的代码: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
// 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