目标
掌握几种图像算术操作,比如加、减、按位操作等掌握函数cv2.add()、cv2.addWeighted()等图像相加
图像相加可以通过OpenCV函数cv2.add()或者Numpy相加实现。需要注意的是OpenCV相加是饱和运算(即两个像素值之和大于255时取最大值255),Numpy相加是取模运算(即两个像素值之和大于255时取与255的余数)。
>>> x = np.uint8([250])>>> y = np.uint8([10])>>> print( cv.add(x,y) ) # 250+10 = 260 => 255[[255]]>>> print( x+y )# 250+10 = 260 % 256 = 4[4]
图像混合
图像混合也是图像相加,但是可以给图像不同的权重,会产生一种混合或者透明的感觉。图像按照下面的公式相加,
α在0-1之间变化,从而将一张图像融合到另一张图像中。
下面的代码混合两张图像,第一张图片的权重为0.7,第二张图片的权重为0.4,使用函数cv.addWeighted()完成上面公式,其中λ=0。
img1 = cv.imread('image\\lenacolor.png')img2 = cv.imread('image\\girl.bmp')img2 = cv.resize(img2,(512,512),interpolation=cv.INTER_CUBIC)dst = cv.addWeighted(img1,0.7,img2,0.4,0)cv.imshow('dst',dst)cv.waitKey(0)cv.destroyAllWindows()
按位运算
这一部分中包括按位与、或、非和异或运算。这部分操
作对于抽取图像的任意部位和定义处理非矩形感兴趣区域将会十分有用。下面我们将改变图片某一个特定区域。
下面的案例将OpenCV的logo放到另一张图片的左上角。
# 加入两张图片img1 = cv.imread('image\\barbara.bmp',cv.IMREAD_UNCHANGED)img2 = cv.imread('image\\OpenCV.png')# 创建图片1的感兴趣区域,大小为图片2的尺寸rows,cols,channels = img2.shaperoi = img1[0:rows, 0:cols ]# 创建logo的掩膜和逆膜,首先将logo变成灰度图img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)# 图片2进行二进制阈值化分割ret, mask = cv.threshold(img2gray, 200, 255, cv.THRESH_BINARY)# 创建逆膜,按位非运算mask_inv = cv.bitwise_not(mask)# 图片1的感兴趣区域的背景,按位与运算img1_bg = cv.bitwise_and(roi,roi,mask = mask)# 图片1的感兴趣区域的前景,按位与运算img2_fg = cv.bitwise_and(img2,img2,mask = mask_inv)# 将背景和前景相加dst = cv.add(img1_bg,img2_fg)# 将图片1的感兴趣区域替换成合成图片img1[0:rows, 0:cols ] = dstcv.imshow('res',img1)cv.waitKey(0)cv.destroyAllWindows()
结果如下图
上面代码中比较核心的有一些几句,
ret, mask = cv.threshold(img2gray, 200, 255, cv.THRESH_BINARY),以200作为阈值进行二进制阈值分割,获得二值图。mask_inv = cv.bitwise_not(mask),按位非操作,获得与阈值分割的图相反的图片
img1_bg = cv.bitwise_and(roi,roi,mask = mask) ,以mask作为操作矩阵指导roi进行按位与操作,提取出roi的背景
img2_fg = cv.bitwise_and(img2,img2,mask = mask_inv),以mask_inv作为操作矩阵指导img2进行按位与操作,提取出logo前景
如果觉得《2-2 图像算数操作—OpenCV-Python教程翻译》对你有帮助,请点赞、收藏,并留下你的观点哦!