【图像处理】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方法(cv2.THRESH_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章 图像平滑处理,希望与各位老师和小伙伴们交流学习~

 

给TA买糖
共{{data.count}}人
人已赞赏
经验教程

史上超强拷贝仓——GitHub 热点速览 v.21.11

2021-3-16 12:08:00

经验教程

博客园主题——atum2.0升级发布啦

2021-3-16 12:52:00

⚠️
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。 本站为个人博客非盈利性站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。本站部份代码及教程来源于互联网,仅供网友学习交流,若您喜欢本文可附上原文链接随意转载。
无意侵害您的权益,请发送邮件至 momeis6@qq.com 或点击右侧 私信:momeis 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索