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

【Opencv--自适应图像二值化】cv2.adaptiveThreshold()

【Opencv–adaptiveThreshold】自适应阈值图像二值化

文章目录

  • 【Opencv--adaptiveThreshold】自适应阈值图像二值化
    • 1. 介绍
    • 2. adaptiveThreshold函数
      • 2.1 函数调用
      • 2.2 补充说明
    • 3. 代码示例
    • 4. 效果
      • 4.1 原图(ori.img)
      • 4.2 处理后
    • 5. 参考

1. 介绍

在这里 cv2.threshold函数 介绍了普通的opencv图像阈值处理函数。但threshold 的图像阈值处理对于某些光照不均的图像,这种全局阈值分割的方法并不能得到好的效果。

图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域和背景区域,仅仅通过固定阈值很难达到理想的分割效果。在图片中的灰度是不均匀的,所以通常情况下图片中不同区域的阈值是不一样的。这样就需要一种方法根据图像不同区域亮度或灰度分布,计算其局部阈值来进行阈值处理。这种方法就是自适应阈值化图像处理,实际上这可以称为局部阈值法,在OpenCV中adaptiveThreshold就是这种方法。

2. adaptiveThreshold函数

2.1 函数调用

import cv2
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
  • 参数说明:

    • src:源图像,8位的灰度图。
    • maxValue:用于指定满足条件的像素设定的灰度值
    • adaptiveMethod:使用的自适应阈值算法,有2种类型ADAPTIVE_THRESH_MEAN_C算法(局部邻域块均值)或ADAPTIVE_THRESH_GAUSSIAN_C(局部邻域块高斯加权和)。
      • ADAPTIVE_THRESH_MEAN_C的计算方法是计算出邻域的平均值再减去第六个参数C的值;
      • ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出邻域的高斯均匀值再减去第六个参数C的值。
      • 处理边界时使用BORDER_REPLICATE | BORDER_ISOLATED模式。
    • thresholdType:阈值类型,只能是THRESH_BINARY或THRESH_BINARY_INV二者之一,具体参考上面“图像阈值处理”的表格
    • blockSize:表示邻域块大小,用来计算区域阈值,一般选择3、5、7……
    • C:表示常数,它是一个从均匀或加权均值提取的常数,通常为正数,但也可以是负数或零
  • 返回值:

    • dst:处理后的图像

2.2 补充说明

  1. 亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小。
  2. 在灰度图像中,灰度值变化明显的区域往往是物体的轮廓,所以将图像分成一小块一小块的去计算阈值往往会得出图像的轮廓。因此函数adaptiveThreshold除了将灰度图像二值化,也可以进行边缘提取。
  3. 之所以能进行边缘提取,是因为当block很小时,如block_size=3 or 5 or 7时,“自适应”的程度很高,即容易出现block里面的像素值都差不多,这样便无法二值化,而只能在边缘等梯度大的地方实现二值化,结果显得它是边缘提取函数。
  4. 当把blockSize设为比较大的值时,如blockSize=21 or 31 or 41时,adaptiveThreshold便是二值化函数
  5. blockSize必须为大于1的奇数(这里解释一下,size为偶数的话,该block的中心点就不确定了,因此为奇数。)
  6. 如果使用平均值方法,平均值mean为180,差值delta为10,maxValue设为255。那么灰度小于170的像素为0,大于等于170的像素为255,如果是反向二值化,灰度小于170的像素为255,大于等于170的像素为0。

3. 代码示例

import cv2img = cv2.imread('ori.jpg', 0)img1 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 3, 5)
cv2.imwrite("new1.jpg", img1)img2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 31, 5)
cv2.imwrite("new1.jpg", img2)

4. 效果

4.1 原图(ori.img)

在这里插入图片描述

4.2 处理后

  • new1.img
    在这里插入图片描述
  • new2.jpg
    在这里插入图片描述

可以看到,

  • 当blockSize小时,轮廓识别效果明显,突出边缘区域。
  • 而blockSize大时,就是一个二值化图像。

5. 参考

【1】https://blog.csdn.net/LaoYuanPython/article/details/108558834

http://www.lryc.cn/news/13245.html

相关文章:

  • 洛谷P8601[蓝桥杯][2013年第四届真题]剪格子
  • 配置alias实现快速生成.gitignore文件
  • MySQL数据库调优————GROUP BY及DISTINCT优化
  • LRU缓存算法
  • @Configuration注解
  • 基于springboot+vue的食疗系统
  • sklearn学习-朴素贝叶斯
  • 分享112个HTML艺术时尚模板,总有一款适合您
  • 用GDB远程调试运行于QEMU的程序
  • 20 堆排序
  • 2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享
  • 分片策略(二)
  • Qt之调色板类QPalette的使用
  • Kotlin 32. Kotlin 多语言支持
  • 【Flutter入门到进阶】Dart进阶篇---DartVM单线程设计原理
  • Dem和NvM(NVRAM Manager)的交集
  • AI神经网络CNN/RNN/DNN/SNN的区别对比
  • 【JavaWeb】一文学会JPA
  • 【安卓逆向】APK修改与反编译回编译
  • 【计组笔记04】计算机组成原理之多模块存储器、Cache高速缓存存储器、Cache地址映射
  • 英语基础-状语的应用
  • 发表论文需要注意的两点(建议收藏)
  • ISTQB-TM-大纲
  • Java SPI 机制详解
  • 腾讯前端经典react面试题(附答案)
  • Go语言基础(十五):垃圾回收机制(三色标记)
  • 一文了解build.gradle配置
  • 【Redis 高级】- 持久化 - RDB
  • SpringSecurity的安全认证的详解说明(附完整代码)
  • 详解制造业业务数据模型