一、環境
本文使用環境為:
- 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 argparsemax_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 Invertedthreshold_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