python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加
【1】引言
前序已经学习了直接在画布上使用掩模,会获得彩色图像的多种叠加效果,相关文章链接为:
python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖-CSDN博客
这时候如果更进一步,直接用两张图片互相叠加,是否会有新的图像出现?这就是本次文章想讨论的内容。
在更早的时候,我们已经掌握了对灰度图像的掩模操作:
python学opencv|读取图像(九)用numpy创建黑白相间灰度图_numpy生成全黑图片-CSDN博客
因此,这种图片叠加的操作,应该可以同时作用于灰度图像和彩色图像。
探索图像的叠加效果,需要使用的函数是cv2.add()。
【2】官网教程
点击下述链接,可以直达cv2.add()函数官网说明:
官网页面关于cv2.add()函数的说明为:
图1
具体的各个参数的意义为:
void cv::add ( InputArray src1, #输入图像1
InputArray src2, #输入图像2
OutputArray dst, #输出图像2
InputArray mask = noArray(), #掩模
int dtype = -1 ) #输出图像的深度,为默认值,暂无需关注
【3】代码测试
【3.1】灰度图像
首先是引入cv2等模块和原始图像:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块
# 读取图片-直接转化灰度图
src = cv.imread('srcf.png',0) #读取图像
dst=src#输出图像
然后进行图形叠加操作:
#图像叠加
dst1=dst+dst #图像使用“+”叠加
dst2=cv.add(dst,dst) #图像使用“cv.add()函数”叠加
然后在屏幕上展示图像:
#在屏幕展示效果
cv.imshow('srcdst', dst) # 在屏幕展示效果
cv.imshow('srcdst1', dst1) # 在屏幕展示效果
cv.imshow('srcdst2', dst1) # 在屏幕展示效果
为探寻实际的叠加效果,读取了特定像素点的BGR值:
#显示BGR值
print("dst像素数为[258,258]位置处的BGR=", dst[258, 258]) # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[258,258]位置处的BGR=", dst1[258,258]) # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[258,258]位置处的BGR=", dst2[258,258]) # 获取像素数为[100,100]位置处的BGR
print("dst像素数为[100,100]位置处的BGR=", dst[100, 100]) # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[100,100]位置处的BGR=", dst1[100,100]) # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100,100]) # 获取像素数为[100,100]位置处的BGR
之后保存相关图像:
#保存图像
cv.imwrite('srcf-dst.png', dst) # 保存图像
cv.imwrite('srcf-dst1.png', dst1) # 保存图像
cv.imwrite('srcf-dst2.png', dst2) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
本文使用的原始图像为:
图2 原始图像
叠加后的图像效果为:
图3 图像使用“+”叠加-灰度图像
图4 图像使用“cv.add()函数”叠加-灰度图像
由图3和图4对比可见:图4相对来说更亮。
这时候,再看特定点的BGR值:
图5 特定像素点BGR值-灰度图像
在像素点[258,258]获得的原始图像dst对应的BGR=71,dst1和dst2在该点对应的BGR=142=2*71,可以明显看到使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加。
在像素点[100,100]获得的原始图像dst对应的BGR=156,dst1在该点对应的BGR=56,dst2在该点对应的BGR=255。实际上,使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加,但对于使用“+”叠加,像素点BGR值超过255后会重新计数,57=156*2-255,但由于像素点是从0开始计算,所以第57个数对应的BGR值为56;使用和“cv.add()函数”叠加,像素点BGR值超过255后会直接截断为255。
【3.2】彩色图像
之后进行彩色图像的零值和反零值处理,这只需要改一行代码,将src = cv.imread('srcun.png',0)改为:
src = cv.imread('srcun.png') #读取图像
直接输出完整代码:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块
# 读取图片-直接转化灰度图
src = cv.imread('srcf.png') #读取图像
dst=src#输出图像
#图像叠加
dst1=dst+dst #图像使用“+”叠加
dst2=cv.add(dst,dst) #图像使用“cv.add()函数”叠加
#在屏幕展示效果
cv.imshow('srcdst', dst) # 在屏幕展示效果
cv.imshow('srcdst1', dst1) # 在屏幕展示效果
cv.imshow('srcdst2', dst2) # 在屏幕展示效果
#显示BGR值
print("dst像素数为[258,258]位置处的BGR=", dst[258, 258]) # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[258,258]位置处的BGR=", dst1[258,258]) # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[258,258]位置处的BGR=", dst2[258,258]) # 获取像素数为[100,100]位置处的BGR
print("dst像素数为[100,100]位置处的BGR=", dst[100, 100]) # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[100,100]位置处的BGR=", dst1[100,100]) # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100,100]) # 获取像素数为[100,100]位置处的BGR
#保存图像
cv.imwrite('srcf-c-dst.png', dst) # 保存图像
cv.imwrite('srcf-c-dst1.png', dst1) # 保存图像
cv.imwrite('srcf-c-dst2.png', dst2) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
代码运行后获得的图像效果为:
图6 图像使用“+”叠加-灰度图像
图7 图像使用“cv.add()函数”叠加-彩色图像
此时的特定像素点BGR值为:
图8 特定像素点BGR值-彩色图像
对像素点[258,258]和像素点[100,100]获得的原始图像dst对应的BGR和叠加后的图像dst1、dst2在该点对应的BGR分析可知:使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加,但对于使用“+”叠加,像素点BGR值超过255后会重新计数;使用和“cv.add()函数”叠加,像素点BGR值超过255后会直接截断为255。
图9 对比效果
【4】细节说明
如果相互叠加的两个图像原本对应的BGR值分别为BGR1和BGR2,使用“+”叠加时,重新计数的BGR=BGR1+BGR2-255-1。
【5】总结
掌握了python+opencv实现各个像素点BGR叠加的技巧。
原文地址:https://blog.csdn.net/weixin_44855046/article/details/145277713
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!