Opencv 基本操作八 不均匀光照下的图像二值化探讨

这篇具有很好参考价值的文章主要介绍了Opencv 基本操作八 不均匀光照下的图像二值化探讨。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在进行图像二值化时总是存在一些明部、暗部的干扰,单一的使用opencv提供的原始二值化方法很难做到预期效果。一般我们都会采用分块二值化(将图像切为多个局部进行二值化)、对比度提升(对值域进行线性或者非线性变换、直方图均衡化)、局部二值化(Bernsen 算法、 Niblack 算法、Sauvola算法、 Chow 和 Kaneko 算法等)的方式进行二值化。这些手段限制了思路的发挥,不一定适用于所有场景。这里对可搜集的二值化方法进行汇总。共统计出4种二值化方法:1、颜色空间转换,2、多次二值化,3、背景光补偿,4、梯度信息补充。本博文介绍了各个方法的案例、核心思想、基本步骤和适用范围,并对算法的扩展改进提出探讨思考。

1、颜色空间转化

1.1 基本实现

rgb影像转灰度图后,在进行二值化时会遗失部分颜色信息,而在某些任务中颜色信息又是进行二值化的必须依赖。如,按照颜色提取图中的特定物体等。
具体案例:https://bbs.csdn.net/topics/390735437?page=1
原始思路:rgb=>gray=>otsu二值化
opencv 光照不均匀,python、C++与C#实践,opencv,计算机视觉,人工智能
新思路:rgb=>hsv=>h通道otsu二值化
opencv 光照不均匀,python、C++与C#实践,opencv,计算机视觉,人工智能
此外,对于hsv颜色空间,还可以对h*v进行二值化,这样子可以提取出图像中颜色显著的部分。

1.2 核心思想

通过转换颜色空间,对明度、亮度、颜色饱和度等信息进行二值化。
基本步骤:
1、进行颜色空间转换,使颜色突出的部分区域在指定通道(明度、亮度、颜色饱和度)上比较突出;(如hsv的h和v通道,lab的l通道)
2、对指定通道进行二值化
适用范围:以颜色显著变换为主的形态分割

1.3 扩展思考

这种颜色空间转换,本质就是换一种数据展现方式,使图像中的目标区域亮度值偏大,然后进行二值化。其不一定局限与单通道信息的二值化,可以多通道信息进行融合然后再进行二值化。例如:将hsv颜色空间中的s*v融合后进行二值化,或者将h(hsv空间)+l(lab空间)等跨颜色空间的组合。

2、多次二值化

2.1 基本实现

对于一些存在亮部和暗部的图像,使用一个二值化阈值进行操作是无法得到理想结果的,需要使用多个阈值进行二值化。

具体案例:https://blog.csdn.net/weixin_55984718/article/details/125769347
执行效果:opencv 光照不均匀,python、C++与C#实践,opencv,计算机视觉,人工智能

2.2 核心思想

进行2次OTSU分别提取出亮部和暗部的二值化阈值,然后根据2个阈值进行逐像素的二值化。
基本步骤:
1、基于OTSU得到二值化阈值t1和mask ;
2、获取mask中暗部的二值化阈值t2 ;
3、针对亮部和暗部区域分别使用不同的阈值 ;(足像素进行二值化)

适用范围:存在一个阴影或者亮部干扰的图像

2.3 扩展思考

多次二值化一定是只能进行两次二值化么【对暗部和亮部单独进行二值化么】?就比如上述2.1图中的‘38度泸州陈’这几个字就没有能很好的二值化。在算法研究实现中,或许可以使用迭代的思想,对亮部和暗部分别再此进行二值化得到亮部_亮部、亮部_暗部、暗部_亮部、暗部_暗部,然后再去得到二值化结果。

3、背景光补偿法

3.1 基本实现

在对书籍文本进行二值化化时,通常由于反光、数据表面不平使原始图像上存在亮斑和暗斑,这使得单一二值化阈值不再适用。

具体案例:https://blog.csdn.net/u013162930/article/details/47755363
执行效果:原图和求出的背景光补偿图
opencv 光照不均匀,python、C++与C#实践,opencv,计算机视觉,人工智能

3.2 核心思想

通过邻域确定背景光补偿值,最终使图像的光照处于一个统一稳定的的水平,然后再进行二值化
基本步骤:
1、逐像素计算其邻域的最大值,作为背景值,然后计算出背景光补偿值
2、根据背景光补偿图对原图光照进行补偿,使图像的光照处于一个统一稳定的的水平
3、对图像进行otsu二值化
像数值和领域锚值差异小,补偿值接近0;原图过亮,补偿值为负数;原图过暗,补偿值为正数

适用范围:其计算背景光的方式使其仅能用于文本的二值化,若能从全局角度计算出背景光补偿值,则可以用于其他复杂场景

3.3 扩展思考

该方法的核心思路就是计算出背景光补偿值,严重依赖领域区域大小的设置,且通过光照补偿会降低原先的差异度。故此,计算出背景光补偿值不一定可取,其效果或许不如章节2中的多次二值化。

注1:还有另外一种背景光补偿法,其基于全局均值(锚值)和局部均值(当前值)做差得到补偿值 可以参考 https://harry.blog.csdn.net/article/details/54019994
注2:该方法作者提到了sauvola二值算法,其实现在https://blog.csdn.net/lcalqf/article/details/71479650

sauvola二值算法的使用效果可以参考,比起章节二中的多次二值化是要好一些
http://www.zhihuishi.com/source/248.html#download
opencv 光照不均匀,python、C++与C#实践,opencv,计算机视觉,人工智能

4、梯度信息补充

4.1 基本实现

在某些光照环境下,亮与暗为一个基于对比的相对关系,某些像数值在亮部区域算暗,而在暗部区域算亮。
opencv 光照不均匀,python、C++与C#实践,opencv,计算机视觉,人工智能
例如上图,若适用单一阈值进行处理则会得到以下结果:
opencv 光照不均匀,python、C++与C#实践,opencv,计算机视觉,人工智能
具体案例:https://blog.woyou.cool/post/%e4%b8%8d%e5%9d%87%e5%8c%80%e5%85%89%e7%85%a7%e4%b8%8b%e7%9a%84%e5%9b%be%e5%83%8f%e4%ba%8c%e5%80%bc%e5%8c%96%e5%a4%84%e7%90%86%e6%96%b9%e6%a1%88/

4.2 核心思想

通过边缘梯度信息对二值化结果再次进行分割判断
基本步骤:
1、先求出原图的边缘梯度信息(包含xy方向)
2、对原图进行二值化
3、使用边缘梯度信息分割二值图
4、根据均值选择连通域

适用范围:其基于梯度信息对二值化结果进行优化,只能用于提取面积较大的图形(对于字符的提取是不行的)

4.3 扩展思考

利用边缘梯度确实再一定程度上弥补了单像素二值化对全局信息的缺失,通过对该角度的思考,我们或许可以将边缘梯度信息扩展为区域信息(将边缘扩展为连通域,使用连通域的均值对区域内原先的像素值进行调整,类似于背景光补偿法)。文章来源地址https://www.toymoban.com/news/detail-574151.html

到了这里,关于Opencv 基本操作八 不均匀光照下的图像二值化探讨的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv学习(一)图像的基本操作

    cv2.IMREAD_COLOR:彩色图像 cv2.IMREAD_GRAYSCALE:灰度图像 cv2.imread()读取图片,当括号里面是 1 时,也就是替代了cv2.IMREAD_COLOR,得到 彩色图 。 cv2.imread()读取图片,当括号里面是 0 时,替代了cv2.IMREAD_GRAYSCALE,得到 灰度图 。 cv.inshow()函数为创建一个展示窗口,括号里面分别为 图片名字

    2024年02月05日
    浏览(34)
  • C# 使用OpenCV基本图像操作功能

    OpenCV是一个开源的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。C#在上位机开发中比较常用,有些项目需要在上位机上加入一些机器视觉相关的功能,在下面简单介绍了C#中使用OpenCV库的方法。 在管理NuGet包中,搜索OpenCvSharp4,安装

    2024年02月15日
    浏览(34)
  • Python Opencv实践 - 基本图像IO操作

       

    2024年02月14日
    浏览(38)
  • OpenCV基本图像处理操作(十)——图像特征harris角点

    角点 角点是图像中的一个特征点,指的是两条边缘交叉的点,这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中,角点是重要的特征,因为它们通常是图像中信息丰富的区域,可以用于图像分析、对象识别、3D建模等多种应用。 角点的识别可以帮助在进

    2024年04月23日
    浏览(33)
  • opencv 图像和视频处理的基本操作(python)

    原图:   1 图片的获取 主要通过cv2.imread(src)函数进行获取 2 图片的显示 3 ROI区域(图片截取) 4 图片的RGB通道划分 注意cv2.imread()获取的图片通过顺序为BGR,而非RGB,即B为0,G为1,R为2  保留R通道  保留G通道   保留B通道   5 RGB通道合成   6 边界填充 主要是通过cv2.copyMakeBo

    2023年04月21日
    浏览(38)
  • python学习-->opencv图像基本操作学习之灰度图转换

    好久没更新,趁今天要做核酸回不了宿舍,把今天的学习的opencv知识先记录一下! 运行环境是:pycharm 话不多说,献上代码再说: 首先我们先读取我们的图片进来! 跟着我们先尝试一下在打开我们的图片看看! 下面是实现的代码! 运行之后我的图片是这样的 我们可以看看图

    2024年02月08日
    浏览(38)
  • OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)

    访问像素值并修改 访问图像属性 设置感兴趣区域(ROI) 分割和合并图像 5.1 访问像素值并修改 访问像素值 修改像素值 简单访问每个像素值并修改比较缓慢,一般不使用。 Numpy数组方法 array.item() 和 array.itemset() 被认为更好,但是它们始终返回标量。 更好的像素访问和编辑方

    2024年02月06日
    浏览(35)
  • 【OpenCV实现鼠标绘图,轨迹栏做调色板,图像的基本操作】

    在OpenCV中操作鼠标事件 函数:cv.setMouseCallback() 目的是在鼠标双击的地方画一个圆。首先,我们需要创建一个鼠标回调函数,该函数会在鼠标事件发生时执行。鼠标事件包括左键按下、左键松开、左键双击等等。通过获取每个鼠标事件的坐标(x, y),我们就能实现画圆的功能。

    2024年02月05日
    浏览(37)
  • Python 基于 OpenCV 视觉图像处理实战 之 图像相关的基本概念,以及图像的基础操作 一

    目录 Python 基于 OpenCV 视觉图像处理实战 之 图像相关的基本概念,以及图像的基础操作 一 一、简单介绍 二、图像相关的一些基本概念 1、像素 2、图像的构成 3、图像的格式 4、图像的位深和通道 三、OpenCV 的一些基本图像处理函数介绍 1、读取一幅画图像 2、显示图像 3、输出

    2024年04月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包