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

相关推荐
xsc-xyc5 小时前
RuntimeError: Dataset ‘/data.yaml‘ error ❌ ‘_lz
人工智能·深度学习·yolo·计算机视觉·视觉检测
星爷AG I7 小时前
9-28 视觉工作记忆(AGI基础理论)
人工智能·计算机视觉·agi
橙露8 小时前
视觉检测中的数字光纤放大器的核心参数和调整
人工智能·计算机视觉·视觉检测
北京青翼科技8 小时前
【PCIe732】青翼PCIe采集卡-优质光纤卡- PCIe接口-万兆光纤卡
图像处理·人工智能·fpga开发·智能硬件·嵌入式实时数据库
AAD555888999 小时前
基于Mask_RCNN的猫科动物目标检测识别模型实现与分析
人工智能·目标检测·计算机视觉
LittroInno10 小时前
TVMS视频管理平台 —— 多种目标跟踪模式
人工智能·计算机视觉·目标跟踪
没有不重的名么11 小时前
Multiple Object Tracking as ID Prediction
深度学习·opencv·计算机视觉·目标跟踪
马拉AI12 小时前
VAE不再必要?北大PixelGen:像素扩散反超Latent Diffusion,重塑生成新范式
人工智能·计算机视觉
愚者游世12 小时前
Opencv知识点大纲
人工智能·opencv·计算机视觉
海绵宝宝de派小星12 小时前
图像处理基础概念与常用操作
图像处理·人工智能·ai