OpenCV学习记录——阈值处理(全局阈值处理、自适应阈值处理)

文章目录

  • 一、学习目的
  • 二、图像二值化
  • 三、全局阈值处理
  • 四、自适应阈值处理

一、学习目的

        在进行图像处理时,我们通常要进行颜色识别等一系列需要进行图像阈值处理的操作,今天我们就记录一下opencv进行阈值处理的一些基本操作和代码

二、图像二值化

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

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

        图像二值化的作用就是使图像变得简单,凸显出感兴趣的目标轮廓

        阈值处理一共有三种方式:全局阈值处理、自适应阈值处理、Otsu阈值处理,这篇文章主要记录全局阈值处理自适应阈值处理

三、全局阈值处理

        这种阈值处理方式可以自己设定阈值,并且有五种处理方法,主要运用如下函数:

cv2.threshold(src, thresh, maxval, type)

        函数中四个参数的具体含义如下:

        (1)“src”, 代表要进行阈值处理的图像

        (2)“thresh”, 代表设定的阈值

        (3)“maxval”, 代表高于(或低于)阈值时赋予的新值,只有当处理方式为THERESH_BINARY或者THERESH_BINARY_INV时才需要设置该值

        (4)“type”, 代表的是阈值处理的方法,五种处理方法具体如下:

(1) cv2.THRESH_BINARY       # 超过阈值部分取 maxval,否则取 0
(2) cv2.THRESH_BINARY_INV   # 大于阈值的部分变为 0,其他部分变为 maxval
(3) cv2.THRESH_TRUNC        # 大于阈值部分设为阈值,否则不变,相当于进行一个截断
(4) cv2.THRESH_TOZERO       # 大于阈值部分不改变,否则设为 0
(5) cv2.THRESH_TOZERO_INV   # 大于阈值的部分变为 0,其余部分不变

        完整应用代码如下:

import cv2

# 读取图片
img = cv2.imread('cat.jpg')

# 将图片设置为灰色,方便进行二值化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 获取返回参数ret、thresh;选择被处理图像,设定阈值、最大值、处理方法
ret, thresh = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)

# 显示输出图像“thresh”
cv2.imshow('image', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中,将图像设置为灰色的函数之前已经讲过

尤其需要注意的是阈值处理函数返回的两个参数

(1)“ret”, 代表阈值处理是否成功,若处理成功则ret置0,否则ret返回负数

(2)“thresh”, 是返回的图像,即处理完成后的输出图

此外,写入的参数具体含义如下:

       (1) “img_gray”, 代表的是待处理的图像,即输入图

       (2)“127”, 为设定的阈值,通常选择127,即选取图像最大值的一半,此时输出的结果更加明显,可以根据需求自定义

       (3) “255”, 为设置的最大值,即当处理方法为THRESH_BINARY时,图像的灰度值大于127的部分将被赋予成255

       (4) “cv2.THRESH_BINARY”, 为处理方法,超过阈值部分取 maxval,否则取 0

四、自适应阈值处理

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

        简单来说,对于色彩均匀的图像来说,通常设置阈值为127,这是由经验得来比较合适的阈值。但是,对于色彩并不均匀的图像来说,将整个图像设置阈值为127的效果并不太好,这时就需要进行自适应阈值处理,即将图像分成许多小块局部计算每一个小块的阈值,再进行阈值处理。

        自适应阈值处理的函数如下:

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

自适应阈值处理函数一共有六个参数,具体含义如下:

        (1)“src”, 是要进行阈值处理的图像

        (2)“maxValue”, 代表高于(或低于)阈值时赋予的新值,只有当处理方式为THERESH_BINARY或者THERESH_BINARY_INV时才需要设置该值

        (3)“adaptiveMethod”, 是计算自适应阈值的方法,共两种,具体如下:

(1)cv2.ADAPTIVE_THRESH_MEAN_C  #这种方法是将邻域所有像素点的权重值都取一样

(2)cv2.ADAPTIVE_THRESH_GAUSSIAN_C
# 这种方法是通过高斯公式获得邻域所有像素点的权重值,
# 这种权重值的选取就跟各邻域像素点到目标像素点的距离有关,
# 距离越近权重越高,距离越远权重越低。

(温馨提示:不管是opencv还是基于python的任何高级库,都会有大量的陌生函数名出现,记住这些函数名是学习python及各种库的难点之一,但是并不需要将函数名一字不落地记下来,在实际应用中只需要记住大概名称,各种编译器都会将完整的函数名展现出来供我们选择的)

        (4)“thresholdType”, 为阈值处理方法,不同于全局阈值处理有五种处理方法,自适应阈值处理中,只可以选择cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV两种方法

        (5)“blockSize”, 表示领域尺寸的大小,一般取3、5、7等,不必过多纠结

        (6)“C”, 是一个常数,阈值等于平均值或者加权平均值减去这个常数,也不必过多纠结

完整应用代码如下:

import cv2

# 读取图片
img = cv2.imread('cat.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)

# 显示输出图像“img2”
cv2.imshow('image', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

你可能感兴趣的:(树莓派——OpenCV,opencv,学习,人工智能,计算机视觉,嵌入式硬件)