这篇随笔介绍使用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图像处理入门教程(五)阈值处理的更多相关文章

  1. PySide——Python图形化界面入门教程(五)

    PySide——Python图形化界面入门教程(五) ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistw ...

  2. 无废话ExtJs 入门教程五[文本框:TextField]

    无废话ExtJs 入门教程五[文本框:TextField] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个文本框.如下所示代码区的第42行位置,items: ...

  3. Python基础入门教程

    Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...

  4. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

  5. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  6. 2019-03-22 Python Scrapy 入门教程 笔记

    Python Scrapy 入门教程 入门教程笔记: # 创建mySpider scrapy startproject mySpider # 创建itcast.py cd C:\Users\theDa ...

  7. Elasticsearch入门教程(五):Elasticsearch查询(一)

    原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  8. RabbitMQ入门教程(五):扇形交换机发布/订阅(Publish/Subscribe)

    原文:RabbitMQ入门教程(五):扇形交换机发布/订阅(Publish/Subscribe) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  9. 【图像处理】OpenCV+Python图像处理入门教程(四)几何变换

    这篇随笔介绍使用OpenCV进行图像处理的第四章 几何变换. 4  几何变换 图像的几何变换是指将一幅图像映射到另一幅图像内.有缩放.翻转.仿射变换.透视.重映射等操作. 4.1  缩放 使用cv2. ...

随机推荐

  1. Leetcode(1)-两数之和

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...

  2. 记录一个状压DP用到的骚操作

    不断的让i=i^lowbit(i)就可以枚举i二进制里面所有的1 嘛,很显然,怕是我没想到哦

  3. 三、mysql主从复制

    1 MySQL 主从复制 1.1 主从复制的含义 在 MySQL 多服务器的架构中,至少要有一个主节点(master),跟主节点相对的,我们把它叫做从节点(slave). 主从复制,就是把主节点的数据 ...

  4. git merge bug

    git merge bug 本地分支 dev commit 后, 直接 pull 远程 dev 分支, 导致远程 dev 分支 merge 到本地 dev 分支了, 取消本次 merge 操作? Re ...

  5. 如何取消一个 Ajax 请求

    如何取消一个 Ajax 请求 jQuery XMLHttpRequest.abort() https://stackoverflow.com/questions/446594/abort-ajax-r ...

  6. vue & table with operation slot

    vue & table with operation slot seed demo <!-- @format --> <template> <seed ref=& ...

  7. 2020 web developer roadmap

    2020 web developer roadmap https://github.com/kamranahmedse/developer-roadmap https://roadmap.sh/ ht ...

  8. TypeScript——02——TS基本数据类型介绍和使用

    一,TS的数据类型 ES6的数据类型: 6种基本数据类型 Boolean Number String Symbol undefined null 3种引用类型 Array Function Objec ...

  9. [Python学习笔记]正则表达式总结

    常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...

  10. SCSS引入通用SCSS

    新建通用common.scss .empty { margin-top: 100rpx; text-align: center; .empty-img { width: 220rpx; height: ...