合成半透明图片
这篇教学会如何使用 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()
微信扫码关注
抖音扫码关注