二:图像融合
将2张或2张以上的图像信息的融合到1张图像上
融合的图像含有更多的信息、能够更方便人来观察或者计算机处理


图像加法: 结果图像=图像1+图像2
img=img1+img2
图像融合: 结果图像=图像1*系数1+图像2*系数2+亮度调节量
img=img1*0.3+img2*0.7+18
函数addWeighted
dst=cv.addWeighted(src1, alpha, src2, beta,gamma)
dst = src1*alpha + src2*beta + gamma;
参数gamma不能省略

图像加权和:
就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可利用函数
Dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
可理解为:
结果图像=图像1*系数1+图像2*系数2+亮度调节量
3.3按位逻辑运算
常见的位运算函数
| 函数名 | 基本含义 |
| Cv2.bitwise_and() | 按位与 |
| Cv2.bitwise_or() | 按位或 |
| Cv2.bitwise_xor() | 按位异或 |
| Cv2.bitwise_not() | 按位取反 |
函数:
Dst=Cv2.bitwise_and(src1,src2[,mask]])
Dst=Cv2.bitwise_or(src1,src2[,mask]])
Dst=Cv2.bitwise_not(src[,mask]])
Dst=Cv2.bitwise_xor(src1,src2[,mask]])
源代码
import cv2
a=cv2.imread("image\add\boat.bmp")
b=cv2.imread("image\add\lena.bmp")
result=cv2.addWeighted(a,1,b,1,0)
cv2.imshow("boat",a)
cv2.imshow("lena",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()
视频代码:
#视频:图像加法
import cv2
a=cv2.imread("lena256.bmp")
b=a
result1=a+b
result2=cv2.add(a,b)
cv2.imshow("yuanshi",a)
cv2.imshow("result1",result1)
cv2.imshow("result2",result2)
cv2.waitKey()
cv2.destroyAllWindows()

#例3.1使用随机数数组模拟灰度图像,观察使用“+”对像素值求和的结果
import numpy as np
img1=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
img2=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print("img1=\n",img1)
print("img2=\n",img2)
print("img1+img2=\n",img1+img2)
运行结果:
img1=
[[ 12 42 65]
[ 87 58 177]
[124 87 122]]
img2=
[[174 235 192]
[230 181 225]
[212 205 129]]
img1+img2=
[[186 21 1]
[ 61 239 146]
[ 80 36 251]]
#例3.2使用随机数组模拟灰度图像,观察函数cv2.add()对像素值求和的结果。
import numpy as np
import cv2
img1=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
img2=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print("img1=\n",img1)
print("img2=\n",img2)
img3=cv2.add(img1,img2)
print("cv2.add(img1,img2)=\n",img3)
运行结果:
img1=
[[108 204 155]
[ 25 47 235]
[140 135 195]]
img2=
[[249 144 83]
[249 80 193]
[227 47 131]]
cv2.add(img1,img2)=
[[255 255 238]
[255 127 255]
[255 182 255]]
#3.3分别使用加号运算符和函数cv2.add()计算两幅灰度图像的像素值之和,观察处理结果
import cv2
a=cv2.imread("lena.bmp",0)
b=a
result1=a+b
result2=cv2.add(a,b)
cv2.imshow("original",a)
cv2.imshow("result1",result1)
cv2.imshow("result2",result2)
cv2.waitKey()
cv2.destroyAllWindows()

视频:图像融合讲解
#视频:图像融合图像加权运算
import cv2
a=cv2.imread("boat.bmp",-1)
b=cv2.imread("lena.bmp",-1)
# result=cv2.addWeighted(a,1,b,1,0)
# result=cv2.addWeighted(a,0.3,b,0.6,0)
result=cv2.addWeighted(a,0.6,b,0.3,0)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("result",result)
cv2.waitKey(0)
cv2.destroyAllWindows()
#3.4使用数组演示函数cv2.addWeighted()的使用
import cv2
import numpy as np
img1=np.ones((3,4),dtype=np.uint8)*100#生产3*4的100数组;生产3*4的10数组
img2=np.ones((3,4),dtype=np.uint8)*10
gamma=3
img3=cv2.addWeighted(img1,0.6,img2,5,gamma)#img1*0.6+img2*5+gamma
print(img1)
print(img2)
print(img3)
运行结果:
[[100 100 100 100]
[100 100 100 100]
[100 100 100 100]]
[[10 10 10 10]
[10 10 10 10]
[10 10 10 10]]
[[113 113 113 113]
[113 113 113 113]
[113 113 113 113]]
#3.5使用函数cv2.Weighted()对两幅图像进行加权混合,观察处理结果。
import cv2
a=cv2.imread("boat.bmp")
b=cv2.imread("lena.bmp")
result=cv2.addWeighted(a,0.6,b,0.4,0)
cv2.imshow("boat",a)
cv2.imshow("lena",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()


#3.6使用函数cv2.addWeighted()将一副图像的ROI混合在另外一副图像内
import cv2
lena=cv2.imread("lena512.bmp",cv2.IMREAD_UNCHANGED)
dollar=cv2.imread("dollar.bmp",cv2.IMREAD_UNCHANGED)
cv2.imshow("lena",lena)
cv2.imshow("dollar",dollar)
face1=lena[220:400,250:350]
face2=dollar[160:340,200:300]
add=cv2.addWeighted(face1,0.6,face2,0.4,0)
dollar[160:340,200:300]=add
cv2.imshow("result",dollar)
cv2.waitKey()
cv2.destroyAllWindows()


表-常见的位运算函数
函数名 | 基本含义 |
Cv2.bitwise_and() | 按位与 |
Cv2.bitwise_or() | 按位或 |
Cv2.bitwise_xor() | 按位异或 |
Cv2.bitwise_not() | 按位取反 |
OpenCV中运算函数格式如下:
Dst=Cv2.bitwise_and(src1,src2[,mask]])#按位与
Dst=Cv2.bitwise_or(src1,src2[,mask]])#按位或
Dst=Cv2.bitwise_xor(src1,src2[,mask]])#按位异或
Dst=Cv2.bitwise_not(src[,mask])#按位非
#3.7使用数组演示与掩模图像的按位与运算。
import cv2
import numpy as np
a=np.random.randint(0,255,(5,5),dtype=np.uint8)
b=np.zeros((5,5),dtype=np.uint8)
b[0:3,0:3]=255
b[4,4]=255
c=cv2.bitwise_and(a,b)
print("a=\n",a)
print("b=\n",b)
print("c=\n",c)
运行结果:
a=
[[ 13 13 125 16 146]
[210 2 132 185 144]
[ 35 75 170 85 93]
[ 7 20 44 77 174]
[115 42 2 138 10]]
b=
[[255 255 255 0 0]
[255 255 255 0 0]
[255 255 255 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 255]]
c=
[[ 13 13 125 0 0]
[210 2 132 0 0]
[ 35 75 170 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 10]]
#3.8构造一个掩模图像,使用按位与运算保留图像中被掩模指定的部分
import cv2
import numpy as np
a=cv2.imread("lena.bmp",0)
b=np.zeros(a.shape,dtype=np.uint8)
b[100:400,200:400]=255
b[100:500,100:200]=255
c=cv2.bitwise_and(a,b)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()


#3.9构造一个掩模图像,使用按位与操作保留图像内被掩模所指定的部分。
import cv2
import numpy as np
a=cv2.imread("lena.bmp",1)
b=np.zeros(a.shape,dtype=np.uint8)
b[100:400,200:400]=255
b[100:500,100:200]=255
c=cv2.bitwise_and(a,b)
print("a.shape=",a.shape)
print("b.shape=",b.shape)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
a.shape= (512, 512, 3)
b.shape= (512, 512, 3)


3.4掩模
在OPENCV中的很多函数都会指定一个掩模,也被称为掩码,例如:
计算结果=cv2.add(参数1,参数2,掩模)
当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的值置为0
例如:
Img1、img2、img3的原始值分别为:
Img1=
| 3 | 3 | 3 | 3 |
| 3 | 3 | 3 | 3 |
| 3 | 3 | 3 | 3 |
| 3 | 3 | 3 | 3 |
Img2=
| 5 | 5 | 5 | 5 |
| 5 | 5 | 5 | 5 |
| 5 | 5 | 5 | 5 |
| 5 | 5 | 5 | 5 |
Mask=
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 |
| 0 | 0 | 1 | 1 |
Img3=
| 66 | 66 | 66 | 66 |
| 66 | 66 | 66 | 66 |
| 66 | 66 | 66 | 66 |
| 66 | 66 | 66 | 66 |
经过img3=cv2.add(img1,img2,mask=mask)运算后,得到img3为:
Img3=
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 8 | 8 |
| 0 | 0 | 8 | 8 |
#3.10演示掩码的使用过程
import cv2
import numpy as np
img1=np.ones((4,4),dtype=np.uint8)*3
img2=np.ones((4,4),dtype=np.uint8)*5
mask=np.zeros((4,4),dtype=np.uint8)
mask[2:4,2:4]=1
img3=np.ones((4,4),dtype=np.uint8)*66
print("img1=\n",img1)
print("img2=\n",img2)
print("mask=\n",mask)
print("初始值img3=\n",img3)
img3=cv2.add(img1,img2,mask=mask)
print("求和后img3=\n",img3)
#3.11构造一个掩模图像,将该掩模图像作为按位与函数的掩模参数,实现保留图像的指定部分
import cv2
import numpy as np
a=cv2.imread("lena.bmp",1)
w,h,c=a.shape
mask=np.zeros((w,h),dtype=np.uint8)
mask[100:400,200:400]=255
mask[100:500,100:200]=255
c=cv2.bitwise_and(a,a,mask)
print("a.shape=",a.shape)
print("mask.shape=",mask.shape)
cv2.imshow("a",a)
cv2.imshow("mask",mask)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
a.shape= (512, 512, 3)
mask.shape= (512, 512)


3.5图像与数值的运算
参与运算的两个参数,既可以是两幅图像也可以是一副图像一副数值,如果想增加图像的整体亮度,可以将每一个像素值都加上特定的值。
#3.12演示图像与数值的运算结果
import cv2
import numpy as np
img1=np.ones((4,4),dtype=np.uint8)*3
img2=np.ones((4,4),dtype=np.uint8)*5
print("img1=\n",img1)
print("img2=\n",img2)
img3=cv2.add(img1,img2)
print("cv2.add(img1,img2)=\n",img3)
img4=cv2.add(img1,6)
print("cv2.add(img1,6)\n",img4)
img5=cv2.add(6,img2)
print("cv2.add(6,img2)=\n",img5)运行结果:
img1=
[[33 3 3]
[3 33 3]
[3 33 3]
[3 33 3]]
img2=
[[55 5 5]
[5 55 5]
[5 55 5]
[5 55 5]]
cv2.add(img1,img2)=
[[88 8 8]
[8 88 8]
[8 88 8]
[8 88 8]]
cv2.add(img1,6)
[[99 9 9]
[9 99 9]
[9 99 9]
[9 99 9]]
cv2.add(6,img2)=
[[1111 11 11]
[1111 11 11]
[1111 11 11]
[1111 11 11]]

