在影象中貼上具有透明度的素材(Python語言)
阿新 • • 發佈:2018-12-09
我先放程式碼和結果,再分析過程。
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)