在圖像處理中,閾值操作是一種非?;A且重要的技術。它可以將圖像中的像素值根據設定的閾值進行分類,從而實現圖像的二值化、分割等操作。OpenCV 提供了多種閾值操作的方法,本文將詳細介紹如何在 C++ 中使用 OpenCV 實現這些操作。
閾值操作的核心思想是將圖像中的像素值與一個或多個閾值進行比較,根據比較結果將像素值設置為不同的值。常見的閾值操作包括:
OpenCV 提供了 cv::threshold 函數來實現上述的閾值操作。該函數的原型如下:
double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
src:輸入圖像,通常為單通道灰度圖像。dst:輸出圖像,與輸入圖像具有相同的尺寸和類型。thresh:閾值。maxval:當像素值大于閾值時,設置的最大值(僅適用于二值化和反二值化操作)。type:閾值操作的類型,可以是以下值之一:
cv::THRESH_BINARY:二值化。cv::THRESH_BINARY_INV:反二值化。cv::THRESH_TRUNC:截斷。cv::THRESH_TOZERO:閾值化為0。cv::THRESH_TOZERO_INV:反閾值化為0。下面我們通過一個簡單的代碼示例來演示如何使用 OpenCV 實現不同的閾值操作。
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 讀取圖像
cv::Mat src = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 定義輸出圖像
cv::Mat dst;
// 設置閾值和最大值
double thresh = 127;
double maxval = 255;
// 二值化
cv::threshold(src, dst, thresh, maxval, cv::THRESH_BINARY);
cv::imshow("Binary Thresholding", dst);
// 反二值化
cv::threshold(src, dst, thresh, maxval, cv::THRESH_BINARY_INV);
cv::imshow("Inverse Binary Thresholding", dst);
// 截斷
cv::threshold(src, dst, thresh, maxval, cv::THRESH_TRUNC);
cv::imshow("Truncate Thresholding", dst);
// 閾值化為0
cv::threshold(src, dst, thresh, maxval, cv::THRESH_TOZERO);
cv::imshow("Threshold to Zero", dst);
// 反閾值化為0
cv::threshold(src, dst, thresh, maxval, cv::THRESH_TOZERO_INV);
cv::imshow("Inverse Threshold to Zero", dst);
// 等待按鍵
cv::waitKey(0);
return 0;
}
讀取圖像:我們使用 cv::imread 函數讀取一張灰度圖像。如果圖像讀取失敗,程序會輸出錯誤信息并退出。
定義輸出圖像:我們定義了一個 cv::Mat 類型的變量 dst,用于存儲閾值操作后的結果。
設置閾值和最大值:我們設置了閾值為127,最大值為255。這些值可以根據實際需求進行調整。
執行閾值操作:我們分別使用 cv::threshold 函數執行了五種不同的閾值操作,并將結果顯示在窗口中。
顯示結果:使用 cv::imshow 函數顯示每種閾值操作的結果,并使用 cv::waitKey 函數等待用戶按鍵。
除了固定閾值操作外,OpenCV 還提供了自適應閾值操作(Adaptive Thresholding)。自適應閾值操作可以根據圖像的局部區域動態調整閾值,適用于光照不均勻的圖像。
OpenCV 提供了 cv::adaptiveThreshold 函數來實現自適應閾值操作。該函數的原型如下:
void cv::adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);
src:輸入圖像,通常為單通道灰度圖像。dst:輸出圖像,與輸入圖像具有相同的尺寸和類型。maxValue:當像素值大于閾值時,設置的最大值。adaptiveMethod:自適應閾值算法,可以是以下值之一:
cv::ADAPTIVE_THRESH_MEAN_C:使用局部區域的均值作為閾值。cv::ADAPTIVE_THRESH_GAUSSIAN_C:使用局部區域的高斯加權均值作為閾值。thresholdType:閾值操作的類型,只能是 cv::THRESH_BINARY 或 cv::THRESH_BINARY_INV。blockSize:局部區域的大小,必須為奇數。C:從均值或加權均值中減去的常數。#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 讀取圖像
cv::Mat src = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 定義輸出圖像
cv::Mat dst;
// 設置最大值
double maxval = 255;
// 自適應閾值操作
cv::adaptiveThreshold(src, dst, maxval, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 11, 2);
cv::imshow("Adaptive Thresholding (Mean)", dst);
cv::adaptiveThreshold(src, dst, maxval, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 11, 2);
cv::imshow("Adaptive Thresholding (Gaussian)", dst);
// 等待按鍵
cv::waitKey(0);
return 0;
}
讀取圖像:與之前的示例相同,我們讀取了一張灰度圖像。
定義輸出圖像:定義了一個 cv::Mat 類型的變量 dst,用于存儲自適應閾值操作后的結果。
設置最大值:我們設置了最大值為255。
執行自適應閾值操作:我們分別使用 cv::adaptiveThreshold 函數執行了兩種不同的自適應閾值操作,并將結果顯示在窗口中。
顯示結果:使用 cv::imshow 函數顯示每種自適應閾值操作的結果,并使用 cv::waitKey 函數等待用戶按鍵。
本文介紹了如何在 C++ 中使用 OpenCV 實現閾值操作。我們首先介紹了閾值操作的基本概念,然后詳細講解了 cv::threshold 和 cv::adaptiveThreshold 函數的使用方法,并通過代碼示例演示了如何實現不同的閾值操作。閾值操作是圖像處理中的基礎技術,掌握這些操作對于后續的圖像處理任務非常重要。希望本文能夠幫助讀者更好地理解和應用 OpenCV 中的閾值操作。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。