在图像处理中,Thresholding中文翻译过来叫二值化或者阈值化。二值化就是把图片传换成只有white和black这两种颜色。通过Thresholding,可以让图片中感兴趣的颜色变成主角–white,其余的颜色全部隐藏–black。另外,二值化后的图片也便于计算机进行分析,因为边缘轮廓十分清晰,所以计算机可以轻松找到边界线。然而,在找边界这方面,Thresholding并不是特别好的算法,有些时候遇到某些特殊图片效果也不好。

二值化的应用

from imutils import *
image = imread('image/coins.jpg')
show(image)

gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
plt.imshow(gray,'gray')  #使用灰度图效果显示图片
plt.axis('off')
plt.show()

• cv2.THRESH_BINARY
• cv2.THRESH_BINARY_INV # 阈值化操作,值大于阈值,变成较大的值,小于变为0
• cv2.THRESH_TRUNC
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV

ret1,thresh1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  #阈值都定义为127
ret2,thresh2 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
ret3,thresh3 = cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)
ret4,thresh4 = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)
ret5,thresh5 = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO_INV)
titles = ['original','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [gray, thresh1, thresh2, thresh3, thresh4, thresh5]
plt.figure(figsize=(15,5))
for i in range(6):   #显示图片plt.subplot(2,3,i+1)plt.imshow(images[i],'gray')plt.title(titles[i])plt.axis('off')
plt.show()

show(cv2.bitwise_and(image, image, mask=thresh1))  #遮挡

Otsu’s Method

自动选择阈值

image = imread('image/opencv_logo.png')
show(image)

gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
plt.imshow(gray,'gray')
plt.axis('off')
plt.show()

ret1,thresh1 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)  #阈值设为0,具有自动选取阈值的能力
ret2,thresh2 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
print('ret1:',ret1)   #自己设定阈值,比较难去找到一个确定的值
print('ret2:',ret2)
ret1: 164.0
ret2: 164.0
plt.imshow(thresh1,'gray')
plt.axis('off')
plt.show()

plt.imshow(thresh2,'gray')
plt.axis('off')
plt.show()

Adaptive Thresholding自适应阈值

在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当
时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不
同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的
每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是
不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

Adaptive Method- 指定计算阈值的方法。
– cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值(第一种方式)
– cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。 (第二种方式)

• Block Size - 邻域大小(用来计算阈值的区域大小)。
• C - 这就是是一个常数,阈值就等于平均值或者加权平均值减去这个常
数。

image = imread('image/license_plate.png')
show(image)

# 使用普通阈值化处理# 变灰度图
image = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
# 中值滤波
image = cv2.medianBlur(image,5)
# 普通二值化
ret,th1 = cv2.threshold(image,127,255,cv2.THRESH_BINARY)# 自适应阈值# 平均值阈值
th2 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,3)
# 高斯阈值
th3 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,3)
titles = ['original', 'Global Thresholding', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [image, th1, th2, th3]
plt.figure(figsize=(10,5))
for i in range(4):plt.subplot(2,2,i+1)plt.imshow(images[i],'gray')plt.axis('off')plt.title(titles[i])
plt.show()

image = imread('image/sudoku.jpg')
show(image)

# 变灰度图
image = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
# 中值滤波
image = cv2.medianBlur(image,5)
# 普通二值化
ret,th1 = cv2.threshold(image,127,255,cv2.THRESH_BINARY)
# 平均值阈值
th2 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,3)
# 高斯阈值
th3 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,3)
titles = ['original', 'Global Thresholding', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [image, th1, th2, th3]
plt.figure(figsize=(10,5))
for i in range(4):plt.subplot(2,2,i+1)plt.imshow(images[i],'gray')plt.axis('off')plt.title(titles[i])
plt.show()

二值化Thresholding相关推荐

  1. opencv学习1-3——通道变换,灰度化grayscale,二值化thresholding。

    入手opencv,最好的方法就是对应着程序进行学习是一个很好的方法,通过一些单个程序来了解图形处理的一些知识.这篇文章将介绍下面三个小任务.通道变换,灰度化,普通二值化.本文以C++版本进行代码介绍. ...

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

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

  3. 数字图像处理100问—03二值化(Thresholding)

    提示:内容整理自:https://github.com/gzr2017/ImageProcessing100Wen CV小白从0开始学数字图像处理 03二值化(Thresholding) 把图像进行二 ...

  4. C#,图像二值化(16)——全局阈值的力矩保持算法(Moment-proserving Thresholding)及其源代码

    1.力矩保持法 提出了一种基于矩保持原理的自动阈值选择方法.以这样的方式确定地计算阈值,即在输出画面中保留输入画面的时刻.实验结果表明,该方法可以将给定的图像阈值化为有意义的灰度级.该方法描述了全局阈 ...

  5. C#,图像二值化(05)——全局阈值的联高自适应算法(Legal Self-Adaptive Thresholding)及其源代码

    阈值的选择当然希望智能.简单一些.应该能应付一般的图片. What is Binarization? Binarization is the process of transforming data ...

  6. C#,图像二值化(22)——局部阈值的伯恩森算法(Bernsen Thresholding)及源程序

    1.局部阈值的伯恩森算法(Bernsen Thresholding) Bernsen方法是为图像分割开发的局部自适应二值化方法之一.在这项研究中,实现了Bernsen的局部自适应二值化方法,并对不同灰 ...

  7. C#,图像二值化(18)——全局阈值的模糊集理论算法(Huang Thresholding)与源程序

    1 模糊集理论 模糊集理论,也称为模糊集合论,或简单地称为模糊集,1965年美国学者扎德在数学上创立了一种描述模糊现象的方法-模糊集合论.这种方法把待考察的对象及反映它的模糊概念作为一定的模糊集合,建 ...

  8. C#,图像二值化(06)——全局阈值的大津算法(OTSU Thresholding)及其源代码

    1.大津算法OTSU ALGORITHM OTSU算法效果很一般. 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU, ...

  9. C#,图像二值化(04)——全局阈值的凯勒算法(Kittler Thresholding)及源程序

    1.Kittler算法(最小误差法)概述 最小误差法是 J. Kittler & J. Illingworth 1986年在<MINIMUM ERROR THRESHOLDING> ...

最新文章

  1. LeetCode Reconstruct Itinerary(欧拉回路)
  2. 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
  3. win10 安装xilinx 14.7 之后打开new project 奔溃解决方法
  4. 多线程和MsgWaitForMultipleObjects
  5. Github标星8.3k+,Tensorflow 2.0的代码实现及教学材料(“龙书”)公布下载了!
  6. 分类(category)是门学问
  7. StackExchange.Redis通用封装类分享(转)
  8. Java forEach中 Lambda Expr中的 final变量要求
  9. Atitit 团队建设的知识管理
  10. 与大家分享一些计算机方面的电子书籍
  11. 数字孪生可视化平台关键技术研究案例
  12. 如何统计网页的浏览量?Steins
  13. Device Owner模式
  14. 在游戏界,就有了些游戏界的理解。不过本文是对某游戏开发商的信
  15. Qt写的json代码生成器
  16. 社交媒体与邮件营销结合实现1+12的效果,你会玩吗?
  17. 常用的平方根算法详解与实现
  18. 优维科技低代码开发平台在券商系统的落地实践
  19. 潮汕地区1-潮州观感
  20. ORB-SLAM3 单目地图初始化(终结篇)

热门文章

  1. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(上)
  2. win10管理员账户改名(win10电脑账户改名)
  3. pubmed批量下载文献 傻瓜操作
  4. 2022-2028年中国房车旅游行业市场调查研究及投资策略研究报告
  5. java 启动 osgi_OSGi开发起步
  6. python 关于format各种格式化输出 一览表
  7. Android Jenkins 参数透传配置
  8. 解决mysql客户端执行插入中文数据命令出错以及中文乱码问题
  9. 利用App漏洞获利2800多万元,企业该如何避免类似事件?
  10. 《快乐星猫》动漫系列主要角色简介