Hướng dẫn alpha blending python - Python trộn alpha

Hướng dẫn alpha blending python - Python trộn alpha
Trên cùng bên trái: Hình ảnh tiền cảnh. Trên cùng bên phải: Mặt nạ Alpha. Dưới cùng bên trái: Hình nền. Dưới cùng bên phải: Hình ảnh tổng hợp cuối cùng.

Trong hướng dẫn này, chúng tôi sẽ học cách pha trộn Alpha hai hình ảnh. Bạn muốn phủ lên một hình ảnh PNG trong suốt trên một hình ảnh khác? Vâng, hướng dẫn này sẽ giúp bạn làm điều đó trong OpenCV. Chúng tôi đang chia sẻ mã trong cả C ++ và Python.

Alpha pha trộn là gì?

Alpha pha trộn là quá trình phủ lên một hình ảnh nền tảng với độ trong suốt trên một hình ảnh nền. Độ trong suốt thường là kênh thứ tư của hình ảnh (ví dụ: trong PNG trong suốt), nhưng nó cũng có thể là một hình ảnh riêng biệt. Mặt nạ trong suốt này thường được gọi là mặt nạ alpha hoặc alpha mờ.foreground image with transparency over a background image. The transparency is often the fourth channel of an image ( e.g. in a transparent PNG), but it can also be a separate image. This transparency mask is often called the alpha mask or the alpha matte.

Trong hình ảnh tính năng trên đỉnh của bài viết này, hình ảnh nền trước được hiển thị ở phía trên bên trái, mặt nạ alpha tỷ lệ màu xám được hiển thị ở phía trên bên phải, hình ảnh nền được hiển thị ở phía dưới bên trái và hình ảnh tổng hợp thu được bằng cách pha trộn Hình ảnh nền trước và hình ảnh nền sử dụng mặt nạ alpha được hiển thị ở phía dưới bên phải.

Toán học đằng sau pha trộn alpha là thẳng về phía trước. Ở mỗi pixel của hình ảnh, chúng ta cần kết hợp màu hình ảnh nền tảng (F) và màu hình nền (b) bằng mặt nạ alpha ().every pixel of the image, we need to combine the foreground image color (F) and the background image color (B) using the alpha mask (

Hướng dẫn alpha blending python - Python trộn alpha
).

Lưu ý: Giá trị của được sử dụng trong phương trình thực sự là giá trị pixel trong mặt nạ alpha chia cho 255. Vì vậy, trong phương trình bên dưới,: The value of

Hướng dẫn alpha blending python - Python trộn alpha
used in the equation is actually the pixel value in the alpha mask divided by 255. So, in the equation below,
Hướng dẫn alpha blending python - Python trộn alpha

Hướng dẫn alpha blending python - Python trộn alpha

Từ phương trình trên, bạn có thể thực hiện các quan sát sau.

  1. Khi, màu pixel đầu ra là nền.
    Hướng dẫn alpha blending python - Python trộn alpha
    , the output pixel color is the background.
  2. Khi, màu pixel đầu ra chỉ đơn giản là tiền cảnh.
    Hướng dẫn alpha blending python - Python trộn alpha
    , the output pixel color is simply the foreground.
  3. Khi màu pixel đầu ra là sự pha trộn của nền và tiền cảnh. Đối với sự pha trộn thực tế, ranh giới của mặt nạ alpha thường có các pixel nằm trong khoảng từ 0 đến 1.
    Hướng dẫn alpha blending python - Python trộn alpha
    the output pixel color is a mix of the background and the foreground. For realistic blending, the boundary of the alpha mask usually has pixels that are between 0 and 1.

Làm thế nào để thực hiện pha trộn alpha trong openCV (C ++ /python)?

Chúng ta hãy xem qua một ví dụ trong C ++ và Python để xem cách thực hiện pha trộn alpha trong openCV. Trong phần sau, chúng tôi cũng hiển thị việc triển khai hiệu quả mã C ++.

Alpha pha trộn: C ++

#include opencv2/opencv.hpp

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{

    // Read the images
    Mat foreground = imread("puppets.png");
    Mat background = imread("ocean.png");
    Mat alpha = imread("puppets_alpha.png");

    // Convert Mat to float data type
    foreground.convertTo(foreground, CV_32FC3);
    background.convertTo(background, CV_32FC3);

    // Normalize the alpha mask to keep intensity between 0 and 1
    alpha.convertTo(alpha, CV_32FC3, 1.0/255); // 

    // Storage for output image
    Mat ouImage = Mat::zeros(foreground.size(), foreground.type());

    // Multiply the foreground with the alpha matte
    multiply(alpha, foreground, foreground); 

    // Multiply the background with ( 1 - alpha )
    multiply(Scalar::all(1.0)-alpha, background, background); 

    // Add the masked foreground and background.
    add(foreground, background, ouImage); 

    // Display image
    imshow("alpha blended image", ouImage/255);
    waitKey(0);

    return 0;
}

Tải xuống mã để dễ dàng làm theo hướng dẫn này, vui lòng tải về mã bằng cách nhấp vào nút bên dưới. Nó miễn phí! To easily follow along this tutorial, please download code by clicking on the button below. It's FREE!

Alpha pha trộn: Python

import cv2

# Read the images
foreground = cv2.imread("puppets.png")
background = cv2.imread("ocean.png")
alpha = cv2.imread("puppets_alpha.png")

# Convert uint8 to float
foreground = foreground.astype(float)
background = background.astype(float)

# Normalize the alpha mask to keep intensity between 0 and 1
alpha = alpha.astype(float)/255

# Multiply the foreground with the alpha matte
foreground = cv2.multiply(alpha, foreground)

# Multiply the background with ( 1 - alpha )
background = cv2.multiply(1.0 - alpha, background)

# Add the masked foreground and background.
outImage = cv2.add(foreground, background)

# Display image
cv2.imshow("outImg", outImage/255)
cv2.waitKey(0)

Mã trên rất sạch sẽ, nhưng không hiệu quả như nó có thể. Lưu ý rằng chúng tôi đang thực hiện hai đường chuyền qua hình ảnh nền trước - một lần trong khi nhân với alpha và một lần nữa trong khi thêm vào nền đeo mặt nạ. Tương tự, chúng tôi đang thực hiện nhiều lần vượt qua hình ảnh nền.

Đối với các hình ảnh có kích thước nhỏ (ví dụ 250 × 250) và trung bình (ví dụ: 800 × 800), các phương pháp trên là tốt, nhưng nếu chúng ta thực sự quan tâm đến hiệu quả, đặc biệt là đối với hình ảnh lớn (ví dụ: 2000 × 2000), chúng ta có thể điều khiển dữ liệu trực tiếp Để có được hiệu suất tốt hơn nhiều. Dưới đây là mã CPP cho cùng.

void alphaBlend(Mat& foreground, Mat& background, Mat& alpha, Mat& outImage)
{
     // Find number of pixels.
     int numberOfPixels = foreground.rows * foreground.cols * foreground.channels();

     // Get floating point pointers to the data matrices
     float* fptr = reinterpret_cast(foreground.data);
     float* bptr = reinterpret_cast(background.data);
     float* aptr = reinterpret_cast(alpha.data);
     float* outImagePtr = reinterpret_cast(outImage.data);

     // Loop over all pixesl ONCE
     for(
       int i = 0;
       i < numberOfPixels;
       i++, outImagePtr++, fptr++, aptr++, bptr++
     )
     {
         *outImagePtr = (*fptr)*(*aptr) + (*bptr)*(1 - *aptr);
     }
}

So sánh thời gian chạy

Trong bảng dưới đây, chúng tôi hiển thị so sánh thời gian chạy của hai phương pháp trên hình ảnh có kích thước khác nhau. Các con số là thời gian trung bình được thực hiện trên 3000 lần chạy. Như bạn có thể thấy đối với hình ảnh lớn hơn, phương pháp hiệu quả tạo ra một lần vượt qua hình ảnh mất ít hơn một nửa thời gian! Không rõ tại sao phương thức vượt qua đơn lẻ tồi tệ hơn một chút đối với hình ảnh nhỏ.

Kích cỡ hìnhSử dụng các chức năng - Nhân, thêm (tính bằng mili giây)
multiply, add
(in milliseconds)
Sử dụng quyền truy cập trực tiếp (tính bằng mili giây)
(in milliseconds)
230 x 1620.156 0.364
1000 x 7047.856 7.102
2296 x 161754.014 39.985
4592 x 3234355.502 161.34

Đăng ký và tải xuống mã

Nếu bạn thích bài viết này và muốn tải xuống mã (C ++ và Python) và hình ảnh ví dụ được sử dụng trong bài đăng này, vui lòng bấm vào đây. Thay phiên, đăng ký để nhận hướng dẫn tài nguyên tầm nhìn máy tính miễn phí. Trong bản tin của chúng tôi, chúng tôi chia sẻ các hướng dẫn và ví dụ OpenCV được viết bằng C ++/Python, và các thuật toán và tin tức về tầm nhìn máy tính và máy học.



Tín dụng hình ảnh

1. Hình ảnh tiền cảnh và Alpha Matte của nó được lấy từ trang web đánh giá matting alpha2. Hình ảnh nền nằm trong phạm vi công cộng. Đây là liên kết.
2. The background image is in the public domain. Here is the link.