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

相关推荐
阿拉斯攀登21 小时前
YOLO 视觉检测全栈核心名词指南:从训练调参到边缘部署,商用落地必懂
人工智能·yolo·计算机视觉·视觉检测·bytetrack
ComputerInBook1 天前
opencv图像处理——存储结构 Mat (Matrices)
图像处理·人工智能·opencv
Daydream.V1 天前
OpenCV高端操作——光流估计(附案例)
人工智能·opencv·计算机视觉
gorgeous(๑>؂<๑)1 天前
【CVPR26-索尼】EW-DETR:通过增量低秩检测Transformer实现动态世界目标检测
人工智能·深度学习·目标检测·计算机视觉·transformer
格林威1 天前
Baumer相机锂电池极片裁切毛刺检测:防止内部短路的 5 个核心方法,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·视觉检测
三枪一个麻辣烫1 天前
gemini Adobe Illustrator visio draw.io画图
图像处理·人工智能·甘特图
F1FJJ1 天前
AI 编程实战对比:Claude Code vs Trae
图像处理·人工智能·ai作画·golang·visual studio code
xinxiangwangzhi_1 天前
立体匹配--GCNet(2017)
计算机视觉
bryant_meng1 天前
【AI】《Explainable Machine Learning》(2)
人工智能·深度学习·机器学习·计算机视觉·explanation
xinxiangwangzhi_1 天前
立体匹配--Dispnet(2016)
计算机视觉