1. 程式人生 > >在影象中貼上具有透明度的素材(Python語言)

在影象中貼上具有透明度的素材(Python語言)

     我先放程式碼和結果,再分析過程。

1.實現程式碼

# coding=utf-8
import numpy as np
import cv2 as cv 

def paste_ROI_to_image(image, ROI, paste_area):

    y1, x1, y2, x2 = paste_area

    ROI = cv.resize(ROI, (x2 - x1 + 1, y2 - y1 +1))   #cv.resize(src, dsize=(width, height))

    image.astype(np.float)  #下一步有小數的計算

    for i in range(3):

        image[y1:y2+1,x1:x2+1,i] = ROI[:,:,3]/255.0 * ROI[:,:,i] + (1 - ROI[:,:,3]/255.0) * image[y1:y2+1,x1:x2+1,i]

    image.astype(np.uint8)  #z轉換為uint8型別

    return image


image = cv.imread('image.jpg', cv.IMREAD_UNCHANGED)  #

ROI = cv.imread('ROI.png', cv.IMREAD_UNCHANGED)

image_R = paste_ROI_to_image(image, ROI, [50, 0, 206, 117])

cv.imwrite('image_R.png', image_R)

   結果:

          

          image                                      ROI                    image_R

   程式碼分析:

   (1)先匯入使用到的兩個模組:numpy和Python-OpenCV(cv2)

   (2)定義了一個函式paste_ROI_to_image來完成透明素材的貼上。函式中,先使用cv.resize函式來調整素材ROI的尺寸,使其和貼上區域的尺寸是匹配的。x表示影象的列數,y表示影象中的行數。

   (3)貼上透明素材。(原理在後面解釋)

   (4)顯示貼上結果。

2.貼上透明素材的原理

首先,透明素材ROI具有透明度是因為它除了有RGB三個顏色通道以外,還有一個alpha通道。包含alpha通道的影象一般儲存為png格式。(jpg格式影象是沒有alpha通道的,比如程式中的image.jpg圖就只有RGB三個顏色通道)我們貼上透明影象時就利用到了這個透明通道。

使貼上的效果能夠保持透明的效果,其實就是讓image和ROI的RGB三個通道進行混合

那麼,怎麼混合呢?混合的比例如何知道呢?

alpha通道的值不就給我們一個值嗎?alpha通道的值取值範圍是0-255。我們可以通過如下的公式來實現RGB通道畫素值的混合:

image(R,G,B) = alpha/255.0 * ROI(R,G,B) + (1 – alpha/255.0) * image(R,G,B)

3.可能涉及到的資料