opencv-python常用函数解析及参数介绍(四)——图像阈值

图像阈值处理

  • 前言
  • 1.改变图像颜色
    • 灰度图
    • HSV图
  • 2.图像阈值
    • 图像中数值对应的效果
    • 函数与参数
    • 阈值处理效果

前言

在很多任务当中,首要的任务就是对图像进行阈值处理,为后续其他操作做准备,本文将介绍5种阈值处理的方法以及参数设置,同时通过合理的分析帮助记忆相关参数

1.改变图像颜色

无论是图像阈值还是图像轮廓,都是在灰度图的情况下才能进行的,所以我们需要将图片转换成灰度图,除了在读取时直接以灰度图的形式读取之外我们还可以通过函数cv2.cvtColor对图像颜色转换,除了传入图像之外还需要设置转换的类型

cv2.COLOR_BGR2GRAY cv2.COLOR_BGR2HSV
将bgr转换成灰度图 将bgr转换成HSV

在HSV中:

H S V
色调(主波长) 饱和度(纯度/颜色的阴影) 强度

假设我们有这样一个名为kl.jpg的图片
opencv-python常用函数解析及参数介绍(四)——图像阈值_第1张图片

灰度图

img=cv2.imread('kl.png')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)    
cv2.destroyAllWindows() 

opencv-python常用函数解析及参数介绍(四)——图像阈值_第2张图片

HSV图

hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

cv2.imshow("hsv", hsv)
cv2.waitKey(0)    
cv2.destroyAllWindows()

opencv-python常用函数解析及参数介绍(四)——图像阈值_第3张图片
虽然HSV图看起来有些奇怪,但暂时我们不需要深入太多,只需要了解可以这样转换就好了,请放心,本篇文章中只用到了灰度图。

2.图像阈值

尽管很多时候灰度图就已经可以完成画出图像轮廓的工作了,但是对于一些简单的图像来说,进行阈值处理往往能得到更好的效果

图像中数值对应的效果

在正式开始介绍阈值处理之前我们先要搞清楚图像数值对应的效果,在灰度图中我们需要明白的是数的大小与图像黑白的关系
为了表示方便我们首先还是定义一个用于展示图片的函数

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

现在假设我们的图像是0-255(因为cv2读出的图像数据类型是uint8,正好是0-255)
我们先看值全0的情况

cv_show(np.zeros((200, 200)),'zeros')

opencv-python常用函数解析及参数介绍(四)——图像阈值_第4张图片
然后是255的情况

cv_show(np.ones((200, 200)) * 255,'ones')

opencv-python常用函数解析及参数介绍(四)——图像阈值_第5张图片
可以看到在灰度图的情况下越接近0越黑,越接近255越白。

函数与参数

我们使用cv2.threshold函数进行阈值处理,使用方式如下:
ret, dst = cv2.threshold(src, thresh, maxval, type)
其中参数:

参数 含义
src 输入图,只能输入单通道图像,通常来说为灰度图
dst 输出图
thresh 阈值
maxval 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
type 二值化操作的类型,包含5种类型

其中type取值:

取值 含义
cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INV THRESH_BINARY的反转
cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

和前篇的文章一样,我们结合英文简单的记忆一下效果
binary表示二元,所以经过操作后图像只有两个值,由于我们定义了阈值和最大值,所以自然想到超过阈值的设成最大值,没超过的设成0;
binary_inv是binary的反转这个很好理解,就是0变最大,最大变0
trunc可以拆成trun和c可以理解成变成c,其中c表示的就是阈值,可以理解成变成阈值,所以可以理解为大于阈值的变成阈值
tozero可以拆成to和zero,也就是变成0的意思,可以理解成小于阈值的变成0
同样的tozero的反转也很好理解了

阈值处理效果

我们画一下灰度图和五种阈值处理的结果

ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['GRAY', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img_gray, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

opencv-python常用函数解析及参数介绍(四)——图像阈值_第6张图片
下面我们再结合图像分析一下5种阈值处理
binary是高于阈值的设成最大,低于阈值的设成0,那么就是较黑的变成黑色(0值),较白的变成白色(最大值)
binary_inv和binary相反
trunc使得图像更亮,tozero使得图片更暗,而tozero_inv可以看到确实是相反的效果,原本亮的变得很黑,原本黑的变得很亮

你可能感兴趣的:(图像处理,笔记,opencv,python,计算机视觉)