方法:NORM_MINMAX
Mat src=new Mat(new Size(5,1),CvType.CV_32FC1);
for(int i=0;i<src.rows();i++) {
for(int j=0;j<src.cols();j++) {
double [] data=new double[] {10,23,22,10,5};
src.put(i, j, data[j]);
}
}
Mat dst=new Mat();
System.out.println(src.dump());
Core.normalize(src,dst,1,0,Core.NORM_MINMAX);
System.out.println(dst.dump());
輸出結果:
輸入:[10, 23, 22, 10, 5]
輸出:[0.27777779, 1, 0.94444442, 0.27777779, 0]
目前的數組是一行,我們歸一化利用的

我們來帶入進行求解 max(A)=23 ,min(A)=5 是以說:max(A)-min(A)=23-5=17 Ai-min(A)=10-5=5 5/17=0.2777779
那麼這個時候我們的輸入的矩陣隻有一行,如果存在多行,應該怎麼來計算
輸入:[10, 23, 22, 10, 5;
11, 9, 4, 15, 2]
輸出:[0.38095239, 1, 0.95238101, 0.38095239, 0.14285713;
0.42857146, 0.33333334, 0.095238097, 0.61904764, 0]
上面的是還适用嗎:
我們來帶入進行求解 max(A)=23 ,min(A)=2 是以說:max(A)-min(A)=23-2=21 Ai-min(A)=10-2=8 8/21=0.38095239
看來 NORM_MINMAX 歸一化的方式就是矩陣中的每一個元素減去最小的元素然後除以(矩陣中最大的元素減去最小的元素)
方法NORM_L1
Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
for (int i = 0; i < 1; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 10, 23, 22, 10, 5 };
src.put(i, j, data[j]);
}
}
for (int i = 1; i < 2; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 11, 9, 4, 15, 2 };
src.put(i, j, data[j]);
}
}
Mat dst = new Mat();
System.out.println(src.dump());
Core.normalize(src, dst, 1, 0, Core.NORM_L1);
System.out.println(dst.dump());
輸入:
[10, 23, 22, 10, 5;
11, 9, 4, 15, 2]
輸出:
[0.090090096, 0.20720722, 0.1981982, 0.090090096, 0.045045048;
0.0990991, 0.081081085, 0.036036037, 0.13513514, 0.018018018]
計算公式:
我們按照計算公司來看:矩陣的元素和為:10+23+ 22+10+5+11+9+4+15+2=111 第一個元素:10/111=0.090090096
由此可以看到的是NORM_L1歸一化處理是對應元素除以矩陣元素和
方法NORM_L2
Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
for (int i = 0; i < 1; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 10, 23, 22, 10, 5 };
src.put(i, j, data[j]);
}
}
for (int i = 1; i < 2; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 11, 9, 4, 15, 2 };
src.put(i, j, data[j]);
}
}
Mat dst = new Mat();
System.out.println(src.dump());
Core.normalize(src, dst, 1, 0, Core.NORM_L2);
System.out.println(dst.dump());
檢視結果:
輸入:[10, 23, 22, 10, 5;
11, 9, 4, 15, 2]
輸出:[0.24361277, 0.56030935, 0.5359481, 0.24361277, 0.12180638;
0.26797405, 0.2192515, 0.097445108, 0.36541915, 0.048722554]
計算公式:
我們來計算一下10*10+23*23+22*22+10*10+5*5+11*11+9*9+4*4+15*15+2*2=1685 求解1685的平方根為:41.048751503547585 然後我們求解第一個元素:10/41.048751503547585 =0.24361276856704797 這個和我們輸出元素是一樣的
那麼我們可以看出NORM_L2 是對應元素除以所有元素的平方和的算術平方根
方法:NORM_INF
Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
for (int i = 0; i < 1; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 10, 23, 22, 10, 5 };
src.put(i, j, data[j]);
}
}
for (int i = 1; i < 2; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 11, 9, 4, 15, 2 };
src.put(i, j, data[j]);
}
}
Mat dst = new Mat();
System.out.println(src.dump());
Core.normalize(src, dst, 1, 0, Core.NORM_INF);
System.out.println(dst.dump());
檢視結果:
輸入結果:[10, 23, 22, 10, 5;
11, 9, 4, 15, 2]
輸出:[0.43478262, 1, 0.95652175, 0.43478262, 0.21739131;
0.47826087, 0.39130434, 0.17391305, 0.65217394, 0.086956523]
這個計算是比較簡單的
上述的矩陣中最大的元素是23 第一個元素10 是以在輸出的時候第一個元素為:10/23=0.43478260869565216
NORM_INF 歸一化的方式是對應元素除以矩陣中的最大的元素
總結:
NORM_MINMAX 歸一化的方式就是矩陣中的每一個元素減去最小的元素然後除以(矩陣中最大的元素減去最小的元素)對應公式:

NORM_L1歸一化處理是對應元素除以矩陣元素和 對應公式:
矩陣元素的絕對值之和(曼哈頓距離)NORM_L2 是對應元素除以所有元素的平方和的算術平方根 對應公式:
矩陣各元素的歐幾裡德距離之和NORM_INF 歸一化的方式是對應元素除以矩陣中的最大的元素 對應公式:
矩陣各元素絕對值的最大值(切比雪夫距離)
上面是對歸一化函數有一個初步的了解,以及對應的熟悉公式,看完這些感覺業務了解算法,上學的時候學習的那點知識還真的是需要惡補,特别是學習opencv,當然我們最終的目的不是說對opencv有所創新,我們希望的是對圖檔可以進行相關的處理,目的地還有很遠,繼續加油。還有3天要過年了,提前祝大家牛年快樂。
希望對你有所幫助!