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

相关推荐
Hua-Jay1 小时前
OpenCV联合C++/Qt 学习笔记(二十二)----相机模型与投影及单目相机标定
c++·笔记·qt·opencv·学习·计算机视觉
凌峰的博客1 小时前
T2SMark:在扩散模型噪声水印中寻找鲁棒性与多样性的平衡
人工智能·深度学习·计算机视觉
小白|2 小时前
CANN目标检测实战:自定义检测算子开发(插件机制)
人工智能·目标检测·计算机视觉
乐迪信息3 小时前
乐迪信息:港口夜间船舶巡查难,AI摄像机法全天候监测
人工智能·物联网·算法·计算机视觉·目标跟踪
sali-tec3 小时前
C# 基于OpenCv的视觉工作流-章74-线-线距离
图像处理·人工智能·opencv·算法·计算机视觉
问窗3 小时前
计算机视觉入门案例 高速公路车辆计数系统技术解析
python·opencv·计算机视觉
日光明媚3 小时前
深度解析 SGLang 框架 Wan2.1 视频生成加速技术:从 49 分钟到 1 分钟的极致优化
人工智能·计算机视觉·aigc·音视频·sglang
深度学习lover4 小时前
<数据集>yolo 电线杆识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·电线杆识别
z小猫不吃鱼16 小时前
06 ViT 为什么需要大规模数据?从归纳偏置理解 ViT 的训练特点
深度学习·计算机视觉·cnn
charlie11451419116 小时前
现代Qt开发教程(新手篇)2.3——QImage、QPixmap、QIcon 图像处理基础
开发语言·图像处理·qt