OpenCV图像边框填充与图像混合技术详解
本文详解OpenCV中图像边框添加与图像混合的实现方法。通过cv.copyMakeBorder函数可灵活设置上下左右边框宽度及多种填充类型,如常量、复制等。利用cv.addWeighted函数结合权重公式实现两张图像的平滑混合,并进一步演示如何通过循环调整权重生成类似幻灯片渐变的动态效果,附带完整Python代码示例。
图像边框处理
边框处理核心函数介绍
使用cv.copyMakeBorder()函数可实现图像边框的填充操作。该函数的主要参数配置如下:
- 第一个参数指定源图像,例如通过cv.imread读取的img变量。
- 第二至第五个参数分别定义上、下、左、右四个方向的边框宽度,单位为像素。
- 第六个参数用于指定边框的类型(borderType)。
- 可选的边框类型包括:cv.BORDER_CONSTANT、cv.BORDER_REPLICATE、cv.BORDER_REFLECT、cv.BORDER_WRAP、cv.BORDER_REFLECT_101、cv.BORDER_TRANSPARENT、cv.BORDER_REFLECT101、cv.BORDER_DEFAULT以及cv.BORDER_ISOLATED。
- 第七个参数仅在边框类型选择为BORDER_CONSTANT时生效,用于指定边框的具体颜色值。
各边框类型的具体含义说明如下:
- BORDER_CONSTANT表示添加指定颜色的边框,颜色值由value参数列表确定。
- 其他可选参数可根据实际需求调整,但前两个参数最为常用。
以下是具体的代码实现示例:
import cv2 as cv
import numpy as np
if __name__ == "__main__":
img = cv.imread('./imag_in_save/open_class.png')
cv.namedWindow('imag', cv.WINDOW_NORMAL)
cv.resizeWindow('imag', 500, 500)
img = cv.copyMakeBorder(img, 20, 20, 20, 20, cv.BORDER_CONSTANT, value=[2, 83, 13]) # 添加边框
cv.imshow('imag', img)
cv.waitKey(0)
cv.destroyAllWindows()
运行上述代码后的显示效果如下:

图像混合处理
实现图像混合的核心函数介绍
使用cv.addWeighted()函数可实现两张图像的混合。其工作原理基于线性加权公式:g(x)=(1−α)f0(x)+αf1(x)。
- 第一个参数指定第一张输入图像,第二个参数为该图像的权重系数(取值范围0~1),对应公式中的(1 - α)。
- 第三个参数指定第二张需要混合的图像,第四个参数为该图像的权重系数,对应公式中的α。
- 第五个参数用于设置标量累加值,可调节混合后的整体亮度或高光效果。
- 其余两个参数为可选参数,最后一个参数在单独使用时较少见,但在其他特定图像处理场景中应用较多。
- dst参数指定输出数组,其尺寸和通道数需与输入数组保持一致(通常直接通过函数返回值获取)。
- dtype参数指定输出数组的数据类型深度;当两个输入数组深度相同时,可将dtype设为-1,这等效于src1.depth()。
图像混合的代码示例如下:
import cv2 as cv
import numpy as np
if __name__ == "__main__":
img1 = cv.imread(r'./2.png', 1) # 读取彩色图片
img2 = cv.imread(r'./3.png', 1)
cv.namedWindow('imag', cv.WINDOW_NORMAL) # 窗体
img1 = img1[0: 200, 0: 400] # 截取图像的指定部分——因为图像混合需要等大的图像
img2 = img2[0: 200, 0: 400]
img = cv.addWeighted(img1, 0.7, img2, 0.3, 0) # 混合图片——根据权重
while True:
cv.imshow('imag', img) # 显示当前序列号图片
k = cv.waitKey(0) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
执行该代码后的视觉效果如下:

实战练习:实现类似幻灯片播放的渐变切换效果
实现思路解析
- 首先,准备一系列尺寸相同的图片,或对同一场景截取大小一致的图像区域作为数据源。
- 接着,将这些图像数据依次添加到Python列表(list)中。
- 然后,在逐张显示图片的过程中,利用图像混合技术在切换间隙实现平滑的渐变过渡效果。
- 最终呈现效果取决于参数设置,由于未进行复杂的渲染处理,视觉效果可能略显生硬。
完整代码示例如下:
主要逻辑已在代码中添加详细注释,结合注释阅读有助于理解实现过程。
import cv2 as cv
import numpy as np
if __name__ == "__main__":
img_list = [] # 创建一个空序列装准备显示的一系列图片
counts = 0 # 显示图片的序号
cv.namedWindow('imag', cv.WINDOW_NORMAL) # 窗体
cv.resizeWindow('imag', 500, 500)
for i in range(2, 7): # 遍历图片,凭借到空数组中——一共5张
img = cv.imread(f'./imag_in_save/scr/{i}.png') # 用f""实现参数传入
img = img[0: 200, 0: 400] # 截取图像的指定部分——因为图像混合需要等大的图像
img_list.append(img) # 实现图片添加
while True:
cv.imshow('imag', img_list[counts]) # 显示当前序列号图片
k = cv.waitKey(2000) & 0xFF
counts += 1 # 循环下一张图片——0,1,2,3,4有效
if counts == 5: # 循环到最后一张图片后返回到第一张图片
counts = 0
for i in range(0, 10):
k_f = cv.addWeighted(img_list[counts - 1], 1 - (i * 0.1), img_list[counts], i * 0.1, 0) # 做类似渐变的图像合成
# 实现两张(当前图片和接下来显示的图片)图片,不同权重的混合——由于照片权重改变来实现渐变
cv.imshow('imag', k_f) # 显示混合的图片
k = cv.waitKey(120) & 0xFF # 延时和按键读取
if k == 27: # ESC键
break
if k == 27:
break
cv.destroyAllWindows()
实际运行效果如下(图片展示可能不够直观,建议自行添加多张图片进行体验):



总结
至此,关于Python OpenCV图像边框填充及图像混合(含末尾幻灯片渐变效果实现)的内容介绍完毕。如需了解更多OpenCV图像边框填充与混合相关知识,可搜索本站历史文章或浏览后续内容。感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













