Otsu 是一種自動閾值化方法,用于將圖像分割為前景和背景。它通過最小化圖像的類內方差或等價地最大化類間方差來選擇最佳閾值。這種方法特別適用于圖像的二值化處理,能夠自動確定一個閾值,將圖像中的像素分為黑色和白色兩類。
Otsu 方法的原理
Otsu 方法的核心思想是將圖像的像素分為兩類(前景和背景),并通過統計分析找到一個閾值,使得這兩類之間的差異最大化。具體步驟如下:
-
計算圖像的直方圖:統計每個灰度值的像素數量。
-
遍歷所有可能的閾值:從 0 到 255,計算每個閾值下的類間方差。
-
選擇最佳閾值:選擇使類間方差最大化的閾值。
類間方差的計算
假設圖像的像素灰度值范圍為 [0,255],閾值為 T,則:
-
前景像素:灰度值大于 T 的像素。
-
背景像素:灰度值小于等于 T 的像素。
類間方差的計算公式為: σb2?(T)=ω0?(T)?ω1?(T)?(μ0?(T)?μ1?(T))2 其中:
-
ω0?(T) 和 ω1?(T) 分別是前景和背景像素的比例。
-
μ0?(T) 和 μ1?(T) 分別是前景和背景像素的平均灰度值。
Otsu 方法的應用
在 OpenCV 中,可以使用 cv::threshold
函數并指定 cv::THRESH_OTSU
標志來應用 Otsu 方法進行閾值化。
示例代碼
#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;}// 應用 Otsu 閾值化cv::Mat binary;double threshold_value = cv::threshold(img, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);// 顯示結果std::cout << "Otsu 閾值: " << threshold_value << std::endl;cv::imshow("Original Image", img);cv::imshow("Otsu Thresholding", binary);cv::waitKey(0);return 0;
}
代碼解釋
-
讀取圖像:使用
cv::imread
讀取灰度圖像。 -
應用 Otsu 閾值化:
-
cv::threshold
函數用于進行閾值化。 -
參數
0
表示初始閾值(Otsu 方法會自動計算最佳閾值,因此初始值可以任意設置)。 -
參數
255
表示最大閾值。 -
參數
cv::THRESH_BINARY | cv::THRESH_OTSU
表示使用 Otsu 方法進行二值化。
-
-
輸出結果:
-
threshold_value
是 Otsu 方法計算出的最佳閾值。 -
binary
是二值化后的圖像。
-
Otsu 方法的優點
-
自動選擇閾值:無需手動指定閾值,適用于各種圖像。
-
簡單高效:計算復雜度較低,適合實時處理。
-
適應性強:對圖像的光照變化和噪聲有一定的魯棒性。
總結
Otsu 方法是一種自動閾值化技術,通過最大化類間方差來選擇最佳閾值,從而將圖像分割為前景和背景。在 OpenCV 中,可以通過 cv::threshold
函數并指定 cv::THRESH_OTSU
標志來輕松應用這種方法。