【图像处理】OpenCV+Python图像处理入门教程(五)阈值处理
这篇随笔介绍使用OpenCV进行图像处理的第五章 阈值处理。
5 阈值处理
阈值是指像素到达某临界值。阈值处理表示像素到达某临界值后,对该像素点进行操作和处理。
例如:设定一幅图像素阈值为200,则图片中所有大于200的像素点设置为255,图片中所有小于或等于200的像素点设置为0。
5.1 处理类型
OpenCV中提供了cv2.threshold()函数进行阈值处理。
该函数中,要设定阈值处理的类型,常见类型如下:
cv2.THRESH_BINARY 二值化阈值处理
cv2.THRESH_BINARY _INV 反二值化阈值处理
cv2.THRESH_TRUNC 截断阈值处理
cv2.THRESH_TOZERO_INV 超阈值零处理
cv2.THRESH_TOZERO 低阈值零处理
cv2.THRESH_MASK 掩码处理
cv2.THRESH_OTSU Otsu算法阈值处理
此外,OpenCV还提供了cv2.adaptiveThreshold()函数进行自适应阈值处理。
5.2 二值化阈值处理(cv2.THRESH_BINARY)
该方法表示:对于像素值大于阈值thresh的像素点,将其设置为最大值;对于像素值小于阈值thresh的像素点,将其设置为0。
使用函数cv2.threshold()对图像进行二值化阈值操作代码如下:
1 import cv2
2 img=cv2.imread('E:\python_opencv/tupian.jpg')
3 t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY) #类型设置为cv2.THRESH_BINARY,阈值设置为127
4 cv2.imshow('img',img)
5 cv2.imshow('rst',rst)
6 cv2.waitKey()
7 cv2.destroyAllWindows()
运行结果如下图,左为原图像,右为二值化阈值处理结果。


5.3 反二值化阈值处理(cv2.THRESH_BINARY_INV)
该方法表示:对于像素值大于阈值thresh的像素点,将其设置为0;对于像素值小于阈值thresh的像素点,将其设置为最大值。
使用函数cv2.threshold()对图像进行二值化阈值操作代码如下:
1 import cv2
2 img=cv2.imread('E:\python_opencv/tupian.jpg')
3 t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) #类型设置为cv2.THRESH_BINARY_INV,阈值设置为127
4 cv2.imshow('img',img)
5 cv2.imshow('rst',rst)
6 cv2.waitKey()
7 cv2.destroyAllWindows()
运行结果如下图,左为原图像,右为反二值化阈值处理结果。


5.4 截断阈值化处理(cv2.THRESH_TRUNC)
该方法表示:对于像素值大于阈值thresh的像素点,将其设置为阈值;对于像素值小于阈值thresh的像素点,保持不变。
使用函数cv2.threshold()对图像进行截断阈值化处理代码如下:
1 import cv2
2 img=cv2.imread('E:\python_opencv/tupian.jpg')
3 t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC) #类型设置为cv2.THRESH_TRUNC,阈值设置为127
4 cv2.imshow('img',img)
5 cv2.imshow('rst',rst)
6 cv2.waitKey()
7 cv2.destroyAllWindows()
运行结果如下图,左为原图像,右为截断阈值化处理结果。


5.5 超阈值零处理(cv2.THRESH_TOZERO_INV)
该方法表示:对于像素值大于阈值thresh的像素点,将其设置为0;对于像素值小于阈值thresh的像素点,保持不变。
使用函数cv2.threshold()对图像进行超阈值零处理代码如下:
1 import cv2
2 img=cv2.imread('E:\python_opencv/tupian.jpg')
3 t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) #类型设置为cv2.THRESH_TOZERO_INV,阈值设置为127
4 cv2.imshow('img',img)
5 cv2.imshow('rst',rst)
6 cv2.waitKey()
7 cv2.destroyAllWindows()
运行结果如下图,左为原图像,右为超阈值零处理结果。


5.6 低阈值零处理(cv2.THRESH_TOZERO)
该方法表示:对于像素值小于或等于阈值thresh的像素点,将其设置为0;对于像素值大于阈值thresh的像素点,保持不变。
使用函数cv2.threshold()对图像进行低阈值零处理代码如下:
1 import cv2
2 img=cv2.imread('E:\python_opencv/tupian.jpg')
3 t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO) #类型设置为cv2.THRESH_TOZERO,阈值设置为127
4 cv2.imshow('img',img)
5 cv2.imshow('rst',rst)
6 cv2.waitKey()
7 cv2.destroyAllWindows()
运行结果如下图,左为原图像,右为低阈值零处理结果。


5.7 自适应阈值处理
一般情况下,图像中只是用一个阈值,就会造成轮廓与内容分割不均衡,无法得到清晰有效的阈值处理图像。
OpenCV中提供了cv2.adaptiveThreshold()函数用于实现自适应阈值处理。自适应阈值处理的原理,是通过计算每个像素点的邻域像素进行加权平均而获得阈值,能够较好地处理色彩不均衡的图像。
cv2.adaptiveThreshold()函数中,有两个参数类型:
cv2.ADAPTIVE_THRESH_MEAN_C 邻域内所有像素点的权重都相同
cv2.ADAPTIVE_THRESH_GAUSSIAN_C 通过高斯方程得到各个像素点的权重值,与邻域内像素点到中心的距离有关
使用二值化阈值函数cv2.threshold()对图像进行自适应阈值处理代码如下:
1 import cv2
2 img=cv2.imread('E:\python_opencv/tupian.jpg',0)
3 #类型设置为cv2.ADAPTIVE_THRESH_MEAN_C,后面必须加cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV,邻域大小设置为5×5,最后的3是常量
4 athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)
5 #类型设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C,后面必须加cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV,邻域大小设置为5×5,最后的3是常量
6 athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
7 cv2.imshow('img',img)
8 cv2.imshow('athdMEAN',athdMEAN)
9 cv2.imshow('athdGAUS',athdGAUS)
10 cv2.waitKey()
11 cv2.destroyAllWindows()
运行结果如下图,左为原图像,中为像素权重平均处理结果,右为高斯权重值处理结果。可以看到,自适应阈值处理保留了更多的细节信息。



5.8 Otsu方法
Otsu方法能够根据当前图像生成最佳的类间分割阈值,原理是遍历所有可能的阈值,从而找到最合适的阈值。
通过函数cv2.threshold()中传递类型参数:cv2.THRESH_OTSU,来实现Otsu算法。
需要注意的是,在使用Otsu方法时,要把阈值设置为0,语句为:
# t是Otsu方法得到并使用的最合适阈值,参数中阈值设置为0,传递两种类型
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
使用Otsu方法对图像进行自适应阈值处理代码如下:
1 import cv2
2 img=cv2.imread('E:\python_opencv/tupian.jpg',0)
3 #类型设置为cv2.THRESH_BINARY+cv2.THRESH_OTSU,阈值设置为0
4 t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
5 cv2.imshow('img',img)
6 cv2.imshow('otsu',otsu)
7 cv2.waitKey()
8 cv2.destroyAllWindows()
运行结果如下图,左为原图像,右为Otsu方法处理结果。


这次内容就分享到这里了,下次继续更新第6章 图像平滑处理,希望与各位老师和小伙伴们交流学习~
【图像处理】OpenCV+Python图像处理入门教程(五)阈值处理的更多相关文章
- PySide——Python图形化界面入门教程(五)
PySide——Python图形化界面入门教程(五) ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistw ...
- 无废话ExtJs 入门教程五[文本框:TextField]
无废话ExtJs 入门教程五[文本框:TextField] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个文本框.如下所示代码区的第42行位置,items: ...
- Python基础入门教程
Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...
- Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分
1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...
- Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分
1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...
- 2019-03-22 Python Scrapy 入门教程 笔记
Python Scrapy 入门教程 入门教程笔记: # 创建mySpider scrapy startproject mySpider # 创建itcast.py cd C:\Users\theDa ...
- Elasticsearch入门教程(五):Elasticsearch查询(一)
原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...
- RabbitMQ入门教程(五):扇形交换机发布/订阅(Publish/Subscribe)
原文:RabbitMQ入门教程(五):扇形交换机发布/订阅(Publish/Subscribe) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...
- 【图像处理】OpenCV+Python图像处理入门教程(四)几何变换
这篇随笔介绍使用OpenCV进行图像处理的第四章 几何变换. 4 几何变换 图像的几何变换是指将一幅图像映射到另一幅图像内.有缩放.翻转.仿射变换.透视.重映射等操作. 4.1 缩放 使用cv2. ...
随机推荐
- C++含有无符号类型的表达式的计算
unsigned u=10; int i=-42; cout<<i+i<<endl; cout<<u+i<<endl; 在第二个输出表达式中,相加前首先 ...
- HDU2837 Calculation(指数循环节)题解
题意: 已知\(f(0)=1,f(n)=(n\%10)^{f(n/10)}\),求\(f(n)\mod m\) 思路: 由扩展欧拉定理可知:当\(b>=m\)时,\(a^b\equiv a^{b ...
- ORM框架对分表分库之分库和分表指定不同的字段
ORM框架分库分表已实现了 只分表(根据指定字段) 点我查看demo 只分库(根据指定字段) 点我查看demo 既分库又分表(根据相同的字段) 点我查看demo 上面几点之前我在博客中已经写了使用介绍 ...
- 微信小程序-导航 & 路由
微信小程序-导航 & 路由 页面跳转 页面路由 页面栈, 框架以栈的形式维护了当前的所有页面. https://developers.weixin.qq.com/miniprogram/dev ...
- bind & this & new & arrow function
bind & this & new & arrow function this bind call apply new arrow function arrow functio ...
- Linux & SIGUSER1
Linux & SIGUSER1 https://stackoverflow.com/questions/10824886/how-to-signal-an-application-witho ...
- nasm astrchr函数 x86
xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export as ...
- C++算法代码——关于马的问题
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1285 题目描述 小R参加一个派对,这个派队的参加者需要带上四匹颜色不同的马.小R目前 ...
- HQYJ嵌入式学习笔记——C语言复习day1
第一天:Linux命令 vim操作 第二天:数据类型 运算符 顺序语句第三天:分支语句 循环语句第四天:循环语句 数组第五天:数组第六天:指针第七天:函数 数组与指针第八天:数组指针第九天:递归 第十 ...
- 使用OWASP Dependency-Check对应用做个安检
俗话说"人怕出名猪怕壮",当系统小有名气以后就会被一些黑客盯上,三天两头的用各种漏洞扫描工具做渗透,如果不希望某天你负责的系统因为安全问题而出名,那就提前行动起来吧,这就是今天要讲 ...