基础函数
cv2.add()
#cv2.add(img1, img2) # 进行图片的加和
#在opencv中加法是饱和操作,也就是有上限值,大于255的使用255计数
###***需要合成的两个图片 大小必须一致***
cv2.addWeighted()
#cv2.addWeighted(img1, 0.6, img2, 0.4, 0) 表示将两个图片进行重叠操作,可以自行设置两张图片的权重
cv2.threshold()
#ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)
#cv2.THRESH_BINARY 表示阈值的二值化操作,大于阈值(175)使用maxval(255)代替,小于阈值(175)使用0代替 变成黑白图
#cv2.threshold (src, thresh, maxval, type)
#src:源图片,必须是单通道
#thresh:阈值,取值范围0~255
#maxval:填充色,取值范围0~255
#type:阈值类型
# type的类型
#1.cv2.THRESH_BINARY 表示阈值的二值化操作,大于阈值使用maxval表示,小于阈值使用0表示
#2. cv2.THRESH_BINARY_INV 表示阈值的二值化翻转操作,大于阈值的使用0表示,小于阈值的使用最大值表示
#3. cv2.THRESH_TRUNC 表示进行截断操作,大于阈值的使用阈值表示,小于阈值的不变
#4. cv2.THRESH_TOZERO 表示进行化零操作,大于阈值的不变,小于阈值的使用0表示
#5. cv2.THRESH_TOZERO_INV 表示进行化零操作的翻转,大于阈值的使用0表示,小于阈值的不变
cv2.bitwise_not()
#mask_inv = cv2.bitwise_not(mask)
#将图片里像素值按位反向
##取反 原来黑白图变成白黑图(黑白互换)
cv2.bitwise_and()
#img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
#背景变成mask的背景,logo部分变黑,为0。
#将图片里的像素值按位与
#打印结果,当使用bitwise_and时,取较小的值
cv2.bitwise_or()
##将图片里的像素值按位或
#打印结果,当使用bitwise_or时,取较大的值
cv2.bitwise_xor()
#将图片里的像素值按位异或
cv2.seamlessClone()
#cv2.seamlessClone(src, dst, mask, center, flags)
#src 目标影像 dst 背景图像
#mask 目标影像上的mask,表示目标影像上那些区域是感兴趣区域
#center 目标影像的中心在背景图像上的坐标!注意是目标影像的中心!
#flags 选择融合的方式,目前有NORMAL_CLONE、MIXED_CLONE和MONOCHROME_TRANSFER三种方法
图像加法
x = np.uint8([250])
y = np.uint8([10])
print cv2.add(x,y) # 250+10 = 260 => 255
[[255]] #饱和操作
print x+y # 250+10 = 260 % 256 = 4
[4] #模操作
图像混合
import cv2
import numpy as np
img1=cv2.imread('ml.png')
img2=cv2.imread('logo.jpg')
#cv2.resize() #改变图像大小,使其大小一样
img1 = cv2.resize(img1, (400, 400), interpolation=cv2.INTER_CUBIC)
img2 = cv2.resize(img2, (400, 400), interpolation=cv2.INTER_CUBIC)
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindow()
按位运算
import cv2
import numpy as np
img1 = cv2.imread('roi.jpg')
img2 = cv2.imread('logo.png')
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
#灰色图片 #1111
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)
#cv2.THRESH_BINARY 表示阈值的二值化操作,大于阈值使用maxval表示,小于阈值使用0表示 变成黑白图
#2222
mask_inv = cv2.bitwise_not(mask)
#取反 原来黑白图变成白黑图(黑白互换)
#3333
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
#img1_bg = cv2.bitwise_and(roi,roi,mask = mask) #背景变成mask的背景,logo部分变黑,为0。
#4444
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
#按位与操作,背景变成mask_inv的背景,为0(黑色),logo部分变成roi部分(彩色)。
#5555
dst = cv2.add(img1_bg,img2_fg) mask
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
#6666
cv2.waitKey(0)
cv2.destroyAllWindows()
###分析:首先将opencv的logo转成灰度图像,然后使用threshold函数将灰阶像素与纯白像素分开得到一个2值图像并用其作为掩码图像。使用带掩码的位操作扣出logo形状,反向掩码的位操作得到logo图像,两者相加得到带logo的背景图。
#注:如果直接使用权重加,必然会有透明度,或者就是logo对背景进行全遮挡。
上述为1111-6666的结果图
cv2.resize() #改变图像大小
pic = cv2.resize(pic, (400, 400), interpolation=cv2.INTER_CUBIC)
#cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
scr:原始图像
dsize:输出图像的尺寸(元组方式)
dst:输出图像
fx:沿水平轴缩放的比例因子
fy:沿垂直轴缩放的比例因子
interpolation:插值方法