Python图像运算之图像阈值化处理详解

目录
  • 一.图像阈值化
  • 二.固定阈值化处理
    • 1.二进制阈值化
    • 2.反二进制阈值化
    • 3.截断阈值化
    • 4.阈值化为0
    • 5.反阈值化为0
  • 三.自适应阈值化处理
  • 四.总结

一.图像阈值化

图像阈值化(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图像阈值化处理的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python图像运算之图像灰度线性变换详解

    目录 一.灰度线性变换 二.图像灰度上移变换 三.图像对比度增强变换 四.图像对比度减弱变换 五.图像灰度反色变换 六.总结 一.灰度线性变换 图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度.灰度线性变换的计算公式如(12-1)所示: 该公式中DB表示灰度线性变换后的灰度值,DA表示变换前输入图像的灰度值,α和b为线性变换方程f(D)的参数,分别表示斜率和截距[1-4]. 当α=1,b=0时,保持原始图像 当α=1,b!=0时,图像

  • Python图像阈值化处理及算法比对实例解析

    图像的二值化或阈值化(Binarization)旨在提取图像中的目标物体,将背景以及噪声区分开来.通常会设定一个阈值T,通过T将图像的像素划分为两类:大于T的像素群和小于T的像素群. 灰度转换处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度.二值化处理可以将图像中的像素划分为两类颜色,常用的二值化算法如公式1所示: {Y=0,gray<TY=255,gray>=T {Y=0,gray<TY=255,gray>=T​ 当灰度Gray小于阈值T时,其像素设置为0,表示黑色:

  • Python图像运算之图像点运算与灰度化处理详解

    目录 一.图像点运算概念 二.图像灰度化处理 三.基于像素操作的图像灰度化处理 1.最大值灰度处理方法 2.平均灰度处理方法 3.加权平均灰度处理方法 四.总结 一.图像点运算概念 图像点运算(Point Operation)指对于一幅输入图像,将产生一幅输出图像,输出图像的每个像素点的灰度值由输入像素点决定.点运算实际上是灰度到灰度的映射过程,通过映射变换来达到增强或者减弱图像的灰度.还可以对图像进行求灰度直方图.线性变换.非线性变换以及图像骨架的提取.它与相邻的像素之间没有运算关系,是一种简

  • Python图像运算之图像灰度非线性变换详解

    目录 一.图像灰度非线性变换 二.图像灰度对数变换 三.图像灰度伽玛变换 四.总结 一.图像灰度非线性变换 原始图像的灰度值按照DB=DA×DA/255的公式进行非线性变换,其代码如下: # -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #读取原始图像 img = cv2.imread('luo.png') #图像灰度转换 grayImage =

  • 基于Python的图像阈值化分割(迭代法)

    1.阈值化分割原理 通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类.一般情况下,当图像由灰度值相差较大的目标和背景组成时,如果目标区域内部像素灰度分布均匀一致,背景区域像素在另一个灰度级上也分布均匀,这时图像的灰度直方图会呈现出双峰特性. 在这种情况下,选取位于这两个峰值中间的谷底对应的灰度值T作为灰度阈值,将图像中各个像素的灰度值与这个阈值进行比较,根据比较的结果将图像中的像素划分到两个类中.像素灰度值大于阈值T的像素点归为一类,其余像素点归为另一类.经阈值化处理后的

  • Python图像运算之图像阈值化处理详解

    目录 一.图像阈值化 二.固定阈值化处理 1.二进制阈值化 2.反二进制阈值化 3.截断阈值化 4.阈值化为0 5.反阈值化为0 三.自适应阈值化处理 四.总结 一.图像阈值化 图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分开来. 灰度化处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度.阈值化处理可以将图像中的像素划分为两类颜色,常见的阈值化算法如公式(1)所示: 当某个像素点的灰度Gray(i,j)小于

  • python time模块时间戳 与 结构化时间详解

    目录 time模块 1. 时间戳 1.1 time.time() 1.2 时间戳 转 字符串 2. 结构化时间 2.1 本地时间 2.2 格林威治时间(零时区) 2.3 结构化时间 转 字符串 2.4 字符串 转 结构化时间 2.5 结构化数据的属性 2.6 结构化时间 转 时间戳 time模块 1:概述 时间表示的分类 时间戳 格式化的时间字符串 结构化时间 时间戳:时间戳表示的是从1970年1月1日整0点到目前秒的偏移量,数据类型是浮点型,主要用来让计算机看的 格式化的时间字符串:如 201

  • Python图像运算之图像灰度直方图对比详解

    目录 一.灰度增强直方图对比 二.灰度减弱直方图对比 三.图像反色直方图对比 四.图像对数变换直方图对比 五.图像阈值化处理直方图对比 六.总结 一.灰度增强直方图对比 图像灰度上移变换使用的表达式为: DB=DA+50 该算法将实现图像灰度值的上移,从而提升图像的亮度,结合直方图对比的实现代码如下所示. # -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as

  • Python图像运算之图像掩膜直方图和HS直方图详解

    目录 一.图像掩膜直方图 二.图像HS直方图 三.直方图判断白天黑夜 四.总结 一.图像掩膜直方图 如果要统计图像的某一部分直方图,就需要使用掩码(蒙板)来进行计算.假设将要统计的部分设置为白色,其余部分设置为黑色,然后使用该掩膜进行直方图绘制,其完整代码如下所示. # -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt import matplotl

  • OpenCV学习之图像加噪与滤波的实现详解

    目录 一.实验内容 二.实验环境和配置 三.实验原理及操作 1. 添加噪声 2.噪声二值化 3. 滤波处理 四.实验结果 2.椒盐噪声二值图与白噪声二值图 3.椒盐噪声处理图经处理后图像 4.白噪声处理图经处理后图像 五.结果分析 六.实验源码 一.实验内容 编写一Python程序,要求实现以下功能: 读入一幅图像. 使用两种以上的方法分别向图像中添加噪声. 输出一幅二值图像,图像中未加入噪声的区域为黑色,加入噪声的区域为白色. 使用三种滤波方法对上述添加了噪声的图像进行滤波处理. 输出滤波处理

  • Matlab中图像数字水印算法的原理与实现详解

    目录 一.背景意义 二.基本原理 三.算法介绍 3.1 数字水印嵌入 3.2 数字水印提取 四.程序实现 一.背景意义 数字水印技术作为信息隐藏技术的一个重要分支,是将信息(水印)隐藏于数字图像.视频.音频及文本文档等数字媒体中,从而实现隐秘传输.存储.标注.身份识别.版权保护和防篡改等目的. 随着 1996 年第一届信息隐藏国际学术研讨会的召开,数字水印技术的研究得到了迅速的发展,不少政府机构和研究部门加大了对其的研究力度,其中包括美国财政部.美国版权工作组.美国洛斯阿莫斯国家实验室.美国海陆

  • Python+OpenCV实现信用卡数字识别的方法详解

    目录 一.模板图像处理 二.信用卡图片预处理 一.模板图像处理 (1)灰度图.二值图转化 template = cv2.imread('C:/Users/bwy/Desktop/number.png') template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) cv_show('template_gray', template_gray) # 形成二值图像,因为要做轮廓检测 ret, template_thresh = cv2.thre

随机推荐