千家信息网

Python图像阈值化怎么处理

发表于:2025-02-19 作者:千家信息网编辑
千家信息网最后更新 2025年02月19日,这篇"Python图像阈值化怎么处理"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"P
千家信息网最后更新 2025年02月19日Python图像阈值化怎么处理

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

    一.图像阈值化

    图像阈值化(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: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。

    2.反二进制阈值化

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

    当前像素点的灰度值大于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所示:

    3.截断阈值化

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

    比如阈值为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之间。

    4.阈值化为0

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

    当前像素点的灰度值大于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。

    5.反阈值化为0

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

    当前像素点的灰度值大于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所示:

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

    # -*- 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所示:

    三.自适应阈值化处理

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

    自适应阈值化处理在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: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图像阈值化怎么处理"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

    阈值 处理 图像 灰度 像素 函数 类型 结果 输出 二进制 方法 如图 代码 原型 平均值 邻域 utf-8 不同 最大 参数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库营销最早从哪里来 企业如何进行网络安全管理 软件开发人员的日报应该如何写 福州晶致网络技术有限公司 计算机网络技术重点学什么 nosql数据库分析 网络安全方面的实操视频 交易猫平台的服务器怎么填 公司经营范围为软件开发 梦幻西游2016服务器 重庆正规软件开发价格表 江苏服务器风扇品质保障 东莞酒店软件开发程序 计算机网络技术好不好 办公软件开发费怎么列账 软件开发逻辑会记录在哪里 计算机网络技术 构成超网 浙江语音网络技术服务市场价 华为网络技术工程师 干嘛的 兴化租房网络安全 朝阳区网络技术服务优点 携程数据库技术提取 东南亚服务器放哪好 江西智能化软件开发零售价 什么是嵌入式底层软件开发 保德到太原经过几个服务器 綦江区一站式软件开发服务特点 我的世界网易版EC服务器所有礼盒 光明区网络技术转移诚信服务 河南省网络安全密码
    0