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

相关推荐
肥猪猪爸23 分钟前
计算机视觉中的Mask是干啥的
图像处理·人工智能·深度学习·神经网络·目标检测·计算机视觉·视觉检测
智驱力人工智能2 小时前
仓库园区无人机烟雾识别:构建立体化、智能化的早期火灾预警体系 无人机烟雾检测 无人机动态烟雾分析AI系统 无人机辅助火灾救援系统
人工智能·opencv·算法·目标检测·架构·无人机·边缘计算
jamie_chu2 小时前
显微图像采集 - 工业摄像机与图像采集软件介绍
图像处理·数码相机·camera·摄像头·图像测量·jcamerapro
格林威2 小时前
双目视觉标定:消除视差误差的7种核心方案,附OpenCV+Halcon实现代码!
人工智能·数码相机·opencv·计算机视觉·视觉检测·制造
却道天凉_好个秋2 小时前
OpenCV(四十四):SIFT计算描述子
人工智能·opencv·计算机视觉
LiYingL2 小时前
USO“,一种基于分离和奖励学习的新方法:走在将风格和主题融为一体的图像生成的最前沿
人工智能·学习·计算机视觉
一方热衷.2 小时前
对图像分割的图片进行缩放的同时调整JSON标签
人工智能·计算机视觉·json
Das13 小时前
【计算机视觉】05_不变性
人工智能·计算机视觉
OAK中国_官方3 小时前
将Roboflow工作流引入OAK4:简化实时计算机视觉
人工智能·计算机视觉
智驱力人工智能3 小时前
森林防火无人机火焰监测系统 构建“天空地”一体化智能防火体系 无人机火焰检测,支持红色火焰检测 城市高层建筑无人机火焰识别
人工智能·深度学习·opencv·算法·目标检测·无人机·边缘计算