python+opencv图像处理之五:图像阈值化处理

python+opencv图像处理之五:图像阈值化处理

一、阈值化

阈值即为界限,或者说是临界值,是指一个效应能够产生的最低值或最高值。旨在提取图像中的目标物体,将背景以及噪声区分开来。
通常会设定一个阈值T,通过T将图像的像素划分为两类:大于T的像素群和小于T的像素群。灰度转换处理后的图像中,每个像素都只有一个灰度值,大小表示明暗程度。利用阈值化,我们就可以从一副图像中分割出我们需要的物体部分。
常见阈值化公式,即二进制阈值化:
Y = { 0 , gray<T 255 , gray>T Y= \begin{cases} 0, & \text {gray<T} \\ 255, & \text{gray>T} \end{cases} Y={0,255,gray<Tgray>T
当灰度Gray小于阈值T时,其像素设置为0,图像中显示为黑色;当灰度Gray大于或等于阈值T时,其Y值为255,图像中显示为白色。

opencv中对于图像阈值处理提供了cv2.threshold()函数
cv2.threshold()中包含四个参数,分别为:
第一个原图像
第二个进行分类的阈值
第三个是高于(低于)阈值时赋予的新值
第四个是一个方法选择参数,常用的有:

参数参数作用效果
cv2.THRESH_BINARY像素点的灰度值大于阈值,设其灰度值为最大值(255);小于阈值,设其灰度值为最小值(0)
cv2.THRESH_BINARY_INV像素点的灰度值大于阈值,设其灰度值为最小值(0);小于阈值,设其灰度值为最大值(255)
cv2.THRESH_TRUNC像素点的灰度值小于阈值,其灰度值不变;大于阈值,设其灰度值为阈值
cv2.THRESH_TOZERO像素点的灰度值小于阈值,其灰度值不变;大于阈值,设其灰度值为最小值(0)
cv2.THRESH_TOZERO_INV像素点的灰度值大于阈值,其灰度值不变;小于阈值,设其灰度值为最小值(0)

该函数有两个返回值,第一个retVal(得到的阈值数据),第二个就是阈值化后的图像。

二、各方法选择参数图像对比

程序代码如下:

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#输入图像
image= cv2.imread("line.jpg")

#将图片转换为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

#阈值化处理
ret,thresh1=cv2.threshold(gray,127,255,cv2.THRESH_BINARY) 
ret,thresh2=cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)  
ret,thresh3=cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)  
ret,thresh4=cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)  
ret,thresh5=cv2.threshold(gray,127,255,cv2.THRESH_TOZERO_INV)

#显示结果
titles = ['Gray Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']  
images = [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()

程序执行结果,各阈值处理参数显示如下:
在这里插入图片描述