官方文档 – https://docs.opencv.org/3.4.0/d0/d86/tutorial_py_image_arithmetics.html
图片加法可以用OpenCV的方法cv.add()
,也可以用numpy的操作res=img1+img2
。两个图像都应该具有相同的深度和类型,或者第二个图像可以是一个标量值。
OpenCV添加和Numpy添加有区别。OpenCV添加是一个饱和操作,而Numpy加法是一个模块化操作。
x = np.uint8([250])
y = np.uint8([10])
# OpenCV的方法
cv.add(x, y) # 250+10=260 => 255
# [[255]]
# numpy的方法
x + y # 250+10=260 % 256 = 4
# [4]
推荐使用OpenCV的方法
使用cv.addWeighted()
方法,设置两张图片权重,融合两张图片。两张图片必须尺寸大小一致
img1 = cv.imread('test1.jpg')
img2 = cv.imread('test2.jpg')
dst = cv.addWeighted(img1, 0.7, img2, 0.3, 0)
cv.imshow('dst', dst)
cv.waitKey(0)
cv.destroyAllWindows()
cv.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
公式方程可以等价于dst = src1*alpha + src2*beta + gamma
包括 和、或、非、异或运算。在提取图像的任何部分时,定义和处理非矩形的ROI等,都将非常有用。
添加一个不规则图片到另一张图片上,只添加所需部分,其余部分透明。
import numpy as np
import cv2 as cv
# 加载图片
img1 = cv.imread('test1.jpg')
img2 = cv.imread('test2.jpg')
# 想把图片放到左上角,所以创建一个ROI
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
# 创建一个logo遮罩,和其反转遮罩
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# 标记处标识区域
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
# 只从标志图像中选择区域标识。
img2_fg = cv.bitwise_and(img2, img2, mask=mask)
# 把标识放在ROI中,并修改主图片
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv.imshow('res', img1)
cv.waitKey(0)
cv.destroyAllWindows()
cv.threshold(src, thresh, maxval, type[, dst])
thresh:阈值
maxval:对高于或者低于阈值的像素值做处理后重新赋予的像素值(取决于type类型)
type:处理像素值的方法,有以下类型:
dst(x,y)=maxval if src(x,y)>thresh else 0
dst(x,y)=0 if src(x,y)>thresh else maxval
dst(x,y)=thresh if src(x,y)>thresh else src(x,y)
dst(x,y)=src(x,y) if src(x,y)>thresh else 0
dst(x,y)=0 if src(x,y)>thresh else src(x,y)
扩展:: python OpenCV学习笔记(十):图片阈值
图像按位操作方法
cv.bitwise_and
cv.bitwise_or
cv.bitwise_not
cv.bitwise_xor