目录

一、边界填充(Border Padding)

1. 常见填充类型及效果

2.代码示例

(1)constant边界填充,填充指定宽度的像素

(2)REFLECT镜像边界填充

(3)REFLECT_101镜像边界填充改进

(4) REPLICATE使用最边界的像素值代替

 (5)WRAP上下左右边依次替换

二、阈值处理

1. 常见阈值类型

2. 代码示例

3.结果分析与参数调整技巧


在 OpenCV 图像处理中,边界填充和阈值处理是基础且常用的操作。边界填充用于扩展图像边缘,阈值处理则通过设定阈值将图像转化为二值图像,便于后续分析。下面详细介绍这两项技术。

一、边界填充(Border Padding)

边界填充指在图像边缘添加像素,常用于卷积操作、图像拼接等场景,避免边缘信息丢失。OpenCV 通过cv2.copyMakeBorder()实现,语法如下:

cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value)
  • src:输入图像
  • top/bottom/left/right:上下左右填充的像素数
  • borderType:填充类型(核心参数)
  • value:当borderType=cv2.BORDER_CONSTANT时的填充值

1. 常见填充类型及效果

2.代码示例

(1)constant边界填充,填充指定宽度的像素


import cv2ys = cv2.imread('a.png')  # 读取原图,每个边界填充都需要在原图的基础上完成,所以在使用时要先读取原图,把原图作为参数传入下面的方法中
ys = cv2.resize(ys,(300,300))  # 图片缩放
top, bottom, left, right = 50, 50, 50, 50
constant = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(229, 25, 80))
cv2.imshow('yuantu', ys)
cv2.waitKey(0)
cv2.imshow('CONSTANT', constant)
cv2.waitKey(0)

运行效果如下:

    (2)REFLECT镜像边界填充

    原图代码与上述相同不再展示,只展示变化部分

    reflect = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
    cv2.imshow('REFLECT', reflect)
    cv2.waitKey(0)

    运行效果:

    (3)REFLECT_101镜像边界填充改进

    reflect101 = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
    cv2.imshow('REFLECT_101', reflect101)
    cv2.waitKey(0)

    效果:

    (4) REPLICATE使用最边界的像素值代替

    replicate = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
    cv2.imshow('REPLICATE', replicate)
    cv2.waitKey(0)

    效果:

     (5)WRAP上下左右边依次替换

    wrap = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
    cv2.imshow('WRAP', wrap)
    cv2.waitKey(0)

    效果:

    边界填充是 OpenCV 图像处理中的基础操作,掌握不同填充方式的特点和适用场景,有助于提升后续图像处理(如卷积、特征提取)的效果。本文介绍的 5 种填充方式各有优劣,实际使用时需结合具体业务场景灵活选择。

    二、阈值处理

    阈值处理是将灰度图像转化为二值图像的过程:通过设定阈值thresh,将像素值大于thresh的设为一个值(如 255),小于的设为另一个值(如 0)。OpenCV 中cv2.threshold()是核心函数:

    ret, dst = cv2.threshold(src, thresh, maxval, type)
    • src:输入图像(需为单通道灰度图)
    • thresh:阈值(如 127)
    • maxval:最大值(当像素超过阈值时赋予的值)
    • type:阈值类型(核心参数)
    • ret:返回的阈值(与输入 thresh 一致)
    • dst:处理后的图像

    1. 常见阈值类型

    图像通道及表示知识补充:

    一张灰色图片上有许许多多的像素块,每个像素块都有一个数值,这个数值的取值范围时[0 ~ 255],数值越小颜色越暗越黑,数值越大颜色越亮表现为越白。

    彩色图片则有三个通道RGB,针对每一个通道都有一个对应的值,以上面介绍边界填充的value为例,value=(229,25,80),需要注意,在opencv中通道的顺序为BGR,也就是B=229,G=25,R=80.分别是英文的缩写,蓝色(blue)绿色(green)红色(red).

    上面的阈值也是指一个在0~255之间的值。

    2. 代码示例

    1.二进制阈值处理

    import cv2# 读取图像并调整大小
    img = cv2.imread('a.png')
    img = cv2.resize(img, (400, 400))# 二进制阈值处理: 像素值 > 175 设为255,否则设为0
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_BINARY)# 显示原图和处理结果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('binary', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    效果如下:

    2.反二进制阈值处理

    import cv2# 读取图像并调整大小
    img = cv2.imread('a.png')
    img = cv2.resize(img, (400, 400))# 反二进制阈值处理: 像素值 > 175 设为0,否则设为255
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_BINARY_INV)# 显示原图和处理结果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('binary_inv', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果如下:

    3.零阈值处理

    import cv2# 读取图像并调整大小
    img = cv2.imread('a.png')
    img = cv2.resize(img, (400, 400))# 零阈值处理: 像素值 > 175 保持原值,否则设为0
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TOZERO)# 显示原图和处理结果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('tozero', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    效果如下:

    4.反零阈值处理

    
    import cv2# 读取图像并调整大小
    img = cv2.imread('a.png')
    img = cv2.resize(img, (400, 400))# 反零阈值处理: 像素值 > 175 设为0,否则保持原值
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TOZERO_INV)# 显示原图和处理结果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('tozero_inv', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果如下:

    5.截断阈值处理

    import cv2# 读取图像并调整大小
    img = cv2.imread('input.png')
    img = cv2.resize(img, (400, 400))# 截断阈值处理: 像素值 > 175 设为175,否则保持原值
    ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TRUNC)# 显示原图和处理结果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.imshow('trunc', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果如下:

    3.结果分析与参数调整技巧

    1. 阈值选择的影响

      • 阈值过高(如 180):可能丢失目标细节,暗区域过大
      • 阈值过低(如 50):可能保留过多噪声,目标与背景混淆
      • 建议:通过观察图像直方图(cv2.calcHist())确定合适阈值
    2. 彩色图 vs 灰度图

      • 直接对彩色图处理时,阈值会分别作用于 B、G、R 三个通道,可能导致颜色失真
      • 推荐先转为灰度图(cv2.COLOR_BGR2GRAY),再进行阈值处理,效果更稳定

         3.适用场景总结

    阈值处理是图像处理中的基础工具,掌握 5 种常用阈值类型的特点和适用场景,能帮助我们快速简化图像、突出目标。实际应用中,需根据图像特点(如光照、对比度)选择合适的阈值类型和参数,必要时结合自适应阈值提升效果。

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

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

    相关文章

    Leetcode 15 java

    今天复习一下翻转二叉树 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2…

    嵌入式学习的第四十九天-时钟+EPIT+GPT定时器

    一、时钟1.时钟系统基本概念(1)PLL (锁相环, Phase-Locked Loop)作用:PLL是一种反馈控制电路,用于生成稳定的高频时钟信号。它通过将输出时钟与参考时钟进行比较和调整,可以产生比输入参考时钟频率高得多的输出时钟。倍…

    Python Sqlalchemy数据库连接

    Python Sqlalchemy数据库连接一、连接数据二、模型三、ORM操作一、连接数据 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 1. 连接数据库 dbHost postgres://用户名:密码主机:端口/数据库名 engine create_engine(dbHost) # create_engi…

    【Node.js】ECMAScript标准 以及 npm安装

    目录 一、 ECMAScript标准 - 默认导出和导入 二、ECMAScript标准 - 命名导出和导入 三、包的概念 五、 npm - 安装所有依赖 六、 npm - 全局软件包 Node.js总结 总结不易~ 本章节对我有很大的收获, 希望对你也是!!! 本节素材…

    NPM 、 NPX

    NPM vs. NPX 简单来说,npm 是一个 node 包管理器,npx 是一个 Node 包执行器。 NPX 是一个 Node 包执行器,该 Node 包可以是本地也可以是远程的。允许开发者在无需安装的情况下执行任意 Node 包。npm 在安装nodejs 就自动带了 npm install -g …

    守护品质安全,防伪溯源系统打造全链路信任体系

    一、引言在当下这个信息透明、品质至上的时代,防伪溯源已经成为众多品牌保护自身利益、提升消费者信任度的重要手段。为了满足市场上对高效、可靠的防伪溯源查询系统的迫切需求,榕壹云精心打造了一款防伪溯源查询系统。二、项目背景随着商品市场的不断扩…

    【完整源码+数据集+部署教程】无人机航拍视角洪水检测与受灾房屋识别图像分割救援指导系统源码和数据集:改进yolo11-DCNV2

    背景意义 研究背景与意义 随着全球气候变化的加剧,极端天气事件的频率和强度不断上升,洪水作为一种常见的自然灾害,给人类社会带来了严重的威胁。洪水不仅导致人员伤亡和财产损失,还对基础设施和生态环境造成了深远的影响。因此&a…

    C# 结构体与类的区别是什么?

    结构体是值类型是储存在栈中独立储存的,数据与数据之间不会相互影响,即使将一个结构体赋值给另外一个结构体也不会相互影响。 类是一个模板,实例出来的对象是独立的不会相互影响,但是将一个对象赋值给另一个对象时 会把指向堆内存中数据的指针赋值给另一个对象.从而发生两个变量…

    Redis GEO

    Redis GEO 引言 Redis 是一款高性能的键值存储系统,广泛应用于缓存、消息队列等领域。Redis GEO 是 Redis 2.4 版本后新增的一个功能,用于存储地理位置信息。本文将详细介绍 Redis GEO 的概念、使用方法以及应用场景。 什么是 Redis GEO? Redis GEO 是 Redis 的一个模块…

    Go从入门到精通系列学习路线规划

    Go从入门到精通系列学习路线规划 目录导航 Go从入门到精通系列学习路线规划首页说明 第1篇_Go语言初探_环境搭建与HelloWorld 第2篇_Go语言基础语法_变量常量与数据类型 第3篇_Go语言控制结构_条件判断与循环 第4篇_Go语言函数详解 第5篇_Go语言数据结构详解 第6篇_Go语言结构体…

    Grid系统概述

    目录 概念及功能 网格对象(Grid Object) 和世界对象(World Object) 工作流程 概念及功能 TrinityCore 的 Grid 系统是一套复杂的地图分区管理机制,其核心目标是通过动态管控游戏世界的区域状态和对象生命周期&#…

    一文搞懂LLM大模型!LLM从入门到精通万字长文(2024.12月最新)

    LLM从入门到精通精品文章 目录 一、LLM基本概念 二、LLM发展历程 三、LLM大模型的分类 四、LLM主流大模型类别 五、LLM大模型建立的流程 六、Fine-Tuning 七、Prompt-Tuning 八、超大规模参数模型Prompt-Tuning方法 8.1上下文学习 In-Context Learning 8.2.指令学习 …

    Next.js跟React关系(Next.js是基于React库的全栈框架)(文件系统路由、服务端渲染SSR、静态生成SSG、增量静态再生ISR、API路由)

    文章目录**1. React 是基础,Next.js 是扩展****2. Next.js 解决了 React 的哪些痛点?****3. 核心区别****4. Next.js 的核心特性**1. **文件系统路由**2. **服务端渲染(SSR)**3. **静态生成(SSG)**4. **增量…

    Nightingale源码Linux进行跨平台编译

    最近使用Nightingale 需要实现对服务的监测,想要在Windows 系统中使用,看官方文档中并不直接提供执行程序,原文如下: 准备工作 本地环境 本地已经安装git 本地安装git 便于后续下载源码并进行自动编译。 Linux操作系统环境&…

    抽丝剥茧丨PostgreSQL 系国产数据库%SYS CPU newfstatat() high 调优一例(二)

    续接上回《PostgreSQL 系国产数据库%SYS CPU newfstatat() high 调优一例(一)》,这个问题还在持续,并且原因并不只是一个,从调了文件系统级atime,到调整wal size减少日志被动清理,还有在验证tem…

    【新手入门】Android Studio 项目结构拆解,快速理解文件作用!

    目 录 一、【Project】视图下项目结构(真实目录) 二、【Android】视图下项目结构 三、【app/】下重要文件解析 1、 build.gradle 2、AndroidManifest.xml 3、res/ 作为刚刚接触Android开发的小白,使用Android Studio创建项目后&…

    Python实现点云Kmeans、欧式和DBSCAN聚类

    本节我们分享点云处理中的三种常见聚类方法,分别是K-means、欧氏与 DBSCAN聚类。具体介绍如下:1. K-means 聚类定义:一种基于距离度量的无监督学习算法,将数据划分为 K 个紧凑的簇,使簇内数据相似度高、簇间差异大。算…

    【Java后端】MyBatis-Plus 原理解析

    MyBatis-Plus 原理解析 其实 MyBatis-Plus 的 Service 层设计就是为了让开发者不用重复写很多样板代码。我们来一点点剖析 UserServiceImpl、IService、UserService、ServiceImpl 之间的关系和调用链。1. 类/接口关系图IService<T>▲│UserService (接口) <-- 自定义…

    Nacos 注册中心学习笔记

    &#x1f389; Alibaba微服务组件 Nacos 注册中心超详细学习笔记 &#x1f389; &#x1f4cc; 写在前面&#xff1a;本文基于官方PDF文档与实战经验&#xff0c;整理了Nacos注册中心的核心知识点、部署流程与实战技巧&#xff0c;力求图文并茂、通俗易懂&#xff0c;适合收藏反…

    java 策略模式 demo

    策略模式介绍策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来并使它们可相互替换。策略模式让算法的变化独立于使用算法的客户端&#xff0c;从而实现灵活的算法切换。核心角色&#xff1…