详解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 = ...
)
| 参数 | 意义 |
|---|---|
| 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_101 | 同cv2.BORDER_REFLECT101 |
| cv2.BORDER_DEFAULT | 同cv2.BORDER_REFLECT101 |
| cv2.BORDER_REPLICATE | 复制图像最边上的像素进行填充:|aaaa|abcd|dddd| |
| cv2.BORDER_TRANSPARENT | 这个类型在新的OpenCV4中已经被取消👎 |
| cv2.BORDER_WRAP | 在图像对侧从外向内取图像边缘的像素填充:|dcba|abcd|abcd| |
代码示例

import cv2
import matplotlib.pyplot as pltlenna = 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()
参考资料
- OpenCV文档:Adding borders to your images
- CSDN:图像处理作窗口运算时边界的几种扩展方法(详解OpenCV中的参数borderType)
- CSDN:【opencv4.3.0教程】11之调整图像边缘(copyMakeBorder 与 borderInterpolate)
收集整理和创作不易, 若有帮助🉑, 请帮忙点赞👍➕收藏❤️, 谢谢!✨✨🚀🚀
相关文章:
详解cv2.copyMakeBorder函数【OpenCV图像边界填充Python版本】
文章目录 简介函数原型代码示例参考资料 简介 做深度学习图像数据集时,有时候需要调整一张图片的长和宽。如果直接使用cv2.resize函数会造成图像扭曲失真,因此我们可以采取填充图像短边的方法解决这个问题。cv2.copyMakeBorder函数提供了相关操作。本篇…...
前端技术-并发请求
并发请求 代码解释 定义了一个函数 concurRequest,用于并发请求多个 URL 并返回它们的响应结果。 function concurRequest(urls, maxNum) {return new Promise((resolve, reject) > {if (urls.length 0) {resolve([]);return;}const results [];let index …...
面试题-React(十三):React中获取Refs的几种方式
一、Refs的基本概念 Refs是React提供的一种访问DOM元素或组件实例的方式。通过Refs,我们可以在React中获取到底层的DOM节点或组件实例,并进行一些操作。Refs的使用场景包括但不限于:访问DOM属性、调用组件方法、获取输入框的值等。 二、获取…...
Linux CentOS 7升级curl8.4.0使用编译安装方式
1、查看当前版本 # curl --version curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.19.1 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.4.3 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps tel…...
探寻JWT的本质:它是什么?它有什么作用?
JWT(JSON Web Token)是一种基于 JSON 格式的轻量级令牌(token)协议,它被广泛应用于网络应用程序的身份验证和授权。相较于传统的 session-based 认证机制,JWT 具有更好的扩展性和互操作性,同时也…...
关于雅思听力答案限定字数的解释。
1. No more than three words and/or a number:31,可以填3/2/1个单词;1个数字;3/2/1个单词1个数字 2. No more than three words and/or numbers:3n,可以填3/2/1个单词;n个数字;3/2…...
化工python | CSTR连续搅拌反应器系统
绝热连续搅拌釜反应器 (CSTR) 是过程工业中常见的化学系统。 容器中发生单个一级放热且不可逆的反应 A → B,假定容器始终完全混合。 试剂 A 的入口流以恒定的体积速率进入罐。 产物流B以相同的体积速率连续排出,液体密度恒定。 因此,反应液体的体积是恒定的。 在反应器中发…...
交通物流模型 | 基于自监督学习的交通流预测模型
交通物流模型 | 基于自监督学习的交通流预测模型 在智能交通系统中,准确预测不同时间段的城市交通流量是至关重要的。现有的方法存在两个关键的局限性:1、大多数模型集中预测所有区域的交通流量,而没有考虑空间异质性,即不同区域的交通流量分布可能存在偏差;2、现有模型无…...
343. 整数拆分 96.不同的二叉搜索树
343. 整数拆分 设dp[i]表示拆分 数字i 出来的正整数相乘值最大的值 (i - j) * j,和dp[i - j] * j是获得dp[i]的两种乘法,在里面求最大值可以得到当前dp[i]的最大值,但是这一次的得出的最大值如果赋值给dp[i],可能没有没赋值的dp[i]大&#…...
Vue3理解(9)
侦听器 1.计算属性允许我们声明性地计算衍生值,而在有些情况下,我们需要状态变化时执行一些方法例如修改DOM。 2.侦测数据源类型,watch的第一个参数可以市不同形式的‘数据源’,它可以市一个ref(包括计算属性),一个响应式对象&…...
CRM系统中的销售漏斗有什么作用?
随着数字化发展,越来越多的企业使用CRM销售管理系统提高销售管理水平,提升盈利能力。在这个过程中,销售漏斗起到了非常重要的作用。下面就来说说,CRM系统中的销售漏斗有什么作用? 一、销售数据可视化 CRM销售漏斗通过…...
项目(模块1:用户登陆流程分析)
验证登陆点流程...
2023年中国商用服务机器人行业发展概况分析:国产机器人厂商向海外进军[图]
商用服务机器人指在非制造业的商用服务场景中,用来替代或辅助人类进行服务性质工作的机器人;常见的商用场景中,商用服务机器人主要分为终端配送类机器人,商用清洁类机器人,引导讲解类机器人等,被广泛应用在…...
千兆光模块和万兆光模块的适用场景有哪些
随着数字化和物联网的普及,对网络速度和带宽的要求也越来越高。千兆光模块和万兆光模块是两种常见的光模块,在不同的应用场景中,它们各具优势。下面我们来探讨一下千兆光模块和万兆光模块的主要适用场景。 首先是企业网络。千兆光模块常用于…...
2 files found with path ‘lib/armeabi-v7a/liblog.so‘ from inputs:
下图两个子模块都用CMakeLists.txt引用了android的log库,编译后,在它们的build目录下都有liblog.so的文件。 四个CPU架构的文件夹下都有。 上层模块app不能决定使用哪一个,因此似乎做了合并,路径就是报错里的哪个路径,…...
qt中json类
目录 QJsonValue QJsonObject QJsonArray QJsonDocument 案例: Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析,下面介绍4个常用的类。 QJsonValue 该类封装了JSON支持的数据类型。 布尔类型…...
NeurIPS 2023 | AD-PT:首个大规模点云自动驾驶预训练方案
概要 自动驾驶领域的一个长期愿景是,感知模型能够从大规模点云数据集中学习获得统一的表征,从而在不同任务或基准数据集中取得令人满意的结果。之前自监督预训练的工作遵循的范式是,在同一基准数据集上进行预训练和微调,这很难实…...
设计模式-结构型模式
文章目录 一、代理模式1.静态代理2.JDK动态代理3.CGLib动态代理4.三种代理对比 二、适配器模式1.类适配器模式2.对象适配器模式 三、装饰者模式静态代理和装饰者的区别 四、桥接模式五、外观模式六、组合模式七、享元模式 结构性模式描述如何将类或对象按某种布局组成更大的结构…...
BUUCTF学习(7): 随便注,固网杯
1、介绍 2、解题 11;show tables;# select * from 1919810931114514 concat(sel,ect from 1919810931114514 ) PEREPARE y from sql; ECCUTE y; -1; sEt sql CONCAt(se,lect * from 1919810931114514;); prePare stmt from sql; EXECUTE stmt; # 结束...
【文末福利】巧用Chat GPT快速提升职场能力:数据分析与新媒体运营
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
