(四)图像的算术运算

目录

1、图像加法

2、图像混合

3.按位运算


图像的算术运算包括:加法减法位运算

函数:cv2.add() cv2.addWeighted()等

1、图像加法

使用cv2.add()将两幅图像进行加法运算,也可以使用numpy,res=img1+img

注意:

  1. 两幅图像的大小必须一致
  2. 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()

结果图:

    

猜你喜欢

转载自blog.csdn.net/weixin_38664232/article/details/86539861