文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python图像阈值化怎么处理

2023-06-30 05:57

关注

这篇“Python图像阈值化怎么处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python图像阈值化怎么处理”文章吧。

一.图像阈值化

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

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

Python图像阈值化怎么处理

当某个像素点的灰度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所示。

Python图像阈值化怎么处理

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

Python图像阈值化怎么处理

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

1.二进制阈值化

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

Python图像阈值化怎么处理

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

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

# -*- coding: utf-8 -*-# By:Eastmountimport 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。

Python图像阈值化怎么处理

2.反二进制阈值化

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

Python图像阈值化怎么处理

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

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

# -*- coding: utf-8 -*-# By:Eastmountimport 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所示:

Python图像阈值化怎么处理

3.截断阈值化

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

Python图像阈值化怎么处理

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

# -*- coding: utf-8 -*-# By:Eastmountimport 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之间。

Python图像阈值化怎么处理

4.阈值化为0

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

Python图像阈值化怎么处理

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

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

# -*- coding: utf-8 -*-# By:Eastmountimport 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。

Python图像阈值化怎么处理

5.反阈值化为0

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

Python图像阈值化怎么处理

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

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

# -*- coding: utf-8 -*-# By:Eastmountimport 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所示:

Python图像阈值化怎么处理

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

# -*- coding: utf-8 -*-# By:Eastmountimport cv2  import numpy as np  import matplotlib.pyplot as plt#读取图像img=cv2.imread('miao.png')grayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  #阈值化处理ret,thresh2=cv2.threshold(grayImage,127,255,cv2.THRESH_BINARY)  ret,thresh3=cv2.threshold(grayImage,127,255,cv2.THRESH_BINARY_INV)  ret,thresh4=cv2.threshold(grayImage,127,255,cv2.THRESH_TRUNC)  ret,thresh5=cv2.threshold(grayImage,127,255,cv2.THRESH_TOZERO)  ret,thresh6=cv2.threshold(grayImage,127,255,cv2.THRESH_TOZERO_INV)#显示结果titles = ['Gray Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']  images = [grayImage, thresh2, thresh3, thresh4, thresh5, thresh6]  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所示:

Python图像阈值化怎么处理

三.自适应阈值化处理

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

自适应阈值化处理在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时,其灰度图像转换为阈值化图像的计算公式如下所示:

Python图像阈值化怎么处理

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

Python图像阈值化怎么处理

其中,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:Eastmountimport cv2  import numpy as np  import matplotlib.pyplot as pltimport matplotlib#读取图像img = cv2.imread('miao.png')#图像灰度化处理grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  #固定值阈值化处理r, thresh2 = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)  #自适应阈值化处理 方法一thresh3 = cv2.adaptiveThreshold(grayImage, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)#自适应阈值化处理 方法二thresh4 = cv2.adaptiveThreshold(grayImage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)#设置字体matplotlib.rcParams['font.sans-serif']=['SimHei']#显示图像titles = ['灰度图像', '全局阈值', '自适应平均阈值', '自适应高斯阈值']images = [grayImage, thresh2, thresh3, thresh4]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);左下角为自适应邻域平均值分割,噪声较多;右下角为自适应邻域加权平均值分割,采用高斯函数分布,其效果相对较好。

Python图像阈值化怎么处理

以上就是关于“Python图像阈值化怎么处理”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯