图像的阈值处理

一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较单一,而且总可以得到封闭且连通区域的边界。

(一)简单阈值

选取一个全局阈值,然后就把整幅图像分成非黑即白的二值图像。

函数为cv2.threshold( )

这个函数有四个参数,第一个是原图像矩阵,第二个是进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:

  • cv2.THRESH_BINARY(黑白二值)
  • cv2.THRESH_BINARY_INV(黑白二值翻转)
  • cv2.THRESH_TRUNC(得到额图像为多像素值)
  • cv2.THRESH_TOZERO(当像素高于阈值时像素设置为自己提供的像素值,低于阈值时不作处理)
  • cv2.THRESH_TOZERO_INV(当像素低于阈值时设置为自己提供的像素值,高于阈值时不作处理)

这个函数返回两个值,第一个值为阈值,第二个就是阈值处理后的图像矩阵。

img = cv2.imread('4.jpg', 0)
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 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)  # 高于阈值时像素设置为255,低于阈值时不作处理
ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)  # 低于阈值时设置为255,高于阈值时不作处理print(ret)cv2.imshow('thresh1', thresh1)
cv2.imshow('thresh2', thresh2)
cv2.imshow('thresh3', thresh3)
cv2.imshow('thresh4', thresh4)
cv2.imshow('thresh5', thresh5)
cv2.imshow('grey-map', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)自适应阈值

一中的简单阈值是一种全局性的阈值,只需要设定一个阈值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过设定一个区域大小,比较这个点与区域大小里面像素点 的平均值(或者其他特征)的大小关系确定这个像素点的情况。使用的函数为:

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

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

img = cv2.imread('4.jpg', 0)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 第一个参数为原始图像矩阵,第二个参数为像素值上限,第三个是自适应方法(adaptive method):
#                                              -----cv2.ADAPTIVE_THRESH_MEAN_C:领域内均值
#                                              -----cv2.ADAPTIVE_THRESH_GAUSSIAN_C:领域内像素点加权和,权重为一个高斯窗口
# 第四个值的赋值方法:只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV
# 第五个Block size:设定领域大小(一个正方形的领域)
# 第六个参数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值,就是求得领域内均值或者加权值)
# 这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图都用一个阈值
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 2)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th4 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow('img', img)
cv2.imshow('th1', th1)
cv2.imshow('th2', th2)
cv2.imshow('th3', th3)
cv2.imshow('th4', th4)
cv2.waitKey(0)
cv2.destroyAllWindows()

对于第五个参数的窗口越来越小时,发现得到的图像越来越细了,可以设想,如果把窗口设置的足够大的话(不能超过图像大小),那么得到的结果可能就和第二幅图像的相同了。

(三)Otsu's二值化

cv2.threshold( )函数有两个返回值,一个是阈值,第二个是处理后的图像矩阵。

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

在下列这些程序和图片中大家会有鲜明的体会:

img = cv2.imread('2.jpg', 0)
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 简单滤波
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)  # Otsu 滤波
print(ret2)
cv2.imshow('img', img)
cv2.imshow('th1', th1)
cv2.imshow('th2', th2)
# 用于解决matplotlib中显示图像的中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.hist(img.ravel(), 256)
plt.title('灰度直方图')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

python+OpenCV图像处理(五)图像的阈值分割相关推荐

  1. Python OpenCV 图像处理之 图像运算和图像位运算知识补充

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 51 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...

  2. C++ opencv基于OTSU图像多阈值分割

    vector<double> sub(vector<int> A, vector<double> B) //减法 {vector<double> C;C ...

  3. c++opencv汉字分割_机器学习小白,还不快pick一下——【视觉与图像:阈值分割】...

    " 前言:安利Python来开发OpenCV的原因其实细心的小伙伴早在?[视觉与图像]Python+OpenCV教程入门篇就找到了想要的答案.(点蓝字即可打开) " 今天周五了! ...

  4. Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 cv2.compareHist 函数 橡皮擦的小节 基础知识铺垫 上篇博客 Py ...

  5. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  6. 《OpenCv视觉之眼》Python图像处理二十一:Opencv图像处理之图像线性变换和非线性变换的方法及原理

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  7. [Python图像处理] 五.图像融合、加法运算及图像类型转换

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  8. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

  9. 7.2 Python图像处理之图像分割-单阈值分割

    7.2 Python图像处理之图像分割-单阈值分割 文章目录 7.2 Python图像处理之图像分割-单阈值分割 1 算法原理 2 代码 3 效果 1 算法原理 单阈值分割算法原理: 单阈值分割是指将 ...

  10. Python对DICOM图像进行阈值分割

    Python对Dicom图像进行处理,离不开pydicom,opencv-python,matplotlib,numpy四个代码库,安装完成这四个代码库后, 可以读取Dicom图像,并对图像进行处理, ...

最新文章

  1. python二叉树遍历算法_分享python实现的二叉树定义与遍历
  2. 毕业设计:基于SSM实现新生报道系统
  3. String、StringBuilder类连接字符串操作的时间差异
  4. UIButton return(textField textView)
  5. Mongoexport导出数据,Mongoimport导入数据,mongodump备份数据,mongorestore恢复恢复
  6. LimeSurvey问卷调查管理系统
  7. SQL从入门到入魔之初入门
  8. java面试知识记录
  9. 错误/异常:java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind;的解决方法...
  10. Web浏览器已经限制此文件显示
  11. matlab中的m-file,MATLAB m-file帮助格式化
  12. Git基础:第九、十章 Git可视化工具 Git团队协作以及合并时的diff工具
  13. 中华石杉-- --分布式服务框架Dubbo的笔记
  14. CTF隐写术:男神一般都很低调很低调的
  15. 基于maven自动构建和部署工具-JDeploy
  16. AtCoder Beginner Contest 162 D RGB Triplets 前缀和
  17. VTK-修改图片的像素
  18. Axure RP 9 for Mac 中文版 专业产品原型设计工具
  19. 使图片充满整个ImageView的方法
  20. vs2013 分析 profiler 导致电脑重启

热门文章

  1. 智慧新泰时空大数据与云平台_智慧警务大数据云平台开发情报研判系统解决方案...
  2. Google | 突破瓶颈,打造更强大的Transformer
  3. 令人振奋的好消息!2016年12月8日Google Developers中文网站发布!
  4. 特定热点事件监控与分析项目
  5. 咨询笔记:麦肯锡7步成诗
  6. 洛谷 P1824 进击的奶牛 【二分答案】(求最大的最小值)
  7. Python之旅Day8 socket网络编程
  8. MySQL 5.7.18 解压版安装
  9. ubuntu zip解压
  10. 89C52控制1602A液晶的计时器