关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)


Posted in Python onApril 04, 2022

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

关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

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

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

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

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

关于python3 opencv 图像二值化的问题(cv2.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为例

关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)

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

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

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

import cv2
import numpy as np
 
blocksize = 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 gray
    global blocksize
    global C
    C = value - 30
    print('C:', C)
    adaptive_demo(gray, blocksize, C)
def blocksize_changed(value):
    blocksize = 2 * value + 1
    print('blocksize:', blocksize)
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)的文章就介绍到这了,更多相关python3 opencv 图像二值化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
Python实现子类调用父类的方法
Nov 10 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
python实现websocket的客户端压力测试
Jun 25 Python
Python将string转换到float的实例方法
Jul 29 Python
解决import tensorflow as tf 出错的原因
Apr 16 Python
windows安装python超详细图文教程
May 21 Python
Python中使用Opencv开发停车位计数器功能
Python采集股票数据并制作可视化柱状图
python疲劳驾驶困倦低头检测功能的实现
Python实现自动玩连连看的脚本分享
Apr 04 #Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Python必备技巧之函数的使用详解
Python批量解压&压缩文件夹的示例代码
Apr 04 #Python
You might like
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
深入PHP异步执行的详解
2013/06/03 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
再论Javascript下字符串连接的性能
2011/03/05 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
JS实现div居中示例
2014/04/17 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
浅析javascript的return语句
2015/12/15 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
浅谈Vue.js
2017/03/02 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
会展策划与管理专业求职信
2014/06/09 职场文书
欢迎横幅标语
2014/06/17 职场文书
找工作求职信
2014/07/07 职场文书
写字楼租赁意向书
2014/07/30 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技