OpenCV-Python 图像二值化

  • 一.什么是图像二值化
  • 二.图像二值化
    • Ⅰ先获取阈值:
    • Ⅱ根据阈值去二值化图像
    • ⅢOpenCV中的二值化方法
  • 三.全局阈值函数cv2.threshold
      • · 函数原型:
      • · 参数:
      • · 返回值:
      • · 阈值类型type:
      • · 代码实现全局阈值
    • 局部阈值-自适应阈值算法adaptiveThreshold
      • · 函数原型
      • ·参数
      • ·返回值
      • · 对adaptiveMethod和C的解释
      • ·代码实现局部阈值

一.什么是图像二值化

  • 彩色图像:三个通道:0-255,0-255,0-255,所以可以有2^24位空间

  • 灰度图像:一个通道:0-255,所以有256种颜色

  • 二值图像:只有两种颜色:黑和白,1白色(255) 0黑色(0)

二.图像二值化

Ⅰ先获取阈值:
  • 从直方图找到波峰波谷,作连线处理
  • 从直方图各个点向连线作垂直线,找到最长
  • 在垂直线最长的点做一个offset偏移值,找到阈值
Ⅱ根据阈值去二值化图像
  • 图像二值化方法:全局阈值局部阈值
ⅢOpenCV中的二值化方法
  • OpenCV中图像二值化方法:
    -OTSU
    -Triangle

    -自动与手动
  • 自适应阈值

三.全局阈值函数cv2.threshold

· 函数原型:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)->retval,dst
· 参数:
  • src - 输入数组/图像(多通道,8位或32位浮点)
  • thresh - 阈值
  • maxval - 最大值,与#THRESH_BINARY和#THRESH_BINARY_INV阈值类型一起使用的最大值(maximum value)
  • type - 阈值类型
  • dst - 输出数组/图像(与src相同大小和类型以及相同通道数的数组/图像)。

此外,特殊值#THRESH_OTSU或#THRESH_TRIANGLE可以与上述值之一组合。 在这些情况下,函数使用Otsu或Triangle算法确定最佳阈值,并使用它而不是指定的阈值。

· 返回值:
  • retval - 阈值 thresh
    若是全局固定阈值算法,则返回thresh参数值。
    若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。
  • dst - 经函数处理后的图像 image
· 阈值类型type:

原灰度图像的像素值:

  1. 二进制阈值化 THRESH_BINARY :过门限的值为最大值,其他值为0

  2. 反二进制阈值化THRESH_BINARY_INV :过门限的值为0,其他值为最大值

  3. 截断阈值化 THRESH_TRUNC :过门限的值为门限值,其他值不变

  4. 阈值化为0 THRESH_TOZERO :过门限的值不变,其他设置为0

  5. 反阈值化为0 THRESH_TOZERO_INV :过门限的值为0,其他不变

· 代码实现全局阈值
  1. 全局阈值使用THRESH_OTSU(大津法)
def threshold_demo(image):gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY)   #要二值化图像,要先进行灰度化处理ret, binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)print("threshold value: %s"%ret)  #打印阈值,前面先进行了灰度处理0-255,我们使用该阈值进行处理,低于该阈值的图像部分全为黑,高于该阈值则为白色cv.imshow("binary",binary)  #显示二值化图像


cv2.threshold函数有两个返回值:

第一个返回值,得到图像的阈值,
第二个返回值,也就是阈值处理后的图像,

cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)

我们自己不一定能够找到一个最好的阈值,去二分化图像,所以我们需要算法自己去寻找一个阈值,而cv.THRESH_OTSU就可以满足这个需求,去找到一个最好的阈值。

注意:大津法非常适用于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。

因为cv.THRESH_OTSU方法会产生一个阈值,那么函数cv2.threshold的的第二个参数(设置阈值)就是0(None)了,并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU。

这里面第三个参数maxval参数表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。而我们使用的灰度图像最大则为255,所以设置为255即可。

  1. 全局阈值使用THRESH_TRIANGLE(三角形算法)
ret, binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)


容易造成图像丢失,适用于图像灰度直方图具有单个波峰的情况,最开始用于医学分割细胞等

  1. 大津法和三角形算法都是自动去获取阈值,下面我们自己直接指定阈值

1)THRESH_BINARY_INV大于阈值的都为0

ret, binary = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)


2)THRESH_TRUNC截断大于127的值都为127

ret, binary = cv.threshold(gray,127,255,cv.THRESH_TRUNC


3)THRESH_TOZERO小于阈值的都为0和(1)相反

ret, binary = cv.threshold(gray,127,255,cv.THRESH_TOZERO)

局部阈值-自适应阈值算法adaptiveThreshold

在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果。而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处:

  1. 每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。

  2. 亮度较高的图像区域的二值化阈值通常会较高,而亮度低的图像区域的二值化阈值则会相适应的变小。

  3. 不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。

· 函数原型
void adaptiveThreshold(InputArray src, OutputArray dst,  double maxValue, int adaptiveMethod,int thresholdType, int bolckSize, double C)
->dst
·参数
  • src - 输入图像,填单通道,单8位浮点类型Mat即可。
  • dst - 函数运算后的结果存放在这。即为输出图像(与输入图像同样的尺寸和类型)。
  • maxValue - 表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值。
  • adaptiveMethod - 指定自适应阈值算法。可选择ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C两种。
  • thresholdType- 指定阈值类型。可选择THRESH_BINARY或者THRESH_BINARY_INV两种。(即二进制阈值或反二进制阈值)。
  • bolckSize - 表示邻域块大小,用来计算区域阈值,(奇数且大于1,一般选择为3、5、7…等)。
  • C - 表示从平均值或加权平均值中减去的数,通常情况下,这是正值,但也可能为零或负值。
·返回值
  • dst- 经函数处理过的图像
· 对adaptiveMethod和C的解释

自适应阈值化计算大概过程是为每一个象素点单独计算的阈值,即每个像素点的阈值都是不同的,就是将该像素点周围B*B区域内的像素加权平均,然后减去一个常数C,从而得到该点的阈值。B由参数bolckSize指定,常数C由参数C指定。

ADAPTIVE_THRESH_MEAN_C,为局部邻域块的平均值,该算法是先求出块中的均值,再减去常数C。

ADAPTIVE_THRESH_GAUSSIAN_C,为局部邻域块的高斯加权和。该算法是在区域中(x, y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算,再减去常数C。

·代码实现局部阈值
  1. ADAPTIVE_THRESH_MEAN_C
def local_demo(image):img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)img1 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 5, 4)cv.imshow("img1", img1)

  1. ADAPTIVE_THRESH_GAUSSIAN_C
img1 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 5, 4)


参考:
OpenCV 图像二值化
自适应阈值化操作

OpenCV-Python 图像二值化相关推荐

  1. Python使用openCV把原始彩色图像转化为灰度图、使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本)、基于自适应阈值预处理(adaptive thresholding)方法

    Python使用openCV把原始彩色图像转化为灰度图.使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本).基于自适应阈值预处理(adaptive thresholding)方法 目录

  2. OpenCv之图像二值化(笔记12)

    # 图像处理中,Thresholding中文翻译过来叫二值化或者阈值化.二值化就是把图片转换成只有white赫尔black这俩种颜色.通过Thresholding,可以让图片中感兴趣 # 的颜色编程主 ...

  3. Opencv教程-图像二值化

    图像二值化的概念 图像二值化是指将指将256阶的灰度图通过合适的阈值,转换为黑白二值图.即像素或0和255.其目的通常为将图像的前后景进行分割,使图像变得简单,数据量减小,能凸显出感兴趣的目标的轮廓. ...

  4. opencv java图像二值化处理

    1.threshold方法: Imgproc.threshold(Mat src, Mat dst, double thresh, double maxval, int type) 参数: src 原 ...

  5. python 图像二值化

    自适应二值化,高斯加权二值化: image =cv2.imread(r'E:\data\barcode\test\1009_11\test\blur\509915979678918664.jpg', ...

  6. OpenCV机器视觉-图像二值化

    图像二值化 图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 在数字图像处理中,二值图像占有非常重要的地位 ...

  7. opencv实现图像二值化(直接确定或滑杆调节)

    一.滑杆调节版-- #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #inclu ...

  8. ostu阈值分割python实现_opencv python 图像二值化/简单阈值化/大津阈值法

    1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. ...

  9. python opencv二值化图像_python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘...

    python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘 python opencv 1,读取图像 2,图像变矩阵 3,图像转灰度图像 4,彩色图像是3D数组 5,灰度图像是2 ...

最新文章

  1. 修改服务器文件系统为xfs,CentOS Linux如何无损调整分区大小(XFS文件系统)
  2. win32 禁用缩放功能_Firefox 73 将引入全局缩放功能,在所有网站都可适用
  3. linux内核中的循环缓冲区
  4. C++boost Class named_condition翻译
  5. Pandas 文件读取和导出
  6. java switch case怎么判断范围_java小白从入门到精通(基础二)
  7. JSP/Servlet-----charset 、pageEncoding差别
  8. JavaScript里的数组转化新方法Array.From
  9. ASP.NET 2.0中合并 GridView 的表头单元格
  10. wps如何将字体竖着排列_如何在短时间内,使自己的字看起来更舒服?
  11. 游戏开发者,游戏开发教程
  12. POI设置excel格式为文本格式
  13. 如何按照滑环的原理来自制简易导电滑环
  14. 量化岗经典面试题——纸牌游戏
  15. Babel转码器详解
  16. selenium之反反爬虫
  17. deep supervision
  18. 网络优化(三)——参数初始化
  19. 百度一键Root使用教程
  20. 139邮箱smtp地址和端口_快速玩转UNIMIA电子邮箱,不再错过每一封邮件!

热门文章

  1. linux server下载64位,ubuntu 16.04服务器版
  2. Hbuilder配置识别逍遥安卓模拟器
  3. devcontainer 靶机
  4. JAVA中JSON序列化和反序列化
  5. 概率论与数理统计基本知识点总结
  6. 概率论与数理统计_知识总结之概率论部分
  7. zotero+坚果云,免费跨平台文献管理最佳实践指南
  8. 财务人员如何更好的抵御寒冬?
  9. 奇偶校验器真值表_奇偶校验器
  10. Matlab:奇异值