一、环境
本文使用环境为:
- Windows10
- Python 3.9.17
- opencv-python 4.8.0.74
二、二值化算法
2.1、概述
在机器视觉应用中,OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理,以此大幅降低图像的数据量,从而突显出目标的轮廓。
具体来说,函数threshold可以将图像上的像素根据阈值划分为两类:大于或等于阈值的像素值被赋为最大值(或最大灰度值),而小于阈值的像素值则被赋为最小值(或最小灰度值)。这样的操作对于后续的特征提取和图像分析极为重要。例如,我们可以通过设定不同的阈值来对图像进行不同程度的二值化处理,以适应不同的应用场景。
然而,虽然threshold函数在机器视觉应用中有着广泛的应用,但其也存在一些缺点。例如,它只能处理单通道的图像,即灰度图像,而不能直接处理彩色图像。此外,选择合适的阈值也是一项挑战,因为如果阈值选择不当,可能会导致图像信息的丢失或者噪声的增加。
总的来说,OpenCV中的二值化函数threshold在机器视觉应用中扮演着重要角色,能够有效地简化图像数据并突出目标特征。但同时我们也需要注意其存在的一些局限性,如仅支持灰度图像以及阈值选择的困难等。
2.2、函数API
OpenCV中的二值化函数threshold是一种将图像转换为二值图像的方法。它通过设置一个阈值,将图像中的像素值分为两类:大于阈值的像素值为255(白色),小于等于阈值的像素值为0(黑色)。这种方法常用于图像处理和计算机视觉任务中,如边缘检测、轮廓识别等。
函数原型:
cv2.threshold(src, thresh, maxval, type)
参数说明:
src
:输入图像,通常为灰度图像。thresh
:阈值,用于将像素值分为两类。maxval
:最大值,当像素值大于阈值时,将其设置为此值。type
:阈值类型,有以下几种选择:cv::THRESH_BINARY
:二值化,大于阈值的像素值为255,小于等于阈值的像素值为0。cv::THRESH_BINARY_INV
:反向二值化,大于阈值的像素值为0,小于等于阈值的像素值为255。cv::THRESH_TRUNC
:截断,大于阈值的像素值保持不变,小于等于阈值的像素值设置为阈值。cv::THRESH_TOZERO
:零化,大于阈值的像素值保持不变,小于等于阈值的像素值设置为0。cv::THRESH_TOZERO_INV
:反向零化,大于阈值的像素值设置为0,小于等于阈值的像素值保持不变。
三、代码演示
代码演示5种二值算法效果,5中算法的区别这里再贴一次:
cv::THRESH_BINARY
:二值化,大于阈值的像素值为255,小于等于阈值的像素值为0。cv::THRESH_BINARY_INV
:反向二值化,大于阈值的像素值为0,小于等于阈值的像素值为255。cv::THRESH_TRUNC
:截断,大于阈值的像素值保持不变,小于等于阈值的像素值设置为阈值。cv::THRESH_TOZERO
:零化,大于阈值的像素值保持不变,小于等于阈值的像素值设置为0。cv::THRESH_TOZERO_INV
:反向零化,大于阈值的像素值设置为0,小于等于阈值的像素值保持不变。
from __future__ import print_function
import cv2 as cv
import argparse
max_value = 255
max_type = 4
max_binary_value = 255
# 这里有5种二值化算法,在gui界面使用滑条选择
trackbar_type = 'Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted'
trackbar_value = 'Value'
window_name = 'Threshold Demo'
# 二值化
def Threshold_Demo(val):
#0: Binary
#1: Binary Inverted
#2: Threshold Truncated
#3: Threshold to Zero
#4: Threshold to Zero Inverted
threshold_type = cv.getTrackbarPos(trackbar_type, window_name)
threshold_value = cv.getTrackbarPos(trackbar_value, window_name)
_, dst = cv.threshold(src_gray, threshold_value, max_binary_value, threshold_type )
cv.imshow(window_name, dst)
parser = argparse.ArgumentParser(description='Code for Basic Thresholding Operations tutorial.')
parser.add_argument('--input', help='Path to input image.', default='data/stuff.jpg') # 读取图片
args = parser.parse_args()
src = cv.imread(cv.samples.findFile(args.input))
if src is None:
print('Could not open or find the image: ', args.input)
exit(0)
# 彩色图转灰度图
src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.namedWindow(window_name)
# 创建滑条
cv.createTrackbar(trackbar_type, window_name , 3, max_type, Threshold_Demo)
cv.createTrackbar(trackbar_value, window_name , 0, max_value, Threshold_Demo)
Threshold_Demo(0)
cv.waitKey()
#0: Binary
#1: Binary Inverted
#2: Threshold Truncated
#3: Threshold to Zero
#4: Threshold to Zero Inverted