我已经开始使用opencv,我正在尝试将我找到的一些python代码转换为c#(opencvsharp),这些代码用于将一个透明图像与另一个图像合并。有几行我不确定,希望有人能解释(即使不知道opencvsharp)
这是python代码
def blend_transparent(face_img, overlay_t_img):
# Split out the transparency mask from the colour info
overlay_img = overlay_t_img[:,:,:3] # Grab the BRG planes
overlay_mask = overlay_t_img[:,:,3:] # And the alpha plane
# Again calculate the inverse mask
background_mask = 255 - overlay_mask
# Turn the masks into three channel, so we can use them as weights
overlay_mask = cv2.cvtColor(overlay_mask, cv2.COLOR_GRAY2BGR)
background_mask = cv2.cvtColor(background_mask, cv2.COLOR_GRAY2BGR)
# Create a masked out face image, and masked out overlay
# We convert the images to floating point in range 0.0 - 1.0
face_part = (face_img * (1 / 255.0)) * (background_mask * (1 / 255.0))
overlay_part = (overlay_img * (1 / 255.0)) * (overlay_mask * (1 / 255.0))
# And finally just add them together, and rescale it back to an 8bit integer image
return np.uint8(cv2.addWeighted(face_part, 255.0, overlay_part, 255.0, 0.0))
我被这两条线困住了:
face_part = (face_img * (1 / 255.0)) * (background_mask * (1 / 255.0))
overlay_part = (overlay_img * (1 / 255.0)) * (overlay_mask * (1 / 255.0))
我的理解是face_img * (1 / 255.0)
将矩阵中的每个元素乘以1/255。对吗
这是我拥有的opencvsharp代码,它一直工作到相当于这两行代码
private Mat BlendTransparent(Mat faceImg, Mat overlay)
{
Mat[] rgbLayer;
Cv2.Split(overlay, out rgbLayer);
Mat[] rgb = { rgbLayer[0], rgbLayer[1], rgbLayer[2] };
Mat[] rgba = { rgbLayer[3] };
var overlayImg = new Mat();
var overylayMask = new Mat();
Cv2.Merge(rgb, overlayImg);
Cv2.Merge(rgba, overylayMask);
Mat backgroundMask = 255 - overylayMask;
Cv2.CvtColor(overylayMask, overylayMask, ColorConversionCodes.GRAY2BGR);
Cv2.CvtColor(backgroundMask, backgroundMask, ColorConversionCodes.GRAY2BGR);
// these 2 lines dont work the same as python
Mat facePart = Cv2.Multiply(faceImg * (1 / 255.0), backgroundMask * (1 / 255.0));
Mat overlayPart = Cv2.Multiply(overlayImg * (1 / 255.0), overylayMask * (1 / 255.0));
var output = new Mat();
Cv2.AddWeighted(facePart, 255.0, overlayPart, 255.0, 0.0, output);
return output;
}
干杯
目前没有回答
相关问题 更多 >
编程相关推荐