合成半透明圖片
這篇教學會如何使用 OpenCV 將一張半透明的圖片,與另外一張圖片進行合成,同樣的做法也可將透明背景的圖片貼到另外一張圖片上。
因為程式中的 OpenCV 會需要使用鏡頭或 GPU,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda ) ,並安裝 OpenCV 函式庫 ( 參考:OpenCV 函式庫 )。
兩張圖片進行半透明漸層合成
準備兩張長寬尺寸相同的圖片 ( 如果不同可用 resize 或裁切方式轉換成相同尺寸 ),使用 for 迴圈,讀取水平方向從左而右的像素,根據位置的比例,混合該像素的顏色,就能做到半透明漸層合成的效果。
import cv2
img1 = cv2.imread('mona.jpg')
img2 = cv2.imread('girl.jpg')
w = img1.shape[1] # 讀取圖片寬度
h = img1.shape[0] # 讀取圖片高度
for i in range(w):
img1[:,i,0] = img1[:,i,0]*((300-i)/300) + img2[:,i,0]*(i/300) # 藍色按照比例混合
img1[:,i,1] = img1[:,i,1]*((300-i)/300) + img2[:,i,1]*(i/300) # 紅色按照比例混合
img1[:,i,2] = img1[:,i,2]*((300-i)/300) + img2[:,i,2]*(i/300) # 綠色按照比例混合
cv2.imwrite('oxxostudio.png', save)
show = img1.astype('float32')/255 # 如果要使用 imshow 必須要轉換類型
cv2.imshow('oxxostudio.png', show)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
貼上透明背景圖片
如果要在某張圖片裡,貼上帶有透明背景的圖片 ( 例如 png ),可以透過透明背景圖片的 alpha 值,計算該像素是否要換成透明背景圖片的不透明部分,下方的程式碼會在蒙娜麗莎的圖片中間,貼上透明背景的 OpenCV logo。
import cv2
mona = cv2.imread('mona.jpg')
logo = cv2.imread('logo.png', cv2.IMREAD_UNCHANGED) # 使用 cv2.IMREAD_UNCHANGED 讀取 png,保留 alpha 色版
mona_w = mona.shape[1] # 蒙娜麗莎寬度
mona_h = mona.shape[0] # 蒙娜麗莎高度
logo_w = logo.shape[1] # logo 寬度
logo_h = logo.shape[0] # logo 高度
dh = int((mona_h - logo_h) / 2) # 如果 logo 要垂直置中,和上方的距離
h = dh + logo_h # 計算蒙娜麗莎裡,logo 所在的高度位置
# 透過迴圈,根據背景透明度,計算出該像素的顏色
for i in range(logo_w):
mona[dh:h,i,0] = mona[dh:h,i,0]*(1-logo[:,i,3]/255) + logo[:,i,0]*(logo[:,i,3]/255)
mona[dh:h,i,1] = mona[dh:h,i,1]*(1-logo[:,i,3]/255) + logo[:,i,1]*(logo[:,i,3]/255)
mona[dh:h,i,2] = mona[dh:h,i,2]*(1-logo[:,i,3]/255) + logo[:,i,2]*(logo[:,i,3]/255)
cv2.imwrite('oxxostudio.png', mona)
mona = mona.astype('float32')/255 # 如果要使用 imshow 必須要轉換類型
cv2.imshow('oxxostudio', mona)
cv2.waitKey(0)
cv2.destroyAllWindows()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~