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()
相关推荐
boonya几秒前
Langchain 和LangGraph 为何是AI智能体开发的核心技术
人工智能·langchain
元宇宙时间3 分钟前
DID联盟:Web3数字主权基础设施的战略构建
人工智能·web3·区块链
点云SLAM5 分钟前
弱纹理图像特征匹配算法推荐汇总
人工智能·深度学习·算法·计算机视觉·机器人·slam·弱纹理图像特征匹配
mwq3012325 分钟前
旋转位置编码RoPE:用旋转艺术,解开 Transformer 的位置之谜
人工智能
赵得C30 分钟前
人工智能的未来之路:华为全栈技术链与AI Agent应用实践
人工智能·华为
糖葫芦君37 分钟前
25-GRPO IS SECRETLY A PROCESS REWARD MODEL
人工智能·大模型
俊男无期1 小时前
【AI入门】通俗易懂讲AI(初稿)
人工智能
工业互联网专业1 小时前
基于协同过滤算法的小说推荐系统_django+spider
python·django·毕业设计·源码·课程设计·spider·协同过滤算法
星星的月亮叫太阳1 小时前
large-scale-DRL-exploration 代码阅读 总结
python·算法