• 详解cv2.copyMakeBorder函数【OpenCV图像边界填充Python版本】


    简介

    深度学习图像数据集时,有时候需要调整一张图片的长和宽。如果直接使用cv2.resize函数会造成图像扭曲失真,因此我们可以采取填充图像短边的方法解决这个问题。cv2.copyMakeBorder函数提供了相关操作。本篇博客详细介绍了cv2.copyMakeBorder使用方法,并给出了代码示例。🚀🚀🚀

    函数原型

    def copyMakeBorder(
        src: Any,
        top: int,
        bottom: int,
        left: int,
        right: int,
        borderType: int,
        dst: Any | None = ...,
        value: Any = ...
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    参数意义
    src输入图像
    top图像顶部需要填充的边界宽度(单位:像素)
    bottom图像底部需要填充的边界宽度(单位:像素)
    left图像左侧需要填充的边界宽度(单位:像素)
    right图像右侧需要填充的边界宽度(单位:像素)
    borderType填充类型
    dst输出图像。Python借口一般不用这个参数。
    value常量填充是给定的颜色常量值。[0,255]
    填充类型解释
    cv2.BORDER_CONSTANT常数填充🚀👍:|oooo|abcd|oooo|
    cv2.BORDER_ISOLATED使用黑色像素进行填充,同:cv2.BORDER_CONSTANT类型且value=0
    cv2.BORDER_REFLECT从外向内取图像边缘的像素填充:|dcba|abcd|dcba|
    cv2.BORDER_REFLECT101反射填充的另一种情况,跳过原图边上的一个像素值:|dcb|abcd|cba|
    cv2.BORDER_REFLECT_101cv2.BORDER_REFLECT101
    cv2.BORDER_DEFAULTcv2.BORDER_REFLECT101
    cv2.BORDER_REPLICATE复制图像最边上的像素进行填充:|aaaa|abcd|dddd|
    cv2.BORDER_TRANSPARENT这个类型在新的OpenCV4中已经被取消👎
    cv2.BORDER_WRAP在图像对侧从外向内取图像边缘的像素填充:|dcba|abcd|abcd|

    代码示例

    OpenCV中不同方法对Lenna图片进行扩充边界

    import cv2
    import matplotlib.pyplot as plt
    
    
    lenna = cv2.imread(filename="Lenna.png", flags=cv2.IMREAD_ANYCOLOR)
    lenna_constant = cv2.copyMakeBorder(src=lena, top=10, bottom=10, left=20, right=30, borderType=cv2.BORDER_CONSTANT, value=0)
    lenna_default = cv2.copyMakeBorder(src=lena, top=10, bottom=10, left=20, right=30, borderType=cv2.BORDER_DEFAULT)
    lenna_isolated = cv2.copyMakeBorder(src=lena, top=10, bottom=10, left=20, right=30, borderType=cv2.BORDER_ISOLATED)
    lenna_reflect = cv2.copyMakeBorder(src=lena, top=10, bottom=10, left=20, right=30, borderType=cv2.BORDER_REFLECT)
    lenna_reflect101 = cv2.copyMakeBorder(src=lena, top=10, bottom=10, left=20, right=30, borderType=cv2.BORDER_REFLECT101)
    lenna_reflect_101 = cv2.copyMakeBorder(src=lena, top=10, bottom=10, left=20, right=30, borderType=cv2.BORDER_REFLECT_101)
    lenna_replicate = cv2.copyMakeBorder(src=lena, top=10, bottom=10, left=20, right=30, borderType=cv2.BORDER_REPLICATE)
    lenna_wrap = cv2.copyMakeBorder(src=lena, top=10, bottom=10, left=20, right=30, borderType=cv2.BORDER_WRAP)
    
    
    fig = plt.figure()
    ax1 = fig.add_subplot(3, 3, 1)
    ax1.axes.xaxis.set_visible(b=False)
    ax1.axes.yaxis.set_visible(b=False)
    ax1.spines["top"].set_visible(b=False)
    ax1.spines["bottom"].set_visible(b=False)
    ax1.spines["right"].set_visible(b=False)
    ax1.spines["left"].set_visible(b=False)
    ax1.set_title(label="original Lenna")
    ax1.imshow(cv2.cvtColor(src=lenna, code=cv2.COLOR_BGR2RGB))
    
    ax2 = fig.add_subplot(3, 3, 2)
    ax2.axes.xaxis.set_visible(b=False)
    ax2.axes.yaxis.set_visible(b=False)
    ax2.spines["top"].set_visible(b=False)
    ax2.spines["bottom"].set_visible(b=False)
    ax2.spines["right"].set_visible(b=False)
    ax2.spines["left"].set_visible(b=False)
    ax2.set_title(label="cv2.BORDER_CONSTANT")
    ax2.imshow(cv2.cvtColor(src=lenna_constant, code=cv2.COLOR_BGR2RGB))
    
    ax3 = fig.add_subplot(3, 3, 3)
    ax3.axes.xaxis.set_visible(b=False)
    ax3.axes.yaxis.set_visible(b=False)
    ax3.spines["top"].set_visible(b=False)
    ax3.spines["bottom"].set_visible(b=False)
    ax3.spines["right"].set_visible(b=False)
    ax3.spines["left"].set_visible(b=False)
    ax3.set_title(label="cv2.BORDER_DEFAULT")
    ax3.imshow(cv2.cvtColor(src=lenna_default, code=cv2.COLOR_BGR2RGB))
    
    ax4 = fig.add_subplot(3, 3, 4)
    ax4.axes.xaxis.set_visible(b=False)
    ax4.axes.yaxis.set_visible(b=False)
    ax4.spines["top"].set_visible(b=False)
    ax4.spines["bottom"].set_visible(b=False)
    ax4.spines["right"].set_visible(b=False)
    ax4.spines["left"].set_visible(b=False)
    ax4.set_title(label="cv2.BORDER_ISOLATED")
    ax4.imshow(cv2.cvtColor(src=lenna_isolated, code=cv2.COLOR_BGR2RGB))
    
    ax5 = fig.add_subplot(3, 3, 5)
    ax5.axes.xaxis.set_visible(b=False)
    ax5.axes.yaxis.set_visible(b=False)
    ax5.spines["top"].set_visible(b=False)
    ax5.spines["bottom"].set_visible(b=False)
    ax5.spines["right"].set_visible(b=False)
    ax5.spines["left"].set_visible(b=False)
    ax5.set_title(label="cv2.BORDER_REFLECT")
    ax5.imshow(cv2.cvtColor(src=lenna_reflect, code=cv2.COLOR_BGR2RGB))
    
    ax6 = fig.add_subplot(3, 3, 6)
    ax6.axes.xaxis.set_visible(b=False)
    ax6.axes.yaxis.set_visible(b=False)
    ax6.spines["top"].set_visible(b=False)
    ax6.spines["bottom"].set_visible(b=False)
    ax6.spines["right"].set_visible(b=False)
    ax6.spines["left"].set_visible(b=False)
    ax6.set_title(label="cv2.BORDER_REFLECT101")
    ax6.imshow(cv2.cvtColor(src=lenna_reflect101, code=cv2.COLOR_BGR2RGB))
    
    ax7 = fig.add_subplot(3, 3, 7)
    ax7.axes.xaxis.set_visible(b=False)
    ax7.axes.yaxis.set_visible(b=False)
    ax7.spines["top"].set_visible(b=False)
    ax7.spines["bottom"].set_visible(b=False)
    ax7.spines["right"].set_visible(b=False)
    ax7.spines["left"].set_visible(b=False)
    ax7.set_title(label="cv2.BORDER_REFLECT_101")
    ax7.imshow(cv2.cvtColor(src=lenna_reflect_101, code=cv2.COLOR_BGR2RGB))
    
    ax8 = fig.add_subplot(3, 3, 8)
    ax8.axes.xaxis.set_visible(b=False)
    ax8.axes.yaxis.set_visible(b=False)
    ax8.spines["top"].set_visible(b=False)
    ax8.spines["bottom"].set_visible(b=False)
    ax8.spines["right"].set_visible(b=False)
    ax8.spines["left"].set_visible(b=False)
    ax8.set_title(label="cv2.BORDER_REPLICATE")
    ax8.imshow(cv2.cvtColor(src=lenna_replicate, code=cv2.COLOR_BGR2RGB))
    
    ax9 = fig.add_subplot(3, 3, 9)
    ax9.axes.xaxis.set_visible(b=False)
    ax9.axes.yaxis.set_visible(b=False)
    ax9.spines["top"].set_visible(b=False)
    ax9.spines["bottom"].set_visible(b=False)
    ax9.spines["right"].set_visible(b=False)
    ax9.spines["left"].set_visible(b=False)
    ax9.set_title(label="cv2.BORDER_WRAP")
    ax9.imshow(cv2.cvtColor(src=lenna_wrap, code=cv2.COLOR_BGR2RGB))
    
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108

    参考资料

    1. OpenCV文档:Adding borders to your images
    2. CSDN:图像处理作窗口运算时边界的几种扩展方法(详解OpenCV中的参数borderType)
    3. CSDN:【opencv4.3.0教程】11之调整图像边缘(copyMakeBorder 与 borderInterpolate)

    收集整理和创作不易, 若有帮助🉑, 请帮忙点赞👍➕收藏❤️, 谢谢!✨✨🚀🚀

  • 相关阅读:
    力扣每日一题:754. 到达终点数字【数学题】
    2023全新云渲染测评!效果图渲染哪个平台性价比更高?
    毕业3年...设计行业一事无成,北漂闯荡转行成功
    java中如何开启多线程呢?
    LINUX笔记温习
    机器人制作开源方案 | 智能照科植物花架
    centos7.6配置用户免密及权限
    torch.repeat
    基于局域网内物联网的androidAPP开发——实现消息上报与命令下达
    Nexus的管理
  • 原文地址:https://blog.csdn.net/KRISNAT/article/details/133810955