理解OpenCV矩阵操作

2024-09-30 14:28:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经开始使用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;
}

干杯


Tags: the代码imgmaskoutcv2facebackground