OpenCV(cv::minMaxLoc())

做梦当财神發表於2024-10-10

目錄
  • 1. 函式定義
  • 2. 示例程式碼
  • 3. 掩膜的使用
  • 4. 注意事項
  • 5. 應用場景



cv::minMaxLoc() 是 OpenCV 庫中用於查詢陣列或影像中最小值和最大值及其位置的函式。



1. 函式定義

void cv::minMaxLoc(
    InputArray src,
    double* minVal = nullptr,
    double* maxVal = nullptr,
    Point* minLoc = nullptr,
    Point* maxLoc = nullptr,
    InputArray mask = noArray()
)

引數:

  • src: 輸入陣列,可以是單通道或多通道的 CV_8UCV_32FCV_64F 型別的影像或矩陣。

  • minVal: 指向 double 型別變數的指標,用於儲存找到的最小值。如果不需要最小值,可以傳入 nullptr

  • maxVal: 指向 double 型別變數的指標,用於儲存找到的最大值。如果不需要最大值,可以傳入 nullptr

  • minLoc: 指向 Point 型別變數的指標,用於儲存最小值的位置(座標)。如果不需要位置,可以傳入 nullptr

  • maxLoc: 指向 Point 型別變數的指標,用於儲存最大值的位置(座標)。如果不需要位置,可以傳入 nullptr

  • mask: 可選的掩膜陣列,型別必須與 src 相同。如果提供了掩膜,則函式只會在掩膜非零的區域內查詢最小值和最大值。預設情況下,掩膜為全1,即整個輸入陣列都參與查詢。

返回值:

cv::minMaxLoc() 沒有返回值,結果透過指標引數返回。



2. 示例程式碼

以下是一個使用 cv::minMaxLoc() 函式的示例,展示如何在灰度影像中查詢最小值和最大值及其位置:

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 讀取灰度影像
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
    if (img.empty())
    {
        std::cerr << "無法讀取影像檔案!" << std::endl;
        return -1;
    }

    double minVal, maxVal;
    cv::Point minLoc, maxLoc;

    // 查詢最小值和最大值及其位置
    cv::minMaxLoc(img, &minVal, &maxVal, &minLoc, &maxLoc);

    std::cout << "最小值: " << minVal << " 位置: (" << minLoc.x << ", " << minLoc.y << ")" << std::endl;
    std::cout << "最大值: " << maxVal << " 位置: (" << maxLoc.x << ", " << maxLoc.y << ")" << std::endl;

    // 視覺化最小值和最大值的位置
    cv::Mat imgColor;
    cv::cvtColor(img, imgColor, cv::COLOR_GRAY2BGR);
    cv::circle(imgColor, minLoc, 5, cv::Scalar(255, 0, 0), -1); // 藍色標記最小值
    cv::circle(imgColor, maxLoc, 5, cv::Scalar(0, 0, 255), -1); // 紅色標記最大值

    cv::imshow("MinMaxLoc", imgColor);
    cv::waitKey(0);

    return 0;
}

示例說明:

  1. 讀取影像:使用 cv::imread 以灰度模式讀取影像。

  2. 呼叫 minMaxLoc:傳入影像,獲取最小值、最大值及其位置。

  3. 輸出結果:將最小值和最大值及其位置輸出到控制檯。

  4. 視覺化:在影像上用不同顏色的圓圈標記最小值和最大值的位置,並顯示影像。



3. 掩膜的使用

掩膜允許在指定區域內查詢最小值和最大值。以下示例展示如何在影像的特定區域內查詢最小值和最大值:

// 建立一個與影像大小相同的掩膜,初始為0
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8U);

// 定義掩膜區域,例如一個圓形區域
cv::circle(mask, cv::Point(img.cols / 2, img.rows / 2), 100, cv::Scalar(255), -1);

// 查詢掩膜區域內的最小值和最大值
cv::minMaxLoc(img, &minVal, &maxVal, &minLoc, &maxLoc, mask);

// 輸出結果
std::cout << "掩膜區域內最小值: " << minVal << " 位置: (" << minLoc.x << ", " << minLoc.y << ")" << std::endl;
std::cout << "掩膜區域內最大值: " << maxVal << " 位置: (" << maxLoc.x << ", " << maxLoc.y << ")" << std::endl;

示例說明:

  1. 建立掩膜:建立一個與影像大小相同的單通道掩膜,並在其中繪製一個圓形區域作為有效區域。

  2. 呼叫 minMaxLoc:傳入掩膜,只在掩膜為非零的區域內查詢最小值和最大值。

  3. 輸出結果:輸出掩膜區域內的最小值和最大值及其位置。



4. 注意事項

  1. 多通道影像:cv::minMaxLoc() 只處理單通道影像。如果輸入是多通道影像,需要先將其轉換為單通道,例如使用 cv::cvtColor

  2. 掩膜型別:掩膜必須是 8 位單通道影像 (CV_8U),非零的畫素表示有效區域。

  3. 效能考慮:對於大尺寸影像或需要頻繁呼叫的場景,可以考慮最佳化掩膜的建立或提前處理影像,以提高效能。

  4. 精度:最小值和最大值的位置如果存在多個相同的值,cv::minMaxLoc() 返回第一個找到的位置。



5. 應用場景

  • 模板匹配:在模板匹配過程中,可以使用 minMaxLoc() 查詢匹配結果中的最佳匹配位置。

  • 影像閾值處理:確定影像的動態範圍,以選擇合適的閾值。

  • 特徵檢測:在某些特徵檢測演算法中,需要找到響應值的最大或最小位置。

  • 影像分析:分析影像的亮度分佈,識別亮點或暗點。



相關文章