导言
在图像处理任务中,我们经常会使用到改变图像尺寸的操作,比较常见的有Resize、裁剪等。除此之外,还有一种操作是扩充图像的边界,比如在图像的左右或者上下添加若干列(行)的像素。在openCV中,通过函数cv2.copyMakeBorder()完成此操作。
cv2.copyMakeBorder函数介绍
目的
openCV官方文档对cv2.copyMakeBorder()的作用介绍就是给你的图像添加额外的边界(padding)。
比如,当我们在进行卷积操作的时候,一个很自然的问题就是:如何处理图像的边界?怎么对图像边界的点进行卷积?是的,可以通过扩充边界(Padding)的做法将原来的边界元素变为非边界元素。
这里可以操作的地方有三个:**在哪里添加边界?添加什么样的边界?添加多大的边界?**这些都在cv2.copyMakeBorder函数的形参里做了设置和规范。下面介绍其各个形参的作用。
形参
cv.copyMakeBorder(src, top, bottom, left, right, borderType, None, value)
- src: 即将被扩充边界的原始图像
- top, bottom, left, right: 在图像上、下、左、右分别要扩充的行(列)数
- borderType: 扩充的边界类型
- cv.BORDER_CONSTANT: 用常数像素值填充扩充的边界(0或黑色)
- cv.BORDER_REPLICATE: 原始边缘的行或列被复制到扩充的边界
- value: 当使用cv.BORDER_CONSTANT时,设置的要填充的像素值
代码样例
"""
@brief Sample code that shows the functionality of copyMakeBorder
"""
import sys
from random import randint
import cv2 as cv
def main(argv):
borderType = cv.BORDER_CONSTANT
window_name = "copyMakeBorder Demo"
imageName = argv[0] if len(argv) > 0 else 'face.jpg'
# Loads an image
src = cv.imread(cv.samples.findFile(imageName), cv.IMREAD_COLOR)
# Check if image is loaded fine
if src is None:
print ('Error opening image!')
print ('Usage: copy_make_border.py [image_name -- default lena.jpg] \n')
return -1
print ('\n'
'\t copyMakeBorder Demo: \n'
' -------------------- \n'
' ** Press \'c\' to set the border to a random constant value \n'
' ** Press \'r\' to set the border to be replicated \n'
' ** Press \'ESC\' to exit the program ')
cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE)
top = int(0.05 * src.shape[0]) # shape[0] = rows
bottom = top
left = int(0.05 * src.shape[1]) # shape[1] = cols
right = left
while 1:
value = [randint(0, 255), randint(0, 255), randint(0, 255)]
dst = cv.copyMakeBorder(src, top, bottom, left, right, borderType, None, value)
cv.imshow(window_name, dst)
c = cv.waitKey(500)
if c == 27:
break
elif c == 99: # 99 = ord('c')
borderType = cv.BORDER_CONSTANT
elif c == 114: # 114 = ord('r')
borderType = cv.BORDER_REPLICATE
return 0
if __name__ == "__main__":
main(sys.argv[1:])
代码运行效果
程序中使用的图像素材face.jpg如图1所示。(需要实验的请自取)
如图2所示,程序运行在黑屏终端里输入:
python copyBorder.py
图3中蓝色框便是使用随机像素值扩充的边界(程序运行效果应该是边界一直在不同颜色之间闪烁)。同时输出操作指令如图4所示。
按’c’,‘r’,可以让边界类型在cv.BORDER_CONSTANT和cv.BORDER_REPLICATE之间切换。按‘ESC’退出程序。
结论
本片博客详细介绍了为什么需要cv2.copyMakeBorder(),cv2.copyMakeBorder()的原理以及cv2.copyMakeBorder()的运行效果。
这里有一个需要注意的地方,在对彩色图像扩充边界的过程中,我发现cv2.copyMakeBorder()只能处理(h,w,channel)维度样式的彩色图像,如果你的彩色图像读取出来是(channel,h,w)或其他格式的,需要转换一下维度,不然会报错。
希望能帮助到入行图像处理的兄弟姐妹,帮助到大家还请动动小手点个赞,也可以收藏以备不时之需,有疑惑的地方也可以评论区见。