你可以使用函数cv2.add() 将两幅图像进行加法运算,当然也可以直接使
用numpy,res=img1+img。两幅图像的大小,类型必须一致,或者第二个
图像可以使一个简单的标量值。
import numpy as np import cv2 from matplotlib import pyplot as plt import matplotlib.image as mpimg # mpimg 用于读取图片 x=np.uint8([250]) y=np.uint8([10]) z1=cv2.add(x,y) print(z1) z2=x+y print(z2)
这种差别在你对两幅图像进行加法时会更加明显。OpenCV 的结果会更好
一点。所以我们尽量使用OpenCV 中的函数。
这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混
合或者透明的感觉。图像混合的计算公式如下:
通过修改a的值(0 -> 1),可以实现非常酷的混合。
现在我们把两幅图混合在一起。第一幅图的权重是0.7,第二幅图的权重
是0.3。函数cv2.addWeighted() 可以按下面的公式对图片进行混合操作。
这里r的取值为0。
import numpy as np import cv2 from matplotlib import pyplot as plt import matplotlib.image as mpimg # mpimg 用于读取图片 img1=cv2.imread('3.jpg') img2=cv2.imread('4.jpg') dst=cv2.addWeighted(img1,0.7,img2,0.3,0) cv2.imshow('dst',dst) cv2.waitKey(0) cv2.destroyAllWindows()
import cv2 import numpy as np from PIL import Image img = cv2.imread("2.jpeg") print(img.shape) cropped = img[0:1200, 0:1200] # 裁剪坐标为[y0:y1, x0:x1] cv2.imwrite("2.png", cropped)
这里包括的按位操作有:AND,OR,NOT,XOR 等。当我们提取图像的一部分,选择非矩形ROI 时这些操作会很有用。下面的例子就是教给我们如何改变一幅图的特定区域。
我想把树叶的标志放到另一幅图像上。如果我使用加法,颜色会改变,如果使用混合,会得到透明效果,但是我不想要透明。如果他是矩形我可以象上一章那样使用ROI。但是他不是矩形。但是我们可以通过下面的按位运算实现:
import numpy as np import cv2 from matplotlib import pyplot as plt import matplotlib.image as mpimg # mpimg 用于读取图片 #让img2的logo放在img1的左上角 所以创建一个ROI img1=cv2.imread('4.jpg') img2=cv2.imread('5.jpg') rows,cols,channels=img2.shape roi=img1[0:rows,0:cols] #创建掩模 img2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) ret,mask=cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY) cv2.imshow('mask',mask) #反运算 mask_inv=cv2.bitwise_not(mask) cv2.imshow('mask_inv',mask_inv) # 取roi 中与mask 中不为零的值对应的像素的值,其他值为0 # 注意这里必须有mask=mask 或者mask=mask_inv, 其中的mask= 不能忽略 img1_bg=cv2.bitwise_and(roi,roi,mask=mask) cv2.imshow('img1_bg',img1_bg) # 取roi 中与mask_inv 中不为零的值对应的像素的值,其他值为0。 # Take only region of logo from logo image. img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv) cv2.imshow('img2_bg',img2_fg) # 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()
结果如下,为了帮助大家理解我把上面程序的中间结果也显示了出来,特别是img1_bg 和img2_fg。