目录
当你在处理图像时,有时候你可能需要调整图像的大小,使其符合特定的尺寸或者比例。然而,在调整图像大小的过程中,你可能会遇到一个问题,那就是图像的边界处理。图像调整大小后,常常会导致边界出现空白区域,这会影响图像的美观度。为了解决这个问题,OpenCV库中提供了一个非常方便的函数——cv2.copyMakeBorder(),它可以帮助你对图像进行边界填充。
1、什么是cv2.copyMakeBorder()函数?
cv2.copyMakeBorder()是OpenCV库中的一个函数,用于给图像添加额外的边界(padding)。它的主要作用是在图像的边界上添加一些额外的像素值,以改变图像的大小或者比例,而同时保持图像的整体结构不变。
2、函数参数解析
这个函数有以下几个参数:
src: 要扩充边界的原始图像。
top, bottom, left, right: 分别表示在图像的上、下、左、右四个方向上的边框宽度。
borderType: 定义要添加边框的类型,它可以是以下几种:
cv2.BORDER_CONSTANT: 添加的边界框像素值为常数,需要额外再给定一个参数。
cv2.BORDER_REFLECT: 添加的边界像素将是边界元素的镜面反射。
cv2.BORDER_REFLECT_101 或 cv2.BORDER_DEFAULT:类似于cv2.BORDER_REFLECT,但是有一些细微的不同。
cv2.BORDER_REPLICATE:使用最边界的像素值代替。
cv2.BORDER_WRAP:左右两边替换。
3、示例代码
下面是一个使用cv2.copyMakeBorder()函数的示例代码:
import cv2
# 读取图像
zl = cv2.imread('picture.png')
# 设置边框宽度
top, bottom, left, right = 50, 50, 50, 50
# 添加不同类型的边框
constant = cv2.copyMakeBorder(picture, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=0)
reflect = cv2.copyMakeBorder(picture, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(picture, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(picture, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(picture, top, bottom, left, right, borderType=cv2.BORDER_WRAP)
# 显示结果
cv2.imshow('ORIGINAL', picture)
cv2.imshow('CONSTANT', constant)
cv2.imshow('REFLECT', reflect)
cv2.imshow('REFLECT_101', reflect101)
cv2.imshow('REPLICATE', replicate)
cv2.imshow('WRAP', wrap)
cv2.waitKey(0)
cv2.destroyAllWindows()
当我们看示例代码时,我们首先需要导入OpenCV库,以便使用其中的函数。然后,我们加载了一张图像(在这个例子中,图像名为'picture.png'),该图像将用作我们的示例。
接下来,我们定义了四个变量:top
、bottom
、left
和right
,它们分别代表了在图像的四个边界上要添加的像素数。在这个示例中,我们将每个边界的宽度设置为50个像素。
接着,我们使用cv2.copyMakeBorder()
函数来为原始图像添加不同类型的边框。这里我们展示了五种不同类型的边框:
①cv2.BORDER_CONSTANT
:使用常数填充边框。
②cv2.BORDER_REFLECT
:通过图像边界的镜像反射填充边框。
③cv2.BORDER_REFLECT_101
或cv2.BORDER_DEFAULT
:与cv2.BORDER_REFLECT
类似,但有一些微小差异。
④cv2.BORDER_REPLICATE
:使用最边界的像素值填充边框。
⑥cv2.BORDER_WRAP
:左右两边替换填充。
最后,我们使用cv2.imshow()
函数将原始图像和添加边框后的图像显示在屏幕上。cv2.waitKey(0)
用于等待用户按下任意键盘按键后继续执行代码,而cv2.destroyAllWindows()
用于关闭所有打开的窗口,释放资源。
4、结论
通过使用cv2.copyMakeBorder()函数,你可以轻松地对图像进行边界填充,以满足不同场景下的需求。你可以根据具体情况选择不同的边框类型,并根据需要调整边框的宽度和颜色。这个函数在图像处理中具有广泛的应用,尤其在图像预处理和数据增强等领域有着重要的作用。