目录
图像的算术运算包括:加法、减法、位运算等
函数:cv2.add() cv2.addWeighted()等
1、图像加法
使用cv2.add()将两幅图像进行加法运算,也可以使用numpy,res=img1+img
注意:
- 两幅图像的大小必须一致
- OpenCV中的加法与Numpy的加法有所不同。OpenCV的加法是一种饱和操作,Numpy的加法是一种模操作。
例如:
x=np.unit8([250])
y=np.unit8([10])
print(cv2.add(x,y)) #250+10 = 260 => 255
[[255]]
print(x+y) #250+10 = 260 % 256 =>4
[4]
这种差别在对两幅图像进行加法时会更加明显。OpenCV的结果会更好一点。所以尽量使用OpenCV中的函数。
2、图像混合
这其实也是加法,但是不同的是两幅图像的权重不同,这就给人一种混合或者透明的感觉。计算公式如下:
g(x)=(1-α)f0(x)+αf1(x)
通过修改α的值(0-->1),可以实现非常酷的混合。
混合函数:cv2.addWeighted()
dst=α·img1 +β·img2 +γ
这里γ的值为0
代码:
import numpy as np
import cv2 as cv
path="D:\\openCV\\opencv\\sources\\samples\\data\\apple.jpg"
apple=cv.imread(path)
logoPath="D:\\openCV\\opencv\\sources\\samples\\data\\baboon.jpg"
baboon=cv.imread(logoPath)
dst=cv.addWeighted(apple,0.7,baboon,0.3,0)
cv.imshow("apple",apple)
cv.imshow("baboon",baboon)
cv.imshow("dst",dst)
cv.waitKey()
原始图像:
运行结果:
3.按位运算
位运算有:AND OR NOT XOR等。当我们提取图像的一部分,选择非矩形ROI时这些操作会很有用。
代码:
import numpy as np
import cv2 as cv
path="D:\\openCV\\opencv\\sources\\samples\\data\\lena.jpg"
img1=cv.imread(path)
logoPath="C:\\Users\\Administrator\\Desktop\\picture\\logo.jpg"
img2=cv.imread(logoPath)
rows,cols,channels=img2.shape
#create a roi
roi=img1[0:rows,0:cols]
#create a mask of logo and create its inverse mask
img2gray=cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret,mask=cv.threshold(img2gray,175,255,cv.THRESH_BINARY)
#非运算
mask_inv=cv.bitwise_not(mask)
#取roi中与mask中不为零的值对应的像素的值,其他值为0
img1_bg=cv.bitwise_and(roi,roi,mask=mask)
img2_bg=cv.bitwise_and(img2,img2,mask=mask_inv)
#put logo in ROI and modify the main image
dst=cv.add(img1_bg,img2_bg)
img1[0:rows,0:cols]=dst
cv.imshow('res',img1)
cv.imshow("gray_logo",mask_inv)
cv.waitKey()
cv.destroyAllWindows()
结果图: