Otsu及變種算法
Otsu基本上最簡單的分割了,原理很簡單,就是將像素分類,找到使類間方差最大的閾值。就和機器學習中聚類思想一致。機器學習
其變種就是多閾值處理,和基於局部的閾值。學習
過程總結以下:spa
代碼以下:code
1 int Otsu_local(Mat src) 2 { 3 int hist[256] = { 0 }; 4 int IMGH = src.rows; 5 int IMGW = src.cols; 6 7 for (int i = 0; i < IMGH; i++) 8 { 9 for (int j = 0; j < IMGW; j++) 10 { 11 hist[int(src.at<uchar>(i,j))]++; 12 } 13 } 14 float w0 ; 15 float w1 ; 16 float u0 ; 17 float u1 ; 18 float maxvar = 0; 19 int T; 20 for (int k = 0; k < 256; k++) 21 { 22 w0 = 0; 23 w1 = 0; 24 u0 = 0; 25 u1 = 0; 26 for (int i = 0; i < k; i++) 27 { 28 w0 += hist[i]; 29 u0 += i*hist[i]; 30 } 31 for (int j = k; j < 256; j++) 32 { 33 w1 += hist[j]; 34 u1 += j*hist[j]; 35 } 36 37 w0 /= (IMGW*IMGH); 38 w1 /= (IMGW*IMGH); 39 u0 /= w0; 40 u1 /= w1; 41 42 float var = w0*w1*(u1 - u0)*(u1 - u0); 43 if (var > maxvar){ 44 maxvar = var; 45 T = k; 46 } 47 48 } 49 return T; 50 51 }
使用opencv自帶的算法作驗證,結果一致blog
1 int n=threshold(gray, temp, 0, 255, CV_THRESH_OTSU); opencv