Python下opencv图像阈值处理的使用笔记


Posted in Python onAugust 04, 2019

图像的阈值处理一般使得图像的像素值更单一、图像更简单。阈值可以分为全局性质的阈值,也可以分为局部性质的阈值,可以是单阈值的也可以是多阈值的。当然阈值越多是越复杂的。下面将介绍opencv下的三种阈值方法。

(一)简单阈值

简单阈值当然是最简单,选取一个全局阈值,然后就把整幅图像分成了非黑即白的二值图像了。函数为cv2.threshold()
这个函数有四个参数,第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:

  • cv2.THRESH_BINARY(黑白二值)
  • cv2.THRESH_BINARY_INV(黑白二值反转)
  • cv2.THRESH_TRUNC (得到的图像为多像素值)
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

该函数有两个返回值,第一个retVal(得到的阈值值(在后面一个方法中会用到)),第二个就是阈值化后的图像。
一个实例如下:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0) #直接读为灰度图像
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
titles = ['img','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img,thresh1,thresh2,thresh3,thresh4,thresh5]
for i in range(6):
 plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
 plt.title(titles[i])
 plt.xticks([]),plt.yticks([])
plt.show()

Python下opencv图像阈值处理的使用笔记 

可以看到这里把阈值设置成了127,对于BINARY方法,当图像中的灰度值大于127的重置像素值为255.

(二)自适应阈值:

前面看到简单阈值是一种全局性的阈值,只需要规定一个阈值值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。使用的函数为:cv2.adaptiveThreshold()
该函数需要填6个参数:

  1. 第一个原始图像
  2. 第二个像素值上限
  3. 第三个自适应方法Adaptive Method:
    1. — cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
    2. —cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口
  4. 第四个值的赋值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
  5. 第五个Block size:规定领域大小(一个正方形的领域)
  6. 第六个常数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)

这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。

一个实例如下:

mport cv2
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0) #直接读为灰度图像
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY,11,2) #换行符号 \
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2) #换行符号 \
images = [img,th1,th2,th3]
plt.figure()
for i in xrange(4):
 plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.show()

Python下opencv图像阈值处理的使用笔记 

可以看到上述窗口大小使用的为11,当窗口越小的时候,得到的图像越细。想想一下,如果把窗口设置足够大以后(不能超过图像大小),那么得到的结果可能就和第二幅图像的相同了。

(三)Otsu's二值化

我们前面说到,cv2.threshold函数是有两个返回值的,前面一直用的第二个返回值,也就是阈值处理后的图像,那么第一个返回值(得到图像的阈值)将会在这里用到。

前面对于阈值的处理上,我们选择的阈值都是127,那么实际情况下,怎么去选择这个127呢?有的图像可能阈值不是127得到的效果更好。那么这里我们需要算法自己去寻找到一个阈值,而Otsu's就可以自己找到一个认为最好的阈值。并且Otsu's非常适合于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。那么经过Otsu's得到的那个阈值就是函数cv2.threshold的第一个参数了。因为Otsu's方法会产生一个阈值,那么函数cv2.threshold的的第二个参数(设置阈值)就是0了,并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU。那么什么是双峰图像(只能是灰度图像才有),就是图像的灰度统计图中可以明显看出只有两个波峰,比如下面一个图的灰度直方图就可以是双峰图:

Python下opencv图像阈值处理的使用笔记 

好了现在对这个图进行Otsu's阈值处理就非常的好,通过函数cv2.threshold会自动找到一个介于两波峰之间的阈值。一个实例如下:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('finger.jpg',0) #直接读为灰度图像
#简单滤波
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
#Otsu 滤波
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print ret2
plt.figure()
plt.subplot(221),plt.imshow(img,'gray')
plt.subplot(222),plt.hist(img.ravel(),256)#.ravel方法将矩阵转化为一维
plt.subplot(223),plt.imshow(th1,'gray')
plt.subplot(224),plt.imshow(th2,'gray')

Python下opencv图像阈值处理的使用笔记 

print ret2 得到的结果为122。可以看出似乎两个结果并没有很明显差别(素材也不太好弄~_~!),主要是两个阈值(127与122)太相近了,如果这两个隔得很远那么会很明显的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中条件选择和循环语句使用方法介绍
Mar 13 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
Python实现多进程的四种方式
Feb 22 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
python中的yield from语法快速学习
Nov 06 Python
python爬取天气数据的实例详解
Nov 20 Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 Python
python opencv 简单阈值算法的实现
Aug 04 #Python
Python pandas用法最全整理
Aug 04 #Python
python匿名函数用法实例分析
Aug 03 #Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 #Python
Python适配器模式代码实现解析
Aug 02 #Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 #Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 #Python
You might like
php HandlerSocket的使用
2011/05/02 PHP
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
教你php如何实现验证码
2016/01/20 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
利用Python爬虫给孩子起个好名字
2017/02/14 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
python字典快速保存于读取的方法
2018/03/23 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
基于python3实现倒叙字符串
2020/02/18 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
高中生自我评价个人范文
2013/11/09 职场文书
面试后的感谢信范文
2014/02/01 职场文书
毕业生就业协议书
2014/04/11 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
Vue3中的Refs和Ref详情
2021/11/11 Vue.js
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL