(五)图像的算术和逻辑操作
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()