在进行图像处理时,我们通常要进行颜色识别等一系列需要进行图像阈值处理的操作,今天我们就记录一下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()