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

OpenCv(二)——边界填充、阈值处理

目录

一、边界填充(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.lryc.cn/news/620729.html

    相关文章:

  • Nacos 配置热更新:Spring Boot Bean 自动获取最新配置
  • flutter3.7.12版本设置TextField的contextMenuBuilder的文字颜色
  • MixOne在macOS上安装碰到的问题
  • 解决SQL Server连接失败:Connection refused: connect
  • 苹果正计划大举进军人工智能硬件领域
  • 从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.14
  • 2025 电赛 C 题 发挥3 带数字编号的正方形识别 边长测量
  • [特殊字符]走进华为,解锁商业传奇密码
  • 通过网页调用身份证阅读器http websocket方法-湖南步联科技美萍MP999A电子————仙盟创梦IDE
  • 从根源到生态:Apache Doris 与 StarRocks 的深度对比 —— 论开源基因与长期价值的优越性
  • 审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案
  • 实战指南|消防管理系统搭建全流程解析
  • OpenCV ------图像基础处理(一)
  • 【P81 10-7】OpenCV Python【实战项目】——车辆识别、车流统计(图像/视频加载、图像运算与处理、形态学、轮廓查找、车辆统计及显示)
  • 【OpenCV】Mat详解
  • 入门基础人工智能理论
  • 计算机视觉(opencv)实战二——图像边界扩展cv2.copyMakeBorder()
  • 论,物联网日志系统架构如何设计?
  • AI增强SEO关键词表现
  • Postman 平替 技术解析:架构优势与实战指南
  • 考研408《计算机组成原理》复习笔记,第五章(2)——CPU指令执行过程
  • 使用 Docker 部署 PostgreSQL
  • 考研408《计算机组成原理》复习笔记,第四章(3)——指令集、汇编语言
  • Java设计模式之《策略模式》
  • Effective C++ 条款41:理解隐式接口和编译期多态
  • 应用系统连达梦数据库报“服务器模式不匹配”的根源与修复方案
  • 使用colmap自制3DGaussian_Splatting数据集
  • BotCash:GPT-5发布观察 工程优化的进步,还是技术突破的瓶颈?
  • GoLand 项目从 0 到 1:第八天 ——GORM 命名策略陷阱与 Go 项目启动慢问题攻坚
  • 通过机器学习框架实现Android手写识别输入功能