溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ 中怎么利用OpenCV實現閾值操作

發布時間:2021-07-02 17:47:30 來源:億速云 閱讀:370 作者:Leah 欄目:大數據

C++ 中怎么利用OpenCV實現閾值操作

在圖像處理中,閾值操作是一種非?;A且重要的技術。它可以將圖像中的像素值根據設定的閾值進行分類,從而實現圖像的二值化、分割等操作。OpenCV 提供了多種閾值操作的方法,本文將詳細介紹如何在 C++ 中使用 OpenCV 實現這些操作。

1. 閾值操作的基本概念

閾值操作的核心思想是將圖像中的像素值與一個或多個閾值進行比較,根據比較結果將像素值設置為不同的值。常見的閾值操作包括:

  • 二值化(Binary Thresholding):將像素值大于閾值的部分設置為一個最大值(通常為255),小于閾值的部分設置為0。
  • 反二值化(Inverse Binary Thresholding):與二值化相反,將像素值大于閾值的部分設置為0,小于閾值的部分設置為最大值。
  • 截斷(Truncate Thresholding):將像素值大于閾值的部分設置為閾值,小于閾值的部分保持不變。
  • 閾值化為0(Threshold to Zero):將像素值小于閾值的部分設置為0,大于閾值的部分保持不變。
  • 反閾值化為0(Inverse Threshold to Zero):將像素值大于閾值的部分設置為0,小于閾值的部分保持不變。

2. 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。

3. 代碼示例

下面我們通過一個簡單的代碼示例來演示如何使用 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;
}

代碼解析

  1. 讀取圖像:我們使用 cv::imread 函數讀取一張灰度圖像。如果圖像讀取失敗,程序會輸出錯誤信息并退出。

  2. 定義輸出圖像:我們定義了一個 cv::Mat 類型的變量 dst,用于存儲閾值操作后的結果。

  3. 設置閾值和最大值:我們設置了閾值為127,最大值為255。這些值可以根據實際需求進行調整。

  4. 執行閾值操作:我們分別使用 cv::threshold 函數執行了五種不同的閾值操作,并將結果顯示在窗口中。

  5. 顯示結果:使用 cv::imshow 函數顯示每種閾值操作的結果,并使用 cv::waitKey 函數等待用戶按鍵。

4. 自適應閾值操作

除了固定閾值操作外,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_BINARYcv::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;
}

代碼解析

  1. 讀取圖像:與之前的示例相同,我們讀取了一張灰度圖像。

  2. 定義輸出圖像:定義了一個 cv::Mat 類型的變量 dst,用于存儲自適應閾值操作后的結果。

  3. 設置最大值:我們設置了最大值為255。

  4. 執行自適應閾值操作:我們分別使用 cv::adaptiveThreshold 函數執行了兩種不同的自適應閾值操作,并將結果顯示在窗口中。

  5. 顯示結果:使用 cv::imshow 函數顯示每種自適應閾值操作的結果,并使用 cv::waitKey 函數等待用戶按鍵。

5. 總結

本文介紹了如何在 C++ 中使用 OpenCV 實現閾值操作。我們首先介紹了閾值操作的基本概念,然后詳細講解了 cv::thresholdcv::adaptiveThreshold 函數的使用方法,并通過代碼示例演示了如何實現不同的閾值操作。閾值操作是圖像處理中的基礎技術,掌握這些操作對于后續的圖像處理任務非常重要。希望本文能夠幫助讀者更好地理解和應用 OpenCV 中的閾值操作。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女