尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

OpenCVSharp:使用三种不同的局部二值化算法

OpenCVSharp:使用三种不同的局部二值化算法
📅 发布时间:2026/6/19 14:23:45

概述

局部二值化(Local Binarization)是一种图像处理技术,用于将灰度图像转换为二值图像(黑白图像)。与全局二值化不同,局部二值化不是对整个图像使用单一阈值,而是根据图像中每个像素周围的局部区域特征来动态确定阈值。

局部二值化的基本思想是:对于图像中的每个像素,计算其邻域窗口内的统计特征(如均值、标准差等),然后基于这些局部统计信息计算该像素的阈值。

在OpenCV中已经封装了Niblack算法、Sauvola 算法与Nick 算法,本示例的流程图如下所示:

效果:

Niblack 算法

T(x,y) = m(x,y) + k × σ(x,y)

T(x,y): 像素(x,y)的阈值

m(x,y): 局部窗口内的均值

σ(x,y): 局部窗口内的标准差

k: 经验参数,通常为负值(-0.2 到 -0.1)

Sauvola 算法

T(x,y) = m(x,y) × [1 + k × (σ(x,y)/R - 1)]

R: 动态范围,通常设为128(8位灰度图像的标准差最大值)

k: 经验参数,通常为正值(0.1 到 0.5)

Nick 算法

T(x,y) = m(x,y) + k × σ(x,y)

表面公式与 Niblack 相同,但实现方式和参数范围不同

k: 通常为负值(-0.1 到 -0.2)

在实际应用中,Sauvola 通常是第一个应该尝试的算法。如果发现它在处理特定数据集(尤其是噪声或对比度问题严重)时效果不佳,再考虑切换到 Nick 算法,并投入时间调整其参数,Niblack算法现在主要用于初学者入门学习。

我们现在不是来研究算法的,主要目的是在实际项目中使用的,主要是看如何具体使用这些算法。

实践

在OpenCVSharp中使用这三个算法很方便:

 // Niblack 算法sw.Start();CvXImgProc.NiblackThreshold(src, niblack, 255, ThresholdTypes.Binary, kernelSize, -0.2, LocalBinarizationMethods.Niblack);sw.Stop();NiblackTime = $"Niblack算法耗时: {sw.ElapsedMilliseconds} 毫秒";NiblackImage = ConvertMatToBitmapImage(niblack);// Sauvola 算法sw.Restart();CvXImgProc.NiblackThreshold(src, sauvola, 255, ThresholdTypes.Binary, kernelSize, 0.1, LocalBinarizationMethods.Sauvola);sw.Stop();SauvolaTime = $"Sauvola算法耗时: {sw.ElapsedMilliseconds} 毫秒";SauvolaImage = ConvertMatToBitmapImage(sauvola);// Nick 算法sw.Restart();CvXImgProc.NiblackThreshold(src, nick, 255, ThresholdTypes.Binary, kernelSize, -0.14, LocalBinarizationMethods.Nick);sw.Stop();NickTime = $"Nick算法耗时: {sw.ElapsedMilliseconds} 毫秒";NickImage = ConvertMatToBitmapImage(nick);

都是使用CvXImgProc.NiblackThreshold()方法,只是参数略有不同而已。

NiblackThreshold 是一种自适应阈值化方法,它根据图像局部区域的统计特性来计算每个像素的阈值。与全局阈值化不同,这种方法能够更好地处理光照不均匀的图像。

 public static void NiblackThreshold(InputArray src,OutputArray dst,double maxValue,ThresholdTypes type,int blockSize,double k,LocalBinarizationMethods binarizationMethod = LocalBinarizationMethods.Niblack,double r = 128){if (src is null)throw new ArgumentNullException(nameof(src));if (dst is null)throw new ArgumentNullException(nameof(dst));src.ThrowIfDisposed();dst.ThrowIfNotReady();NativeMethods.HandleException(NativeMethods.ximgproc_niBlackThreshold(src.CvPtr, dst.CvPtr, maxValue, (int)type, blockSize, k, (int)binarizationMethod, r));GC.KeepAlive(src);GC.KeepAlive(dst);dst.Fix();}

理解这个方法的参数:

局部二值化主要用在图像预处理阶段。

相关新闻

  • 电流互感器:电力系统中的“智慧之眼”与应用全景
  • IT项目管理流程梳理
  • 从零使用vue脚手架制作一个简易的计算器

最新新闻

  • 2026年6月头部宠物皮肤科医院推荐,宠物眼科/猫咪体检/异宠/宠物皮肤/宠物骨科/猫咪绝育/宠物,宠物皮肤科专家找哪家 - 品牌推荐师
  • 深入解析MPC8360E/MPC8358E处理器接口电气特性与硬件设计实践
  • LLM嵌入技术在表格数据预测中的应用与实践
  • 渗透测试实战:CDN绕过与子域名爆破核心技术解析
  • 5个实用技巧:用FitGirl游戏启动器轻松管理你的压缩版游戏库
  • 沃尔玛成钓鱼攻击首选目标:高仿真品牌钓鱼的攻防解析与防范指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号