欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。
该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。
第二部分将讲解图像运算和图像增强,上一篇文章介绍图像灰度非线性变换,包括对数变换、幂次变换、指数变换、分段函数变换。这篇文章将详细讲解图像阈值化处理,涉及阈值化处理、固定阈值化处理和自适应阈值化处理,这是图像边缘检测或图像增强等处理的基础。希望文章对您有所帮助,如果有不足之处,还请海涵。
图像阈值化可以理解为一个简单的图像分割操作,阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的像素点使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。
下载地址:
前文赏析:
第一部分 基础语法
第二部分 网络爬虫
第三部分 数据分析和机器学习
第四部分 Python图像处理基础
第五部分 Python图像运算和图像增强
第六部分 Python图像识别和图像高阶案例
第七部分 NLP与文本挖掘
第八部分 人工智能入门知识
第九部分 网络攻防与AI安全
第十部分 知识图谱构建实战
扩展部分 人工智能高级案例
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分开来。
灰度化处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。阈值化处理可以将图像中的像素划分为两类颜色,常见的阈值化算法如公式(1)所示:
当某个像素点的灰度Gray(i,j)小于阈值T时,其像素设置为0,表示黑色;当灰度Gray(i,j)大于或等于阈值T时,其像素值为255,表示白色。
在Python的OpenCV库中,提供了固定阈值化函数threshold()和自适应阈值化函数adaptiveThreshold(),将一幅图像进行阈值化处理[3-4]。
OpenCV中提供了函数threshold()实现固定阈值化处理,其函数原型如下:
其中,threshold()函数不同类型的处理算法如表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。
该函数的原型为 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所示:
该函数的原型为 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之间。
该函数的原型为 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。
该函数的原型为 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()函数实现,其原型如下所示:
当阈值类型thresholdType为THRESH_BINARY时,其灰度图像转换为阈值化图像的计算公式如下所示:
当阈值类型thresholdType为THRESH_BINARY_INV时,其灰度图像转换为阈值化图像的计算公式如下所示:
其中,dst(x,y)表示阈值化处理后的灰度值,T(x,y)表示计算每个单独像素的阈值,其取值如下:
下面的代码是对比固定值阈值化与自适应阈值化处理的方法。
# -*- 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()函数实现自适应阈值化处理。本文知识点将为后续的图像处理提供良好的基础。
感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:
亲情是真的很美,很治愈。希望小珞珞和他妈妈能开心每一天,全家人身体健康。
(By:娜璋之家 Eastmount 2022-04-18 夜于武汉 https://blog.csdn.net/Eastmount )
参考文献: