前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明显的明暗不同的区域,如下图

可以看到左边部分因为整体偏暗,导致二值化后变成全黑,丢失了所有细节,这显然不是我们想要的结果。

原因threshold函数使用一个阈值对图像进行二值化,导致小于这个阈值的像素点全都变成0。因此使用一个阈值的二值化方法并不适用于上面的这张图。那怎么搞?

很明显,上面这张图只有左右两个区域明显亮度不同,最简单的方法就是把图分成两个区域,每个区域分别进行二值化,也就是说二值化上面这张图需要两个不同的阈值。那如果亮度不同的地方有三个,四个或者更多呢?那就每个区域用一个阈值来进行二值化。按照这个思想,因此有了cv2.adaptiveThreshold函数。

先看一下adaptiveThreshold二值化的使用效果。

明显还是有效果的,至少左边部分不是全黑。

接下来简单说一下adaptiveThreshold方法

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)

这个函数大致意思就是把图片每个像素点作为中心取N*N的区域,然后计算这个区域的阈值,来决定这个像素点变0还是变255

src:需要进行二值化的一张灰度图像

maxValue:满足条件的像素点需要设置的灰度值。(将要设置的灰度值)

adaptiveMethod:自适应阈值算法。可选ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C

thresholdType:opencv提供的二值化方法,只能THRESH_BINARY或者THRESH_BINARY_INV

blockSize:要分成的区域大小,上面的N值,一般取奇数

C:常数,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数

dst:输出图像,可以忽略

前两个参数与threshold的src和maxval一样相同

第三个参数adaptiveMethod

提供两种不同的计算阈值的方法,按照网上其他大佬的解释

ADAPTIVE_THRESH_MEAN_C,为局部邻域块的平均值,该算法是先求出块中的均值。

ADAPTIVE_THRESH_GAUSSIAN_C,为局部邻域块的高斯加权和。该算法是在区域中(x, y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算。

第四个参数thresholdType

只能THRESH_BINARY或者THRESH_BINARY_INV

第5个参数blockSize

上述算法计算邻域时的领邻域大小,一般选择为3、5、7......等

第6个参数C

每个邻域计算出阈值后再减去C作为最终阈值

演示一下blockSize和C对二值化结果的影响,以THRESH_BINARY,ADAPTIVE_THRESH_GAUSSIAN_C为例

blockSize=3,C=1

blockSize=25,C=1

blockSize=3,C=10

blockSize=15,C=10

blockSize=15,C=21

blockSize=15,C=1

blockSize=15,C=1

可以看到,当blockSize越大,参与计算阈值的区域也越大,细节轮廓就变得越少,整体轮廓越粗越明显

当C越大,每个像素点的N*N邻域计算出的阈值就越小,中心点大于这个阈值的可能性也就越大,设置成255的概率就越大,整体图像白色像素就越多,反之亦然。

这种二值化有点类似canny边缘检测,用来找轮廓或者特征点也挺不错。

import cv2
import numpy as npblocksize = 3
C=0
def adaptive_demo(gray, blocksize, C):binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blocksize, C)# binary = cv2.GaussianBlur(binary, (15,15), 0)cv2.imshow('binary', binary)def C_changed(value):global grayglobal blocksizeglobal CC = value - 30print('C:', C)adaptive_demo(gray, blocksize, C)def blocksize_changed(value):global grayglobal blocksizeglobal Cblocksize = 2 * value + 1print('blocksize:', blocksize)adaptive_demo(gray, blocksize, C)if __name__ == "__main__":image_path = './img/1.jpg'img = cv2.imread(image_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)adaptive_demo(gray, 3, 0)cv2.createTrackbar('C', 'binary',0, 60, C_changed)cv2.createTrackbar('blocksize', 'binary',1, 20, blocksize_changed)cv2.waitKey(0)

python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)相关推荐

  1. [转载] python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)

    参考链接: python opencv 基础6: cv2.threshold()二值图像 前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明 ...

  2. OpenCV图像二值化,Python

    OpenCV图像二值化,Python 原图: 二值化处理(只有黑和白): import cv2if __name__=="__main__":image = cv2.imread( ...

  3. OpenCV-Python学习(10)—— OpenCV 图像二值化处理(cv.threshold)

    1. 学习目标 理解图像的分类,不同类型的图像的区别: 对图像进行二值化处理,对[ cv.threshold ]函数的理解. 2. 图像分类 2.1 不同类型图像说明 按照颜色对图像进行分类,可以分为 ...

  4. opencv 二值化 python_opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用...

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  5. opencv 二值化 matlab,opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH...

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  6. python3 opencv 基于二值化图像素投影的图片切割方法

    对于一些背景纯色,结构相对简单的图,可以利用传统的opencv图像处理进行分割.先来记录一下基于二值化图像素投影的图片切割方法的实现.比如下面这张图,可以利用这个算法进行切割.(源代码在最后面) 切割 ...

  7. python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例

    python opencv 二值化 计算白色像素点的实例 贴部分代码 #! /usr/bin/env python # -*- coding: utf-8 -*- import cv2 import ...

  8. OpenCV:二值化函数cv2.threshold

    目录 功能作用: (一)简单阈值 (二)自适应阈值: (三)Otsu's二值化 功能作用: 二值化函数作用:图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效 ...

  9. opencv 二值化 python_Python OpenCV 图像二值化-阈值分割

    1.二值化处理 # 手动二值化处理 # 设置阈值大小 threshold thresh = 125 # 设置超过阈值像素值的最大值 maxval = 255 # THRESH_BINARY:超过阈值为 ...

最新文章

  1. 汽车电池包-云100
  2. python算方差_python计算均值方差
  3. Mina集成Spring --- 在配置文件中配置sessionconfig
  4. 关于眼保健操中的轮刮眼眶
  5. java字符集编码是,java字符集与编码有关问题
  6. [Android官方API阅读]___System Permissions
  7. 用PHP控制您的浏览器cache
  8. 【操作系统】输入输出系统(上)-思维导图
  9. [下载] Zend studio 8 Windows版
  10. [转载] python strptime函数转时间数组_python—时间与时间戳之间的转换
  11. junit 生成html报告,gradle – 如何为JUnit 5测试创建HTML报告?
  12. 数据揭示《哪吒之魔童降世》火爆背后的艰辛:66个剧本100次修改,1600人通宵5年...
  13. ps渐变怎么用和渐变工具技巧
  14. 网店系统SHOP++、V5shop、shopex全程分析
  15. Python 文件打开
  16. 上三角矩阵的压缩存储
  17. 第十四章 使用SQL Shell界面(一)
  18. Angular CLI ng常用命令整理
  19. SpringBoot自定义异常,优雅解决业务逻辑中的错误
  20. 新人手册系列:多面手之性能测试

热门文章

  1. 华为OD机试 - 数字游戏(Java JS Python)
  2. win10系统下使用onnxruntime部署yolov5模型
  3. 医疗机器人软件中的机器人安全和隐私保护:挑战和解决方案
  4. 常用的电源防反接电路
  5. java获取当前年月日历_java获取当前年份、月份和日期字符串等
  6. 一天发十万封邮件方法_怎样做到一天赚一万块钱[1]?
  7. 关于打开Unity3d 出现0xc000007b的解决方法
  8. element子组件向父组件传值
  9. 飞天技术汇 | 用混合云,数据灾备原来这么简单
  10. Linux基础之Libcurl库之HTTPS协议实现人脸识别