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

news/2025/11/19 13:56:29/文章来源:https://www.cnblogs.com/mingupupu/p/19242151

概述

局部二值化(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();}

理解这个方法的参数:

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

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

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

相关文章

linux dns重启

在 Linux 系统中,如果你想要重启 DNS 服务,通常是指重启 named(BIND)、dnsmasq 或 systemd-resolved 等 DNS 服务。以下是几种常见场景下的重启方法:? 1. 重启 named(BIND)服务(适用于 Debian/Ubuntu 系统) …

电流互感器:电力系统中的“智慧之眼”与应用全景

电流互感器通过电磁感应将大电流转换为小电流,实现安全测量与智能控制,广泛应用于电力系统各环节。在庞大而复杂的电力系统中,如何安全、精准地测量高达数十万安培的电流?如何确保从发电厂到千家万户的用电安全?在…

ICPC2025沈阳 游记

准备打星去打铁关了。省流 准备打星去打铁关了。11.16 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 东北挺好的。 赛时 通过看气球颜色法一眼发现 I 题是签,直接丢给俩队友。吃了一罚,真无所谓吧。 随便翻翻…

IT项目管理流程梳理

IT项目管理流程梳理目录IT项目的定义约束条件(范围)干系人IT项目阶段划分Reference下文梳理的都是一般性的IT项目管理流程,涉及对项目阶段的划分,每阶段内所涉及的事项等。IT项目的定义 信息技术(Information Tec…

环境试验设备选购避坑指南:2025年度三大实力厂商深度测评

在航空、航天、新能源、电子等高端制造领域,环境试验设备的可靠性直接决定了产品研发的质量与效率。面对市场上琳琅满目的品牌,如何选择一家技术过硬、服务可靠且性价比高的长期合作伙伴,成为众多工程师与采购负责人…

北京旅行社哪家靠谱?本地口碑机构实力对比

在北京选择旅行社时,许多人会关注服务质量、线路规划及用户口碑。随着旅游市场的多样化发展,本地旅行社在资质、行程安排和售后保障等方面呈现不同特色,了解其核心优势有助于找到适合自己的出行伙伴。 一、北京旅行…

开源无界,能效有解:MyEMS,让每一度能源都被精准掌控

当全球能源局势进入 “紧平衡” 时代,企业面临的不仅是 “用能成本高” 的现实压力,更有 “能耗管理粗放”“数据孤岛严重”“节能潜力难挖掘” 的深层困境 —— 传统闭源能源管理系统要么成本高昂、定制化难,要么功…

2025年沧州爱采购运营公司权威推荐榜单:电商代运营/阿里代运营/短视频运营服务商精选

在数字经济快速发展的背景下,企业对于专业化、数据驱动的网络运营服务需求日益增长。沧州地区作为华北地区重要的产业聚集地,涌现出一批专注于企业网络运营服务的优秀公司。本文结合行业调研数据、服务覆盖范围及客户…

从零使用vue脚手架制作一个简易的计算器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Playwright_API

1. from playwright.sync_api import expectexpect(page.get_by_text("Products")).to_be_visible(), 这样不会报错 2. from playwright.sync_api import expectbutton = page.get_by_role("button&quo…

完整教程:全面解读大型语言模型测评:从认知演进到实操框架

完整教程:全面解读大型语言模型测评:从认知演进到实操框架pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

Redis之String 类型入门与实战,由基础语法快速掌握再到缓存加速/验证码防刷/计数统计场景应用 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

公众号怎么上传附件?使用快存文档支持word,excel,pdf格式。

快存文档(kuaidoc.cn) 在公众文章里上传附件。 这是一个非常实用的功能,特别适合在公众号文章中添加 Word、Excel、PDF 等文档附件。"快存文档"(kuaidoc.cn) 在公众文章里上传附件。 这是一个非常实用的功能…

推荐北京起诉离婚律师:专业团队助力婚姻纠纷妥善处理

北京作为我国首都,人口密集且社会结构多元,婚姻家庭纠纷案件往往涉及复杂的财产关系、情感纠葛及子女抚养问题。在起诉离婚过程中,选择一位专业、经验丰富的律师至关重要,他们不仅能提供法律支持,还能在情感疏导、…

AVLT

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Node {int key;struct Node *left;struct Node *right;int height; } Node;int max(int a, int b) {return (a > b…

推荐东城区婚姻律师:专业团队助力化解婚姻家庭难题

在婚姻家庭关系中,纠纷的产生往往涉及情感、财产、子女等多方面复杂问题,寻求专业律师的帮助成为许多人的选择。东城区作为北京的核心区域,汇聚了不少在婚姻法律服务领域经验丰富的律师团队,他们凭借扎实的专业能力…

一线操作工也能管能耗?MyEMS 的 “傻瓜式仪表盘”,把专业数据变成 “大白话”

在工厂的生产车间里,一线操作工常年与机器设备打交道,他们熟悉每台设备的运行节奏,却很少涉足能耗管理领域。传统认知中,能耗监控是技术部门或能源管理员的“专属工作”——复杂的能耗数据、专业的计量指标、繁琐的…

有哪些北京知名家事律师?专业领域服务解析

在家庭生活中,婚姻、继承等家事纠纷往往涉及复杂的法律关系和情感纠葛,选择一位专业且有经验的家事律师,对于妥善解决问题、维护自身权益至关重要。北京作为法律服务资源集中的城市,涌现出许多在该领域深耕多年的律…

数形结构转换工具类

项目中使用了很多树状结构,为了方便使用开发一个通用的工具类。 使用工具类的时候写一个类基础BaseNode,如果有个性化字段添加到类里面,然后就可以套用工具类。 工具类会将id和pid做关联返回一个树状结构的集合。使…

Topic

TopicTopic模型 话题(Topic)是一种基于发布-订阅模型构建的ROS2 中的通讯机制 通常由发布者(Publisher)和订阅者(Subscriber)组成,两者之间传输一个Topic,在这里是单向的 当然,也可以让两个节点同时成为发布者…