(五)图像的算术和逻辑操作

1.两幅相同尺寸的图像叠加,比较三种方式,一般采用权重addWeighted

 import cv2                                               
 import numpy as np
 
 img1=cv2.imread('3D-Matplotlib.png')
 img2=cv2.imread('mainsvmimage.png')
 
 #第一种混乱的加,不用
 add1=img1+img2
 #第二种得到很亮的图像,原理如下:
 #(155,211,79)+(50,170,200)=205,381,279...translated to(205,255,255)
 add2=cv2.add(img1,img2)
 #第三种,带权重的加
 weighted=cv2.addWeighted(img1,0.6,img2,0.4,0)
 
 cv2.imshow('add1',add1)
 cv2.imshow('add2',add2)
 cv2.imshow('add3',weighted)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

原始图片(两个图片尺寸相同)如下:

  

叠加后的三种图像:

 

2.将小图片叠加到大图片上,且不保留小图片的白色区域。

(1)将小图片转为灰度图片,且使用阀值得到去周围的模板,再逻辑取反得到去图标的模板

(2)使用模板2,去掉roi的图标部分,然后使用模板1,去掉图2的白色部分,得到只有彩色图标的图

(3)获得需要的图像

 import cv2                                                                                                                           
 import numpy as np
 
 img1=cv2.imread('3D-Matplotlib.png')
 img2=cv2.imread('mainlogo.png')
 
 rows,cols,channels=img2.shape
 roi=img1[0:rows,0:cols]
 
 #得到小图像的灰度图
 img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
 #设置阀值,<220的变为黑色,>220的变为白色,并反转
 #即得到图标白,周围黑的图像
 ret,mask = cv2.threshold(img2gray,220,255,cv2.THRESH_BINARY_INV)

 #按位取反,得到图标黑,周围白的图像
 mask_inv = cv2.bitwise_not(mask)
 
 #使用模板2,去掉roi的图标部分
 img1_bg = cv2.bitwise_and(roi,roi,mask=mask_inv)
 #使用模板1,去掉图2的白色部分,得到只有彩色图标的图
 img2_fg=cv2.bitwise_and(img2,img2,mask=mask)
 
 #获得需要的图像
 dst=cv2.add(img1_bg,img2_fg)
 img1[0:rows,0:cols]=dst
 cv2.imshow('res',img1)
 cv2.waitKey(0)
 cv2.destroyAllWindows()
原文地址:https://www.cnblogs.com/sunnyCx/p/8137942.html