009 OpenCV 二值化 threshold

一、环境

本文使用环境为:

  • 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

扫描二维码关注公众号,回复: 17158880 查看本文章

    #1: Binary Inverted 

  #2: Threshold Truncated 

  #3: Threshold to Zero

    #4: Threshold to Zero Inverted

猜你喜欢

转载自blog.csdn.net/m0_72734364/article/details/134568217