当前位置: 首页 > news >正文

OpenCV边界填充方法详解

文章目录

  • 引言
  • 一、为什么需要边界填充?
  • 二、OpenCV中的边界填充类型
    • 1. 常数填充 (cv2.BORDER_CONSTANT)
    • 2. 反射填充 (cv2.BORDER_REFLECT)
    • 3. 反射101填充 (cv2.BORDER_REFLECT_101)
    • 4. 边缘复制填充 (cv2.BORDER_REPLICATE)
    • 5. 包裹填充 (cv2.BORDER_WRAP)
  • 三、性能比较与选择建议
  • 结论

引言

在图像处理中,边界填充(Border Padding)是一个基础但至关重要的技术。当我们进行卷积操作、图像滤波或几何变换时,经常需要处理图像边界外的像素值。OpenCV提供了多种边界填充方法,每种方法都有其特定的应用场景。本文将详细介绍OpenCV中的各种边界填充技术及其实现方式。

一、为什么需要边界填充?

在进行图像处理操作时,特别是卷积类操作(如滤波、边缘检测等),内核(kernel)需要访问目标像素周围邻域的像素值。当内核位于图像边缘时,部分邻域会超出图像边界。边界填充就是用来解决这个问题的,它决定了如何处理这些"不存在的"像素值。

二、OpenCV中的边界填充类型

OpenCV通过cv2.copyMakeBorder(src, top, bottom, left, right,borderType)函数提供多种边界填充方式,它有以下几个参数:

  • src:要扩充边界的原始图像。
  • top,bottom,left,right:相应方向上的边框宽度。
  • borderType:定义要添加边框的类型,它可以是以下的一种

以下是主要的填充类型:

1. 常数填充 (cv2.BORDER_CONSTANT)

import cv2
a = cv2.imread('zhaoyun.jpg')
top,bottom,left,right = 50,50,50,50
cv2.imshow('yuantu',a)

‘’‘----------------常数填充--------------------------’‘’
contant = cv2.copyMakeBorder(a,top,bottom,left,right,
			borderType=cv2.BORDER_CONSTANT,value=(255,0,0))
  • value=(255,0,0):根据BGR格式得到一个蓝色边框
  • 图中我们给的图片是一张赵云的图片,下图所示是原图与常数填充的图片对比:

在这里插入图片描述 -

  • 特点:使用指定的常数值填充边界。
  • 应用场景:需要明显区分填充区域和实际图像时;图像分类任务中保持输入尺寸一致。

2. 反射填充 (cv2.BORDER_REFLECT)

import cv2
a = cv2.imread('zhaoyun.jpg')
top,bottom,left,right = 50,50,50,50
cv2.imshow('yuantu',a)

‘’‘----------------反射填充--------------------------’‘’
reflect = cv2.copyMakeBorder(a,top,bottom,left,right,
			borderType=cv2.BORDER_REFLECT)
  • 下图是原图与经过反射填充后的图片对比,可以发现反射经过填充后的图片四周都进行了对称。

在这里插入图片描述

  • 特点:以图像边缘为轴进行镜像反射填充。
  • 应用场景:需要保持图像内容连续性的操作,如傅里叶变换。

3. 反射101填充 (cv2.BORDER_REFLECT_101)

import cv2
a = cv2.imread('zhaoyun.jpg')

top,bottom,left,right = 50,50,50,50
cv2.imshow('yuantu',a)

reflect101 = cv2.copyMakeBorder(a,top,bottom,left,right,
				borderType=cv2.BORDER_REFLECT101)
  • cv2.BORDER_REFLECT_101 :和上面类型一样,但是有一些细微的不同,类似于gfedcb | abcdefg | gfedcba(交换出删除了)
  • 效果如下:
    在这里插入图片描述
  • 特点:与BORDER_REFLECT类似,但不重复边缘像素。
  • 应用场景:需要更自然过渡的反射填充时。

4. 边缘复制填充 (cv2.BORDER_REPLICATE)

import cv2
a = cv2.imread('zhaoyun.jpg')

top,bottom,left,right = 50,50,50,50
cv2.imshow('yuantu',a)

replicate = cv2.copyMakeBorder(a,top,bottom,left,right,
				borderType=cv2.BORDER_REPLICATE)
  • cv2.BORDER_REPLICATE:使用最边界的像素值代替,类似于aaaaaa | abcdefgh | hhhhhhh
  • 效果如下:
    在这里插入图片描述
  • 特点:复制图像最边缘的像素值来填充。
  • 应用场景:当图像边缘内容相对平滑时;简单快速的填充需求。

5. 包裹填充 (cv2.BORDER_WRAP)

import cv2
a = cv2.imread('zhaoyun.jpg')

top,bottom,left,right = 50,50,50,50
cv2.imshow('yuantu',a)

wrap = cv2.copyMakeBorder(a,top,bottom,left,right,
			borderType=cv2.BORDER_WRAP)
  • cv2.BORDER_WRAP: 上下左右边依次替换,cdefgh | abcdefgh | abcdefg
  • 运行效果如下:

在这里插入图片描述

  • 特点:像平铺图像一样进行填充。
  • 应用场景:周期性图像处理;纹理分析。

三、性能比较与选择建议

  • 1.速度:BORDER_REPLICATE最快,BORDER_CONSTANT次之,反射类稍慢

  • 2.效果:
    * 对于视觉上自然的扩展:BORDER_REFLECT_101
    * 对于需要明显区分填充区域:BORDER_CONSTANT
    * 对于周期性内容:BORDER_WRAP

  • 3.默认选择:当不确定时,使用BORDER_DEFAULT(即BORDER_REFLECT_101)

结论

边界填充是图像处理中不可或缺的技术,OpenCV提供了多种填充方式以适应不同场景。理解各种填充类型的特点和适用场景,能够帮助我们在实际应用中做出更合适的选择,从而提高图像处理的质量和效果。

http://www.dtcms.com/a/106680.html

相关文章:

  • Python入门(6):面向对象编程(OOP)
  • Smith Chart阻抗匹配
  • elasticsearch 7.17 索引模板
  • 一段式端到端自动驾驶:UniAD:Planning-oriented Autonomous Driving
  • python函数装饰器
  • (linux操作系统)环境变量
  • 【NS3-如何在NS3中模拟每个节点的本地时钟?
  • 自动获取屏幕尺寸信息的html文件
  • [图文]directed不是direct-《分析模式》漫谈50
  • 算法刷题记录——LeetCode篇(3.10) [第291~300题](持续更新)
  • 【Java中级】10章、内部类、局部内部类、匿名内部类、成员内部类、静态内部类的基本语法和细节讲解配套例题巩固理解【5】
  • 《AI大模型应知应会100篇》第7篇:Prompt Engineering基础:如何与大模型有效沟通
  • SAP BDC应用1-批量处理财务三大报表
  • Java 代理模式 详解
  • 4.2学习总结
  • Vue与React区别分析
  • 机器学习开发全流程详解:从数据到部署的完整指南
  • el-dialog实现遮罩层后面的内容也能点击
  • SqlServer整库迁移至Oracle
  • 鹧鸪云光伏仿真软件场外设计功能:构建系统级工程闭环
  • time.sleep(10)和 async 区别
  • 通信算法之251: 时频图谱spectrogram(如短时傅里叶变换STFT)
  • 数据结构——队列的实现
  • LeetCode算法题(Go语言实现)_26
  • LLM大模型之精度问题(FP16,FP32,BF16)详解与实践
  • Mapreduce的使用
  • 深入理解归并排序:分治艺术的经典实践
  • 【AI产品分享】面向图片的原始位置翻译功能
  • Redisson中BitMap位图的基本操作
  • CORS与OPTIONS请求