图像的叠加与相减
这篇教学会介绍使用 OpenCV 的 add()、addWeighted() 和 subtract() 方法,将不同的图像叠加或相减后,变成新的图像。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
add() 图像叠加
使用 OpenCV 的 add() 方法,可以将不同的图像中,同样位置像素的颜色数值相加,例如图片 A 某个像素为 (255,0,0) 蓝色,图片 B 为 (0,255,255) 黄色,叠加在一起后就会变成白色 (255,255,255),叠加后最大的数值为 255,下方的例子,会将三张图片叠加成一张图片。
import cv2
img_red = cv2.imread('test-red.png')
img_green = cv2.imread('test-green.png')
img_blue = cv2.imread('test-blue.png')
output = cv2.add(img_red, img_green) # 疊加紅色和綠色
output = cv2.add(output, img_blue) # 疊加藍色
cv2.imshow('oxxostudio', output)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
addWeighted() 图像权重叠加
使用 OpenCV 的 addWeighted() 方法,可以将不同的图像中,同样位置像素的颜色数值,以“指定的权重”( 0~1 ) 进行相加,相加后,就会产生类似半透明的效果,使用方法如下:
cv2.addWeighted(img1, alpha, img2, beta, gamma)
# img1 第一張圖
# img2 第二張圖
# 計算公式:img1*alpha + img2*beta + gamma
下方的例子,会将两张图片以权重叠加的方式,组合成一张新的图片。
import cv2
img = cv2.imread('meme.jpg')
logo = cv2.imread('opencv-logo.jpg')
output = cv2.addWeighted(img, 0.5, logo, 0.3, 50)
cv2.imshow('oxxostudio', output)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
subtract() 图像相减
使用 OpenCV 的 subtract() 方法,可以将不同的图像中,同样位置像素的颜色数值相减,例如图片 A 某个像素的颜色为 (255,255,255) 白色,图片 B 为 (0,255,255) 黄色,相减后就会变成蓝色 (255,0,0),叠加后最大的数值为 255,下方的例子,会将两张图片相减成一张图片,相减后,白色因为减去了黄色 ( 255,255,255 - 0,255,255 ),就只剩下了蓝色,而绿色因为减去黄色 ( 0,255,0 - 0,255,255 ),就变成黑色。
import cv2
img = cv2.imread('test.png')
img2 = cv2.imread('test2.png')
output = cv2.subtract(img, img2) # 相減
cv2.imwrite('output.png', output)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
影片的图像叠加
延伸“读取并播放影片”和“翻转影片、改变影片尺寸”文章的范例,在程序码中使用 addWeighted() 方法,就能将电脑镜头拍摄的画面,即时和其他图片叠加。
import cv2
cap = cv2.VideoCapture(0)
logo = cv2.imread('opencv-logo.jpg')
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
img_1 = cv2.resize(frame,(480, 360)) # 改變影像尺寸,符合疊加的圖片
output = cv2.addWeighted(img_1, 0.5, logo, 0.3, 50) # 疊加圖片
cv2.imshow('oxxostudio', output)
if cv2.waitKey(1) == ord('q'):
break # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注