最优二值化
昨天要做一个最优二值化,原QR图如下:
对其做最优二值化,即在其直方图两个灰度波峰之间的的波谷用来做二值化的阈值。也就是下图中所示的小红点。
在连续变量中可以用求导的方式来获得波峰和波谷的位置,但是对于离散变量,要如何求这个小红点的位置捏?
方法一:
可以设计这样一个检测结构
用这个结构对直方图上的灰度1~255进行检测,如果左侧的灰度值高于检测点的灰度值,且右侧的灰度值也高于检测点的灰度值。那么就说明检测点所处的位置就是某一个波谷了。
但是,这样又出现了另一个问题,直方图波形中的毛刺会导致很多“虚波谷”的出现。
所以,在使用上述结构检测之前,要先对直方图波形进行平滑处理。
直方图的平滑处理可以考虑这两种方法。
用插值的方法进行直方图平滑
如果对直方图进行频域滤波会怎样
在例子中,使用的是插值的方法。
插值以后,根据上面的检测结构检测波峰和波谷:
原图:
红色代表检测到的波峰,绿色代表检测到的波谷。
测试另一张图:
测试标准QR图 :
测试增加了灰度渐变的标准QR图:
可以看出用这种方法找到的波峰波谷还是太多,不好寻找我们所希望的阈值T。
方法二:
求导。在已经平滑处理的直方图上,进行求导处理。
定义直方图的某点x的导数为:
由此,可以求得某一直方图的导数图,如图:
可以观察到,在导数图中,两个灰度聚集区中间会有一段导数值为0的较长区域。寻找阈值T将从此处入手。
统计导数图(不包括首尾两端导数值为0的区域)中,0区域的长度,选择其中最长的一段的中点作为阈值的取值点。
效果如下图所示:
但是,在测试这张图的时候阈值的取值出现了很大偏差:
问题出在进行直方图平滑处理时,把右半边的直方图内容给处理掉了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构