八、计算机视觉-边界填充

文章目录

  • 前言
  • 一、原理
  • 二、具体的实现


前言

在Python中使用OpenCV进行边界填充(也称为zero padding)是一种常见的图像处理操作,通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法

一、原理

边界填充的原理是在图像的周围添加一圈像素,这些像素的值通常设置为0,因此称为zero padding。这样做的目的是为了确保在对图像进行卷积等操作时,边界像素也能够得到正确的处理,而不会出现边界效应导致输出图像尺寸减小的情况。
这怎么理解呢,让我们通过一个简单的例子来说明:
假设我们有一张 5x5 的灰度图像如下所示:
在这里插入图片描述
我们想要对这个图像进行 3x3 的均值滤波,即每个像素的值都取其周围 3x3 区域像素值的平均值。假设我们的卷积核是一个全1的 3x3 矩阵。
进行卷积操作时,我们将卷积核从左上角开始依次移动到图像的每个像素位置,对应位置的输出像素值计算如下:
对于位置(1,1),与卷积核重叠的像素为:
在这里插入图片描述
算这些像素的平均值,得到输出像素值为:(1+2+3+6+7+8+11+12+13) / 9 = 7.444
同样的方法,我们可以得到输出图像中其他位置的像素值。然而,当卷积核与图像边界相交时,由于边界像素周围没有足够的像素可以计算平均值,因此会出现边界效应。在上述例子中,当卷积核位于图像的左上角时,它与图像的左边界和上边界相交,导致无法计算边界像素的周围像素值,因此无法得到正确的输出像素值。
为了解决边界效应,常见的方法之一是通过在图像周围添加额外的像素,即边界填充(zero padding),从而确保卷积核在图像边界处能够正确应用。

二、具体的实现

代码如下(示例):

image = cv2.imread('./img/dog21.png')
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
# 定义填充参数
top_border = 10
bottom_border = 10
left_border = 10
right_border = 10# 使用常数填充,填充值为0
bordered_image_constant = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_CONSTANT, value=0)# 使用边界复制
bordered_image_replicate = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_REPLICATE)# 使用边界反射
bordered_image_reflect = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_REFLECT)# 使用边界反射101
bordered_image_reflect_101 = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_REFLECT_101)# 使用边界包裹
bordered_image_wrap = cv2.copyMakeBorder(image, top_border, bottom_border, left_border, right_border, cv2.BORDER_WRAP)# 创建子图
fig, ((ax1, ax2, ax3),(ax4, ax5,ax6)) = plt.subplots(2, 3, figsize=(20, 10), sharex=True, sharey=True)# 显示图像
ax1.imshow(image.copy())
ax1.set_title('original')
ax2.imshow(bordered_image_constant)
ax2.set_title('constant')
ax3.imshow(bordered_image_replicate, cmap='gray')
ax3.set_title('replicate')
ax4.imshow(bordered_image_reflect, cmap='gray')
ax4.set_title('reflect')
ax5.imshow(bordered_image_reflect_101, cmap='gray')
ax5.set_title('reflect_101')
ax6.imshow(bordered_image_wrap, cmap='gray')
ax6.set_title('wrap')
plt.show()

我们通过创建子图的方式显示,我们创建一个2行3列的图片显示,这样方面我们对比,你也可以像之前那样一张张显示也行。
我们首先看下cv2.copyMakeBorder介绍

cv2.copyMakeBorder() 是 OpenCV 库中的一个函数,用于在图像周围创建边框。下面是该函数的参数及其解释:src:要处理的输入图像。
top:在源图像的顶部添加的像素数目。
bottom:在源图像的底部添加的像素数目。
left:在源图像的左侧添加的像素数目。
right:在源图像的右侧添加的像素数目。
borderType:边框类型,可以是以下之一:
cv2.BORDER_CONSTANT:添加一个常量值的边框。此时需要提供一个value参数,用于指定常量值。
cv2.BORDER_REPLICATE:复制源图像的边界像素。
cv2.BORDER_REFLECT:对源图像的边界进行反射,比如:fedcba|abcdefgh|hgfedcb
cv2.BORDER_REFLECT_101:对源图像的边界进行反射,但略微不同,比如:gfedcb|abcdefgh|gfedcba
cv2.BORDER_WRAP:对源图像的边界进行包装,比如:cdefgh|abcdefgh|abcdefg
value(可选):当borderType为cv2.BORDER_CONSTANT时,指定的常量值。
该函数返回一个新的图像,其大小为原始图像加上指定边框大小,并且根据指定的边框类型进行填充。

执行返回如下:
在这里插入图片描述
上面参数中 主要就是borderType参数,
cv2.BORDER_CONSTANT:添加一个常量值的边框。此时需要提供一个value参数,用于指定常量值。这个最好理解,就是给边缘加一个边框 边框颜色就是value的值,如果是0就是黑色。

cv2.BORDER_REPLICATE:这个很好理解,就是边缘像素点向外复制。你可以看上图的第3图片的边缘 就能看出最外层一圈都是一个像素值
如下图
在这里插入图片描述
cv2.BORDER_REFLECT:对源图像的边界进行反射 你可以想象图片外部边缘为轴,把边缘像素对折到外部,如图:我们看底部填充的像素 就是图片最底部像素的一个反射,当然其他区域也是如此。就不一一显示了 。

在这里插入图片描述
cv2.BORDER_REFLECT_101:和上面差不多 只不过他是以边缘像素为轴进行反射 效果如图:
在这里插入图片描述
cv2.BORDER_WRAP:对源图像的边界进行包装,可以结合上面这些复制方法看下 这个复制也很好理解,是:cdefgh|abcdefgh|abcdefg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/688864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习:jQuary的学习和使用

一、什么是jQuary jQuery 是一个 JavaScript 库。jQuery 极大地简化了 JavaScript 编程。jQuery 很容易学习。 二、jQuary和原生js对比获取input框中的数据和div框中的数据 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <tit…

人工智能技术学习专栏文章汇总—帮助你入门深度学习

人工智能大潮已来&#xff0c;stay hungry, stay foolish! 人工智能技术学习类文章汇总&#xff0c;帮助你入门深度学习。 人工智能学习与实训笔记&#xff08;一&#xff09;&#xff1a;零基础理解神经网络-CSDN博客 人工智能学习与实训笔记&#xff08;二&#xff09;&am…

BufferedImage 这个类在jdk17中使用哪个import导入

在Java开发中&#xff0c;BufferedImage 类是用于处理图像数据的一个类。在JDK 17中&#xff0c;BufferedImage 类属于 java.awt.image 包。因此&#xff0c;要在你的Java程序中使用 BufferedImage 类&#xff0c;你需要通过以下方式导入该类&#xff1a; import java.awt.ima…

Python 将一维数组或矩阵变为三维

Python 将一维数组或矩阵变为三维 正文 正文 话不多说直接上代码&#xff1a; import numpy as npsampling_points 10001arr np.linspace(0, 2, sampling_points) arr_3D arr.reshape(1, 1, -1) print(arr_3D) """ result: [[[0.0000e00 2.0000e-04 4.0000…

OpenCV DNN 活体检测项目环境配置等各阶段tips

date: 2020-09-22 14:53 资料来源《OpenCV深度学习应用与性能优化实践》第八章。 在复现这个项目的时候发现一些可以调整的小tips。 环境配置阶段 使用conda 创建python 工作环境时&#xff0c;注释掉requirems.txt 里的opencv-python-inference-engine4.1.2.1&#xff0c;安…

【国产MCU】-CH32V307-通用定时器(GPTM)-PWM输出

通用定时器(GPTM)-PWM输出 文章目录 通用定时器(GPTM)-PWM输出1、通用定时器的PWM输出介绍2、驱动API介绍3、PWM输出实例3.1 普通方式输出PWM3.2 DMA方式输出PWM本文将详细CH32V307通用定时器的PWM输出功能。 1、通用定时器的PWM输出介绍 在前面的文章中,对CH32V307的通用…

Spring6学习技术|简要介绍+安装环境+入门案例+log4j2日志

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; 碎碎念一下吧&#xff0c;javaWeb跟完了全程。还是感觉啥也不知道&#xff0c;啥也没学会。2025年春天能找到实习吗&#xff1f;真的好担心。 环境安装 纠…

Android 10.0 展讯平台去掉长按power电源键+音量减进入recovery模式

1.前言 在10.0的系统产品开发中,在产品关机的情况下,长按power电源键和音量减的情况下,会在开机过程中然后进入recovery流程中, 在产品开发需要的情况下,要求去掉power电源键和音量减键组合键操作,所以就需要从kernel中来分析下power电源键和音量减的相关操作 的相关源码…

基于Java SSM框架实现电影售票系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现电影售票系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring属于…

铌酸锂芯片与精密划片机:科技突破引领半导体制造新潮流

在当今快速发展的半导体行业中&#xff0c;一种结合了铌酸锂芯片与精密划片机的创新技术正在崭露头角。这种技术不仅引领着半导体制造领域的进步&#xff0c;更为其他产业带来了前所未有的变革。 铌酸锂芯片是一种新型的微电子芯片&#xff0c;它使用铌酸锂作为基底材料&#x…

Github 2024-02-18 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-18统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5PowerShell项目1Rust项目1PHP项目1Jupyter Notebook项目1TypeScript项目1 Black&#xff1a;不妥…

【开源】SpringBoot框架开发高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

快排——OJ题

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、颜色划分1、题目讲解2、算法原理3、代码实现 二、排序数组1、题目讲解2、算法原理3、代码…

JavaAgent介绍 | 基本介绍及无侵入打印方法耗时

闲聊 最近在配置skywalking的过程中发现了-javaagent:这个配置&#xff0c;这里做一个简单的学习 什么是JavaAgent 网上似乎没有直接的文档介绍这个&#xff0c;只找了instrument包的相关文档&#xff0c;其内容页。其中的内容也都是介绍javaagent相关。 instrument包下核心…

pytorch中dataloader的prefetch_factor出错

今天跑huggingface的示例的时候&#xff0c;遇到了最让我头疼的问题&#xff0c;国内网上还没有对应的解释&#xff0c;我可能是第一人&#xff08;汗&#xff09;先看看报错&#xff1a; Traceback (most recent call last):File "F:\transformer\transformers\examples…

JAVA面试虚拟机篇

1. JVM 内存结构 要求 掌握 JVM 内存结构划分 尤其要知道方法区、永久代、元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码 执行 java 命令 创建 JVM&#xff0c;调用类加载子系统加载 class&#xff0c;将类的信息存入方法区 创建…

Ubuntu22.04上作业调度管理软件PBS Torque的安装、配置及主要使用方法

文章目录 前言一、PBS及Torque是什么&#xff1f;二、Ubuntu22.04上Torque的安装和配置步骤1. 更新系统软件包2. 安装必要的软件包3. 下载和安装Torque4. 配置Torque5. 设置环境变量6. 配置和启动Torque服务7. 配置计算节点8. 创建队列的信息&#xff0c;名称 batch0019. 提交测…

【Visual Studio】技巧 :自动与活动文档同步

在这里插入图片描述 工具 -> 选项 -> 项目和解决方案 - 勾选上面的 我厉害不&#xff01;&#xff01;&#xff01;

【QT+QGIS跨平台编译】之四十三:【QScintilla+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、QScintilla介绍二、QScintilla下载三、文件分析四、pro文件五、编译实践5.1 Windows下编译5.2 Linux下编译5.3 MacOS下编译一、QScintilla介绍 QScintilla是一个基于Scintilla编辑器的Qt插件,为Qt应用程序提供了强大的文本编辑功能。Scintilla是一个用C++编写的…

BMS再进阶(新能源汽车电池管理系统)

引言 一文入门BMS&#xff08;电池管理系统&#xff09;_bms电池管理-CSDN博客 BMS进阶&#xff08;Type-C、PD快充、充电IC、SOC算法、电池管理IC&#xff09;_充电ic asi aso功能-CSDN博客 本文是上面两篇博客的续篇&#xff0c;之前都是讲解一些BMS基本原理&#xff0c;…