opencv-python | cv2.copyMakeBorder使用方法与注意事项

导言

在图像处理任务中,我们经常会使用到改变图像尺寸的操作,比较常见的有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所示。(需要实验的请自取)
在这里插入图片描述

图1. 实验素材face.jpg

如图2所示,程序运行在黑屏终端里输入:

python copyBorder.py

在这里插入图片描述

图2. 程序运行指令和界面

在这里插入图片描述

图3. 程序运行效果截图

图3中蓝色框便是使用随机像素值扩充的边界(程序运行效果应该是边界一直在不同颜色之间闪烁)。同时输出操作指令如图4所示。
在这里插入图片描述

图4. 程序运行输出的操作指令

按’c’,‘r’,可以让边界类型在cv.BORDER_CONSTANT和cv.BORDER_REPLICATE之间切换。按‘ESC’退出程序。

结论

本片博客详细介绍了为什么需要cv2.copyMakeBorder(),cv2.copyMakeBorder()的原理以及cv2.copyMakeBorder()的运行效果。

这里有一个需要注意的地方,在对彩色图像扩充边界的过程中,我发现cv2.copyMakeBorder()只能处理(h,w,channel)维度样式的彩色图像,如果你的彩色图像读取出来是(channel,h,w)或其他格式的,需要转换一下维度,不然会报错。

希望能帮助到入行图像处理的兄弟姐妹,帮助到大家还请动动小手点个赞,也可以收藏以备不时之需,有疑惑的地方也可以评论区见。

猜你喜欢

转载自blog.csdn.net/Just_do_myself/article/details/125675941