OpenCV 第10课 图像处理—阈值处理

1. 图像二值化

图像二值化就是将图像上的像素点的灰度值设置为两个值,一般为0(表示黑色)和255(表示白色),可以将整个图像呈现出明显的黑白效果。

最常用的方法就是先将图像灰度处理,然后设定一个阈值,用该阈值将图像分成两个部分,即大于阈值的部分和小于阈值的部分,然后再将两部分图像分别赋予不同像素值。

图像二值化有利于图像的进一步处理,使图像变得简单,并且减少了书质量,可以凹显出感兴趣的目标轮廓。

阈值处理根据不同的情况,可以选择三种处理方式:全局阈值处理,自适应阈值处理和Otsu阈值处理。

2. 全局阈值处理

python 复制代码
import cv2

img = cv2.imread('test10.1.jpg')
img_gray=cv2.cvtColor(img , cv2.COLOR_BGR2GRAY)
ret, img2 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)

cv2.imshow("BINARY",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

全局阈值处理会按照设定好的阈值来处理整个图像

阈值处理函数:

threshold(src, thresh, maxval, type)

  1. 第一个参数"src",是要阈值处理的图像。
  2. 第二个参数"thresh",是设定的阈值。
  3. 第三个参数"maxval",当type 指定为THRESH_BINARY 或THRESH_BINARY_INV时,才需要设置该值,指的是高于(低于)阈值时赋予的新值。
  4. 第四个参数"type",阈值的处理方法,具体如下:
  • cv2.THRESH_BINARY:超过阈值部分取maxval,否则取0;此方法会将原始图像处理为仅有两个值的二值图像,对于灰度值大于阈值的像素点,将其灰度值设定为最大值。对于灰度值小于或等于阈值的像素点,将其灰度值设定为0。
  • cv2.THRESH_BINARY_INV:大于阈值的部分变为0,其他部分变为maxval;此方法会将原始图像处理为仅有两个值的二值图像,对于灰度值大于阈值的像素点,将其灰度值设定为0。对于灰度值小于或等于阈值的像素点,将其灰度值设定为最大值。
  • cv2.THRESH_TRUNC:大于阈值部分设为阈值,否则不变,相当于进行一个截断;此方法会将图像中大于阈值的像素点的值设定为阈值,小于或等于该阈值的像素点的值保持不变。
  • cv2.THRESH_TOZERO:大于阈值部分不改变,否则设为0;此方法会将图像中小于或等于阈值的像素点的值处理为0,大于阈值的像素点的值保持不变。即先选定一个阈值,然后对于像素值大于阈值的像素点,其值将保持不变。对于像素值小于或等于阈值的像素点,其值将被处理为0。
  • cv2.THRESH_TOZERO_INV:大于阈值的部分变为0,其余部分不变。会将图像中大于阈值的像素点的值处理为0,小于或等于该阈值的像素点的值保持不变。即先选定一个阈值,然后对于像素值大于阈值的像素点,其像素值将被处理为0。对于像素值小于或等于阈值的像素点,其像素值将保持不变。

3. 自适应阈值处理

自适应阈值会局部计算每一个区域阈值来处理图像。

对于一副色彩均衡的图像,一般直接将阈值设为127,这个阈值是经验获得的,设置这个阈值比较合适。

python 复制代码
import cv2
img = cv2.imread("test10.1.jpg")
img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img2 = cv2.adaptiveThreshold(img_gray, 255 , cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)
cv2.imshow("BINARY",img2)
cv2.waitKey(0)
cv2.destoryAllWindows()

但是,当有的图像色彩分布不均衡时,用127这个阈值,效果就会很差,此时就要考虑别的阈值处理方法,比如自适应阈值处理方法或Otsu方法,而自适应阈值就是再图像上每一个小区域计算与其对应的阈值。

自适应阈值处理函数:

adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

  1. 第一个参数"src",是要阈值处理的图像。
  2. 第二个参数"maxValue",当参数thresholdType 为cvTHRESH_BINARY 或者cvTHRESH_BINARY_INV 时,该参数表示高于(低于)阈值时赋予的新值。
  3. 第三个参数"adaptiveMethod",计算自适应阈值的方法,具体方法如下:
  • cv2.ADAPTIVE_THRESH_MEAN_C:这种方法是将邻域所有像素点的权重值都取一样;
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:这种方法是通过高斯公式获得邻域所有像素点的权重值。这种权重值的选取就跟各邻域像素点到目标像素点的距离有关,距离越近权重越高,距离越远权重越低。
  • 第四个参数"thresholdType",表示阈值处理方式,这个参数是和maxValue
  • 一起搭配使用的。这个参数只能选择cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。
  • 第五个参数"blockSize",表示邻域尺寸的大小,一般取3,5,7 等。
  • 第六个参数"C",是常量,阈值等于平均值或者加权平均值减去这个常数。这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。

4. Otsu阈值处理

Otsu阈值会自动计算出合适的阈值,Otsu方法又称最大类间方差法,通过把像素分类为两类或多类,计算类间方差,当方差达到最大值时,类分割线(即灰度值)就作为图像分割阈值。

python 复制代码
import cv2

img = cv2.imread('test10.1.jpg')
img_gray=cv2.cvtColor(img , cv2.COLOR_BGR2GRAY)
ret, img2 = cv2.threshold(img_gray,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)

cv2.imshow("BINARY",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Otsu阈值处理就是在threshold函数的参数type中,多传入一个参数cv2.THRESH_OTSU就可实现Otsu阈值分割,例如:

cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU),这里就要把thresh参数设为0,type参数设为cv2.THRESH_BINARY+cv2.THRESH_OTSU

相关推荐
陈嘿萌40 分钟前
CVPR 2026 | 全新的五模态信息融合数据集,包括RGB、事件、热成像、4D 雷达与 LiDAR
人工智能·深度学习·计算机视觉·自动驾驶·学术研究与理论基础·点云雷达
陈嘿萌2 小时前
TPAMI 2026|红外、SAR、深度与地图能否用一套特征匹配?北理工HIMO给出无需预训练的通用路线
图像处理·人工智能·深度学习·计算机视觉·图像匹配·学术研究与理论基础
陈嘿萌2 小时前
TIP 2026 | SCAC:不用训练也能做视频时刻检索,让事件链与边界校准协同
图像处理·人工智能·深度学习·计算机视觉·学术研究与理论基础
LittroInno2 小时前
全景拼接中的重叠区域 视差与动态重影
图像处理·opencv·计算机视觉·图像配准·全景拼接
陈嘿萌15 小时前
ICML 2026|浙大 1D-Fusion:用 Tokenizer 将图像“压”成一维 Token,重构融合表示
图像处理·人工智能·计算机视觉·图像融合·计算机科学与技术·学术研究与理论基础·顶级期刊与会议
benjiangliu18 小时前
PixInsight入门教程-2-STF工具与线性图像
图像处理
陈嘿萌18 小时前
TPAMI 2026|武大 DuS-DiFuse:图像融合从“拼信息”走向“补语义”,兼顾真实退化鲁棒性
图像处理·人工智能·计算机视觉·图像融合·计算机科学与技术·学术研究与理论基础·顶级期刊会议
陈嘿萌19 小时前
TIP 2026|没有分割标签,也能做任务导向图像融合:SSVIF的自监督语义注入
图像处理·人工智能·深度学习·计算机视觉·图像融合·学术研究与理论基础
benjiangliu20 小时前
PixInsight入门教程-4-背景提取-工具使用
图像处理
一木 之林20 小时前
LangChain 第3章 消息与提示词模板:四类消息、历史管理与 ChatPromptTemplate
人工智能·计算机视觉·langchain