需要源码请点赞关注收藏后评论区留言私信~~~
在处理图像时经常会遇到将两幅图像合并成一幅图像,合并图像也分两种情况:两幅图像融合在一起;每幅图像提供一部分内容,将这些内容拼接成一幅图像,OpenCV分别用加权和与覆盖两种方式来满足上述需求
一、加权和
多次曝光技术是指在一幅胶片上拍摄几个影响,最后冲印出的相片同时具有多个影响的信息
OpenCV通过计算加权和的方式,按照不同的权重取两幅图像的像素之和,最后组成新图像。加权和不会像纯加法运算那样让图像丢失信息,而是在尽量保留原有图像信息的基础上把两幅图像融合到一起。
OpenCV通过addWeighter方法计算图像的加权和 语法如下
dst=cv2.addWeighted(src1,alpha,src2,beat,gamma)
alpha 第一幅图像的权重
beta 第二幅图像的权重
gamma 在和结果上添加的标量,该值越大,结果图像越亮,相反则越暗
下面利用加权和的方式实现多次曝光效果
代码如下
import cv2 sun = cv2.imread("sunset.jpg") # 日落原始图像 beach = cv2.imread("beach.jpg") # 沙滩原始图像 rows, colmns, channel = sun.shape # 日落图像的行数、列数和通道数 beach = cv2.resize(beach, (colmns, rows)) # 沙滩图像缩放成日落图像大小 img = cv2.addWeighted(sun, 0.6, beach, 0.6, 0) # 计算两幅图像加权和 cv2.imshow("sun", sun) # 展示日落图像 cv2.imshow("beach", beach) # 展示沙滩图像 cv2.imshow("addWeighted", img) # 展示加权和图像 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
二、覆盖
覆盖图像就是直接把前景图像显示在背景图像中,前景图像挡住背景图像,覆盖之后背景图像会丢失信息,不会出现加权和那样多次曝光的效果
Opencv没有提供覆盖操作的方法,开发者可以直接用修改图像像素值的方式实现图像的覆盖,拼接效果,从A图像中取像素值,直接赋值给B图像的像素
下面演示将小猫图像覆盖到沙滩图像上 可见效果类似于抠图软件
如果前景图是四通道图像,就不能使用上面的方法,下面通过实例演示四通道如何操作
我们拼接一个禁止吸烟图像,它是四通道图像,将禁止图像覆盖到吸烟图像上时要注意:不要把前景图像的透明像素覆盖到背景图像上,覆盖之前要遍历前景图像中的每一个像素,如果alpha值位0,表示该像素是透明像素,就要停止操作该像素。
代码如下
import cv2 # 拼接图像方法 def overlay_img(img, img_over, img_over_x, img_over_y): img_h, img_w, img_p = img.shape # 背景图像宽、高、通道数 img_over_h, img_over_w, img_over_c = img_over.shape # 覆盖图像宽、高、通道数 if img_over_c <= 3: # 通道数小于等于3 img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA) # 转换成4通道图像 for w in range(0, img_over_w): # 遍历列 for h in range(0, img_over_h): # 遍历行 if img_over[h, w, 3] != 0: # 如果不是全透明的像素 for c in range(0, 3): # 遍历三个通道 x = img_over_x + w # 覆盖像素的横坐标 y = img_over_y + h # 覆盖像素的纵坐标 if x >= img_w or y >= img_h: # 如果坐标超出最大宽高 break img[y, x, c] = img_over[h, w, c] # 覆盖像素 return img smoking = cv2.imread("smoking.png", cv2.IMREAD_UNCHANGED) # 吸烟图像,保持原格式 no_img = cv2.imread("no.png", cv2.IMREAD_UNCHANGED) # 禁止图像,保持原格式 cv2.imshow("no", no_img) # 展示禁止图像 cv2.imshow("smoking", smoking) # 展示禁止图像 img = overlay_img(smoking, no_img, 95, 90) # 将禁止图像覆盖到吸烟图像之上 cv2.imshow("no smoking", img) # 展示覆盖结果 cv2.waitKey() # 按下任何键盘按键后 cv2.destroyAllWindows() # 释放所有窗体
创作不易 觉得有帮助请点赞关注收藏~~~