目标
学习几个图像的算数运算,例如:加、减、位运算。
学习的函数,包括:cv2.add(),cv2.addWeighted()等。
加运算
可以用函数cv2.add()或着numpy的加号运算, res = img1 + img2使两个图片相加。两个图片必须有相同的深度(depth)和类型(type),或者第二个图像必须是scalar值。
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x,y)) # 250+10 = 260 => 255
print(x+y) # 250+10 = 260 % 256 = 4
图像混合(Blending)
这是图像相加的运算,但是可以对每个图像采用不同的权重,从而实现混合透明的效果。
dst=α⋅img1+β⋅img2+γ
import cv2
img1 = cv2.imread('../robot.png')
img2 = cv2.imread('../logo.png')
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
位运算(Bitwise)
位操作包括AND,OR,NOT,XOR。这些操作在提取图像的非矩形区域时非常有用,例如非矩形的ROI。下面的例子演示如何改变一个图像区域。
我们打算把logo放到图像上,如果用加法会改变图像的颜色,如果混合会得到透明效果,但是我们希望它是不透明的。如果logo是矩形,可以用ROI的方法,但是logo不是矩形的,所以需要通过位操作完成。
# coding: utf-8
import cv2
# Load two images
img1 = cv2.imread('../01.jpeg')
img2 = cv2.imread('../logo.png')
# I want to put logo on top-left corner, So I create a ROI
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
# Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# Now black-out the area of logo in ROI
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('res', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
网友评论