一.图像阈值化

图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分开来。

灰度化处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。阈值化处理可以将图像中的像素划分为两类颜色,常见的阈值化算法如公式(1)所示:

当某个像素点的灰度Gray(i,j)小于阈值T时,其像素设置为0,表示黑色;当灰度Gray(i,j)大于或等于阈值T时,其像素值为255,表示白色。

在Python的OpenCV库中,提供了固定阈值化函数threshold()和自适应阈值化函数adaptiveThreshold(),将一幅图像进行阈值化处理[3-4]。

二.固定阈值化处理

OpenCV中提供了函数threshold()实现固定阈值化处理,其函数原型如下:

dst = cv2.threshold(src, thresh, maxval, type[, dst])

– src表示输入图像的数组,8位或32位浮点类型的多通道数

– dst表示输出的阈值化处理后的图像,其类型和通道数与src一致

– thresh表示阈值

– maxval表示最大值,当参数阈值类型type选择CV_THRESH_BINARY或CV_THRESH_BINARY_INV时,该参数为阈值类型的最大值

– type表示阈值类型

其中,threshold()函数不同类型的处理算法如表1所示。

其对应的阈值化描述如图1所示:

阈值化处理广泛应用于各行各业,比如生物学中的细胞图分割、交通领域的车牌识别等。通过阈值化处理将所图像转换为黑白两色图,从而为后续的图像识别和图像分割提供更好的支撑作用。下面详细讲解五种阈值化处理算法。

1.二进制阈值化

该函数的原型为 threshold(Gray,127,255,cv2.THRESH_BINARY)。其方法首先要选定一个特定的阈值量,比如127,再按照如下所示的规则进行阈值化处理。

当前像素点的灰度值大于thresh阈值时(如127),其像素点的灰度值设定为最大值(如8位灰度值最大为255);否则,像素点的灰度值设置为0。如阈值为127时,像素点的灰度值为163,则阈值化设置为255;像素点的灰度值为82,则阈值化设置为0。

二进制阈值化处理的Python代码如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('luo.png')

#灰度图像处理
grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

#二进制阈值化处理
r, b = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", b)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图2所示,左边是小珞珞的原图,右边是将原图进行二进制阈值化处理的效果图。像素值大于127的设置为255,小于等于127设置为0。

2.反二进制阈值化

该函数的原型为 threshold(Gray,127,255,cv2.THRESH_BINARY_INV)。其方法首先要选定一个特定的阈值量,比如127,再按照如下所示的规则进行阈值化处理。

当前像素点的灰度值大于thresh阈值时(如127),其像素点的灰度值设定为0;否则,像素点的灰度值设置为最大值。如阈值为127时,像素点的灰度值为211,则阈值化设置为0;像素点的灰度值为101,则阈值化设置为255。

反二进制阈值化处理的Python代码如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('luo.png')

#灰度图像处理
grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

#反二进制阈值化处理
r, b = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY_INV)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", b)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图3所示:

3.截断阈值化

该函数的原型为 threshold(Gray,127,255,cv2.THRESH_TRUNC)。图像中大于该阈值的像素点被设定为该阈值,小于或等于该阈值的保持不变,比如127。新的阈值产生规则如下:

比如阈值为127时,像素点的灰度值为167,则阈值化设置为127;像素点的灰度值为82,则阈值化设置为82。截断阈值化处理的Python代码如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('luo.png')

#灰度图像处理
grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

#截断阈值化处理
r, b = cv2.threshold(grayImage, 127, 255, cv2.THRESH_TRUNC)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", b)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图4所示,图像经过截断阈值化处理将灰度值处理于0至127之间。

4.阈值化为0

该函数的原型为 threshold(Gray,127,255,cv2.THRESH_TOZERO)。按照如下公式对图像的灰度值进行处理。

当前像素点的灰度值大于thresh阈值时(如127),其像素点的灰度值保持不变;否则,像素点的灰度值设置为0。如阈值为127时,像素点的灰度值为211,则阈值化设置为211;像素点的灰度值为101,则阈值化设置为0。

图像阈值化为0处理的Python代码如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('luo.png')

#灰度图像处理
grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

#阈值化为0处理
r, b = cv2.threshold(grayImage, 127, 255, cv2.THRESH_TOZERO)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", b)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图5所示,该算法把比较亮的部分不变,比较暗的部分处理为0。

5.反阈值化为0

该函数的原型为 threshold(Gray,127,255, cv2.THRESH_TOZERO_INV)。按照如下公式对图像的灰度值进行处理。

当前像素点的灰度值大于thresh阈值时(如127),其像素点的灰度值设置为0;否则,像素点的灰度值保持不变。如阈值为127时,像素点的灰度值为211,则阈值化设置为0;像素点的灰度值为101,则阈值化设置为101。

图像反阈值化为0处理的Python代码如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('luo.png')

#灰度图像处理
GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

#二进制阈值化处理
r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO_INV)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", b)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图6所示:

同样,我们在对民族图腾及图像进行识别和保护时,也需要进行图像阈值化处理。下面代码是对比苗族服饰图像五种固定阈值化处理的对比结果。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取图像
img=cv2.imread('miao.png')
grayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  

#阈值化处理
ret,thresh1=cv2.threshold(grayImage,127,255,cv2.THRESH_BINARY)  
ret,thresh2=cv2.threshold(grayImage,127,255,cv2.THRESH_BINARY_INV)  
ret,thresh3=cv2.threshold(grayImage,127,255,cv2.THRESH_TRUNC)  
ret,thresh4=cv2.threshold(grayImage,127,255,cv2.THRESH_TOZERO)  
ret,thresh5=cv2.threshold(grayImage,127,255,cv2.THRESH_TOZERO_INV)

#显示结果
titles = ['Gray Image','BINARY','BINARY_INV','TRUNC',
'TOZERO','TOZERO_INV']  
images = [grayImage, 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()

输出结果如图7所示:

三.自适应阈值化处理

前面讲解的是固定值阈值化处理方法,而当同一幅图像上的不同部分具有不同亮度时,上述方法就不在适用。此时需要采用自适应阈值化处理方法,根据图像上的每一个小区域,计算与其对应的阈值,从而使得同一幅图像上的不同区域采用不同的阈值,在亮度不同的情况下得到更好的结果。

自适应阈值化处理在OpenCV中调用cv2.adaptiveThreshold()函数实现,其原型如下所示:

dst = adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])

– src表示输入图像

– dst表示输出的阈值化处理后的图像,其类型和尺寸需与src一致

– maxValue表示给像素赋的满足条件的最大值

– adaptiveMethod表示要适用的自适应阈值算法,常见取值包括ADAPTIVE_THRESH_MEAN_C(阈值取邻域的平均值) 或 ADAPTIVE_THRESH_GAUSSIAN_C(阈值取自邻域的加权和平均值,权重分布为一个高斯函数分布)

– thresholdType表示阈值类型,取值必须为THRESH_BINARY或THRESH_BINARY_INV

– blockSize表示计算阈值的像素邻域大小,取值为3、5、7等

– C表示一个常数,阈值等于平均值或者加权平均值减去这个常数

当阈值类型thresholdType为THRESH_BINARY时,其灰度图像转换为阈值化图像的计算公式如下所示:

当阈值类型thresholdType为THRESH_BINARY_INV时,其灰度图像转换为阈值化图像的计算公式如下所示:

其中,dst(x,y)表示阈值化处理后的灰度值,T(x,y)表示计算每个单独像素的阈值,其取值如下:

当adaptiveMethod参数采用ADAPTIVE_THRESH_MEAN_C时,阈值T(x,y)为blockSize×blockSize邻域内(x,y)减去参数C的平均值。

当adaptiveMethod参数采用ADAPTIVE_THRESH_GAUSSIAN_C时,阈值T(x,y)为blockSize×blockSize邻域内(x,y)减去参数C与高斯窗交叉相关的加权总和。
下面的代码是对比固定值阈值化与自适应阈值化处理的方法。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
import matplotlib

#读取图像
img = cv2.imread('miao.png')

#图像灰度化处理
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  

#固定值阈值化处理
r, thresh1 = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)  

#自适应阈值化处理 方法一
thresh2 = cv2.adaptiveThreshold(grayImage, 255, 
cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

#自适应阈值化处理 方法二
thresh3 = cv2.adaptiveThreshold(grayImage, 255, 
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

#设置字体
matplotlib.rcParams['font.sans-serif']=['SimHei']

#显示图像
titles = ['灰度图像', '全局阈值', '自适应平均阈值', '自适应高斯阈值']
images = [grayImage, thresh1, thresh2, thresh3]
for i in range(4):
   plt.subplot(2, 2, i 1), plt.imshow(images[i], 'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])
plt.show()

输出结果如图8所示,左上角为灰度化处理图像;右上角为固定值全局阈值化处理图像(cv2.threshold);左下角为自适应邻域平均值分割,噪声较多;右下角为自适应邻域加权平均值分割,采用高斯函数分布,其效果相对较好。

四.总结

本文主要讲解了图像阈值化处理知识,调用OpenCV的threshold()实现固定阈值化处理,调用adaptiveThreshold()函数实现自适应阈值化处理。本文知识点将为后续的图像处理提供良好的基础。

以上就是Python图像运算之图像阈值化处理详解的详细内容,更多关于Python图像阈值化处理的资料请关注Devmax其它相关文章!

Python图像运算之图像阈值化处理详解的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  3. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  4. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  7. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  8. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

  9. 在Android上用Java嵌入Python

    解决方法看看this,它适用于J2SE,你可以尝试在Android上运行.

  10. 在android studio中使用python代码构建android应用程序

    我有一些python代码和它的机器人,我正在寻找一种方法来使用android项目中的那些python代码.有没有办法做到这一点!?解决方法有两种主要工具可供使用,它们彼此不同:>QPython>Kivy使用Kivy,大致相同的代码也可以部署到IOS.

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部