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

文章目录

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


前言

在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.mfbz.cn/a/394613.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

答题抽奖活动怎么做_一场智慧与幸运的碰撞

答题抽奖,知识变现,一场智慧与幸运的碰撞! 在这个信息爆炸的时代,如何吸引人们的注意力,成为每个营销者都需要面对的挑战。而答题抽奖活动,以其独特的魅力,正成为越来越多品牌吸引用户、提升用…

智能无人仓|加快步伐 河北沃克HEGERLS将突破与创新“常态化”

物流的发展涉及工业、商业各个领域,涵盖原材料,生产成品从起点到终点的全过程,在室内物流操作上涵盖了收、发、存、拣等作业。近年来,由于人工成本的提高,基础劳动力取得的难度不断地加大,自动化和智能化逐…

pytest 框架自动化测试

随笔记录 目录 1. 安装 2. 安装pytest 相关插件 2.1 准备阶段 2.2 安装 2.3 验证安装成功 3. pytest测试用例的运行方式 3.1 主函数模式 3.1.1 主函数执行指定文件 3.1.2 主函数执行指定模块 3.1.3 主函数执行某个文件中的某个类、方法、函数 3.1.4 主函数执行生…

『运维备忘录』之 SSH 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等知识,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

C++Qt:noteBookPro_01

一、创建项目 选择Qt Widgets 常用的是QWidgets和MainWindow。两者的区别: QWidgets用于简单的窗口,没有内置的菜单栏、工具栏和状态栏。适用于简单专用的应用程序,不需要复杂的界面组件。 MainWindow是包含完整的菜单栏、工具栏和状态栏的主…

入门级10寸加固行业平板—EM-I10J

亿道信息以其坚固耐用的智能终端设备而闻名,近日发布了一款理想入门级 10 英寸加固平板电脑—I10J。 EM-I10J​​ 这是一款 10 英寸的平板电脑,主要运行 Windows 10操作系统,带有硬化塑料外壳,具有 IP65 防水防尘功能和 MIL-STD 8…

unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备

逆向服务器用了三天的时间,但此时觉得一切都值,又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分,上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…

nvm安装配置环境

前言 对于前端开发人员来说,多个项目可能用的不同的node版本,如何方便快速的转换版本,nvm版本管理工具的出现,解决这个问题。 实战 1. 搜索nvm版本,我用的1.1.2,下载后直接安装。 2.在d盘建立nvm空文件…

网络IO模型

前言 本篇博客主要讲解一下网络IO模型。我们常见的网络模型分为 阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO模型,异步IO模型。下面我详细的介绍一下这五个IO模型。 阻塞IO模型 ​ 所谓阻塞IO就是当应用A发起读取数据申请时&…

Nginx 正向代理、反向代理

文章目录 前言1. 正向代理1.1 概念1.2 逻辑图1.3 使用场景 2. 反向代理2.1 概念2.2 逻辑图2.3 使用场景 前言 正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用 1. 正向代理 1.1 概念 正向代理是一个位于客户端和目标服务器之间的代理…

红衣大叔讲AI:从OpenAI发布首个视频大模型Sora,谈2024年视觉大模型的十大趋势

OpenAI宣布推出全新的生成式人工智能模型“Sora”。据了解,通过文本指令,Sora可以直接输出长达60秒的视频,并且包含高度细致的背景、复杂的多角度镜头,以及富有情感的多个角色。 OpenAI发布首个视频大模型Sora,一句话生…

CSS-布局-MDN文档学习笔记

CSS布局 查看更多学习笔记:GitHub:LoveEmiliaForever MDN中文官网 介绍CSS布局 正常布局流简介 正常布局流是指在不对页面进行任何布局控制时,浏览器默认的 HTML 布局方式 当你使用 css 创建一个布局时,你正在离开正常布局流 …

引入成熟的Pytest自动化测试框架

虽然我们能使用脚本编写自动化测试框架,但没有必要重复找车轮子,引入成熟的自动化测试框架即可, Pytest是目前最成熟、功能最全面的Python测试框架之一,简单灵活、易于上手,可完全兼容其他测试框架如unitest&#xff…

简单介绍数据结构的基本概念

数据结构的基本概念 常用术语 数据 数据(Data)是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。例如:整数、字符串、图形、图像、声音和动画等 数据元素 数据元素(Data Element&…

Harbor上传镜像报错413

错误截图 问题分析 Harbor前置nginx上传允许限制 解决方案 1.如果使用的是nginx则添加配置 client_max_body_size 0; (0表示无限制) 2.如果使用的是nginx-ingress则添加更改配置 ...annotations:nginx.ingress.kubernetes.io/force-ssl-redirect: &q…

Unity ScreenPointToRay 获取到的坐标不准确

👾奇奇怪怪的 🥙问题描述🥪解决方案🍿验证代码 🥙问题描述 使用:Camera.main.ScreenPointToRay 将鼠标坐标转换成射线,然后通过:Physics.Raycast 获取到射线碰撞到的坐标&#xff0…

【漏洞复现-通达OA】通达OA report_bi存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力,包括流程审批、行政办公、日常事务、数据统计…

【问题】pycharm无法添加conda环境,没有反应!

① 问题描述 pycharm版本:pycharm-community-2023.3.3 在conda中已经创建了虚拟环境Python38,想要在pycharm中设置添加Python编译器,想使用conda的环境。但是,怎么都没有反应。 ② 解决方法 可以选择系统解释器,然后选中conda虚拟环境envs中的Python.exe作为系统解释器…

【数据仓库】主题域和数据域

数据域与主题域区别 https://www.cnblogs.com/datadance/p/16898254.html 数据域是自下而上,以业务数据视角来划分数据,一般进行完业务系统数据调研之后就可以进行数据域的划分。针对公共明细层(DWD)进行主题划分。主题域则自上而…

我的NPI项目之Android Camera (二) -- 核心部件之 Camera Sensor

说到Camera模组,我们比较关心的是用的什么样的sensor? sensor的分辨率多少,sensor的像素多大,sensor是哪家生产的等等一些问题。今天,我们就穿越时间,将sensor的历史扒一扒。 Wikipedia先看一下&#xff1…