OpenCV轻松入门_面向python(第六章 阈值处理)

阈值处理:剔除图像的像素值高于或低于一定值的像素点。

threshold函数

语法格式:
retval, dst = cv2.threshold( src, thresh, maxval, type )

  • retval 代表返回的阈值。
  • dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型。
  • src 代表要进行阈值分割的图像,可以是多通道的,8 位或 32 位浮点型数值。
  • thresh 代表要设定的阈值
  • maxval 代表当 type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 类型时,需要设定的最大值
  • type 代表阈值分割的类型

阈值分割类型

阈值分割类型可视化

二值化阈值处理(cv2.THRESH_BINARY)

二值化阈值处理会将原始图像处理为仅有两个值的二值图像;对于灰度值大于 阈值thresh的像素点,将其灰度值设定为最大值;对于灰度值小于或等于阈值thresh的像素点,将其灰度值设定为 0。

用函数 cv2.threshold()对数组进行二值化阈值处理

python 复制代码
import cv2  
import numpy as np  
img = np.random.randint(0,256,size = [4,5],dtype=np.uint8)  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
print("img=\n",img)  
print("t=\n",t)  
print("rst=\n",rst)

使用函数 cv2.threshold()对图像进行二值化阈值处理

python 复制代码
import cv2  
import numpy as np  
img = cv2.imread("lena.jpg")  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
cv2.imshow("img",img)  
cv2.imshow("rst",rst)  
cv2.waitKey()  
cv2.destroyAllWindows()

r)

反二值化阈值处理(cv2.THRESH_BINARY_INV)

对于灰度值大于阈值的像素点,将其值设定为 0;对于灰度值小于或等于阈值的像素点,将其值设定为 255。

用函数 cv2.threshold()对图像进行反二值化阈值处理

python 复制代码
import cv2  
import numpy as np  
img = cv2.imread("lena.jpg")  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)  
cv2.imshow("img",img)  
cv2.imshow("rst",rst)  
cv2.waitKey()  
cv2.destroyAllWindows()

截断阈值化处理(cv2.THRESH_TRUNC)

截断阈值化处理会将图像中大于阈值的像素点的值设定为阈值,小于或等于该阈值的像素点的值保持不变。

用函数 cv2.threshold()对图像进行截断阈值化处理。

python 复制代码
import cv2  
import numpy as np  
img=cv2.imread("lena.jpg")  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)  
cv2.imshow("img",img)  
cv2.imshow("rst",rst)  
cv2.waitKey()  
cv2.destroyAllWindows()

超阈值零处理(cv2.THRESH_TOZERO_INV)

超阈值零处理会将图像中大于阈值的像素点的值处理为 0,小于或等于该阈值的像素点的值保持不变。

python 复制代码
import cv2  
import numpy as np  
img=cv2.imread("lena.jpg")  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)  
cv2.imshow("img",img)  
cv2.imshow("rst",rst)  
cv2.waitKey()  
cv2.destroyAllWindows()

低阈值零处理(cv2.THRESH_TOZERO)

对于像素值大于阈值的像素点,其值将保持不变; 对于像素值小于或等于阈值的像素点,其值将被处理为 0。

用函数 cv2.threshold()对图像进行低阈值零处理。

python 复制代码
import cv2
img = cv2.imread("lena.jpg")
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()

自适应阈值处理

在进行阈值处理时,自适应阈值处理的方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。与普通的阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像。

函数 cv2.adaptiveThreshold()来实现自适应阈值处理,该函数的语法格式为:
dst=cv.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)

  • dst 代表自适应阈值处理结果。
  • src 代表要进行处理的原始图像。需要注意的是,该图像必须是 8 位单通道的图像。
  • maxValue 代表最大值。
  • adaptiveMethod 代表自适应方法:
    cv2.ADAPTIVE_THRESH_MEAN_C :邻域所有像素点的权重值是一致的。
    cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值。
  • thresholdType 代表阈值处理方式,该值必须是 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 中的一个。
  • blockSize 代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为 3、5、7 等。
  • C 是常量。
python 复制代码
import cv2  
img = cv2.imread("computer.jpg",0)  
t1,thd = cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)  
athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)  
cv2.imshow("img",img)  
cv2.imshow("thd",thd)  
cv2.imshow("athdMEAN",athdMEAN)  
cv2.imshow("athdGAUS",athdGAUS)  
cv2.waitKey()  
cv2.destroyAllWindows()

Otsu处理

Otsu 方法能够根据当前图像给出最佳的类间分割阈值

即:遍历 所有可能的阈值,找出最佳的阈值。

在函数 cv2.threshold()中对参数 type 的类型多传递一个参数cv2.THRESH_OTSU,可实现Otsu的阈值分割;使用 Otsu 方法时,要把阈值设为 0。此时的函数 cv2.threshold()会自动寻找最优阈值,并将该阈值返回。
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

测试 Otsu 阈值处理的实现。

python 复制代码
import cv2  
import numpy as np  
img = np.zeros((5,5),dtype=np.uint8)  
img[0:6,0:6]=123  
img[2:6,2:6]=126  
print("img=\n",img)  
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
print("thd=\n",thd)  
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)  
print("otsu=\n",otsu)

别对一幅图像进行普通的二值化阈值处理和 Otsu 阈值处理,观察处理结果的差异。

python 复制代码
import cv2  
img = cv2.imread("tiffany.bmp",0)  
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)  
cv2.imshow("thd",thd)  
cv2.imshow("otsu",otsu)  
cv2.waitKey()  
cv2.destroyAllWindows()
相关推荐
霍格沃兹测试开发学社测试人社区4 小时前
新手指南:通过 Playwright MCP Server 为 AI Agent 实现浏览器自动化能力
运维·人工智能·自动化
JJJJ_iii5 小时前
【机器学习01】监督学习、无监督学习、线性回归、代价函数
人工智能·笔记·python·学习·机器学习·jupyter·线性回归
qq_416276427 小时前
LOFAR物理频谱特征提取及实现
人工智能
Python图像识别7 小时前
71_基于深度学习的布料瑕疵检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
python·深度学习·yolo
余俊晖7 小时前
如何构造一个文档解析的多模态大模型?MinerU2.5架构、数据、训练方法
人工智能·文档解析
千码君20168 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
淮北4949 小时前
windows安装minicoda
windows·python·conda
Akamai中国9 小时前
Linebreak赋能实时化企业转型:专业系统集成商携手Akamai以实时智能革新企业运营
人工智能·云计算·云服务
LiJieNiub10 小时前
读懂目标检测:从基础概念到主流算法
人工智能·计算机视觉·目标跟踪