在OpenCV中,normalize函數用于將圖像或矩陣的值規范化到一個特定的范圍內。這在圖像處理中非常有用,比如在調整圖像的對比度、準備數據進行機器學習處理時。規范化可以提高不同圖像之間的可比性,或是為了滿足特定算法對數據范圍的要求。
normalize
void normalize(InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0, int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
- src:輸入數組(可以是圖像)。
- dst:輸出數組,存儲規范化后的結果。dst可以和src是同一個數組。
- alpha:規范化到范圍的下限(當norm_type=NORM_MINMAX時)。
- beta:規范化到范圍的上限(當norm_type=NORM_MINMAX時)。
- norm_type:規范化的類型。最常用的是NORM_MINMAX,用于將數據線性變換到alpha,betaalpha,beta區間。其他選項包括NORM_L1、NORM_L2等,用于不同的數學規范化操作。
- dtype:輸出數組的深度。當值為-1時,輸出數組和輸入數組的深度相同。可以指定為CV_32F等,以改變輸出數據的類型。
- mask:可選的操作掩碼,用于指定要規范化哪些數組元素。
norm_type
norm_type=NORM_MINMAX
最常用的規范化類型,它將輸入數組的所有元素線性縮放到一個指定的范圍內(通常是[alpha, beta])。對于數組中的每個元素x,轉換后的值x’計算如下:
其中minVal和maxVal分別是數組中的最小值和最大值。
應用場景:圖像處理、數據預處理。
用途:將數據規范化到一個特定的范圍內,常用于調整圖像亮度和對比度,或在輸入機器學習模型前將特征縮放到同一范圍。這有助于提高算法的收斂速度和精度。
優勢:簡單直觀,易于實現,可以使數據分布更均勻。
norm_type=NORM_INF
此規范化類型將數組的所有元素縮放,使得結果數組的最大絕對值等于alpha。具體算法是將每個元素x除以數組的最大絕對值maxVal,然后乘以alpha:
應用場景:優化問題、數值計算。
用途:限制數組或向量的無窮范數(即最大絕對值)。在某些優化問題中,可能需要將解的范圍限制在一定界限內,使用NORM_INF規范化可以達到這一目的。
優勢:保證了數據中沒有極端的大值,有利于數值穩定性
norm_type=NORM_L1
NORM_L1規范化使得結果數組的L1范數(即數組元素絕對值之和)等于alpha。每個元素x的計算公式為:
應用場景:稀疏編碼、特征選擇、壓縮感知。
用途:L1規范化傾向于產生稀疏的解,即大部分元素為零,少數元素非零。這在特征選擇中特別有用,可以自動地忽略不重要的特征。
優勢:促進稀疏性,有助于提高模型的可解釋性,減少模型復雜度。
norm_type=NORM_L2
NORM_L2規范化使得結果數組的L2范數(即數組元素的平方和的平方根)等于alpha。每個元素x的計算公式為:
應用場景:機器學習、信號處理、圖像去噪。
用途:L2規范化傾向于使得所有元素的大小都差不多,這在避免過擬合(如機器學習中的權重衰減)、信號去噪(通過最小化能量)等場景中非常有用。
優勢:防止數據中的個別點對總體結果產生過大影響,提高模型的泛化能力。
norm_type總結
- NORM_MINMAX適用于需要將數據規范化到相同尺度的場景。
- NORM_INF適用于需要控制數據的最大值不超過特定閾值的場景。
- NORM_L1適用于需要稀疏解的場景,如特征選擇或構建稀疏模型。
- NORM_L2適用于需要平滑解、防止過擬合的場景,如機器學習中的正則化處理。
舉例(norm_type=NORM_MINMAX)
//圖像像素歸一化
void QuickDemo::normalize_pixel_demo(Mat &image){Mat dst;image.convertTo(image, CV_32F);//把無符號整型轉換為浮點型std::cout << "image raw type:"<<image.type() << std::endl;//16---代表CV_8UC3std::cout << "image convertTo CV_32F type:" << image.type() << std::endl;//21---CV_32FC3normalize(image, dst,2.0,0,NORM_MINMAX );std::cout << "CV_32F image NORM_MINMAX type:" << dst.type() << std::endl;//21---CV_32FC3imshow("NORM_MINMAX image", dst);
}