迭代阈值分割
迭代閾值分割
迭代閾值分割是通過迭代找出合適的閾值,再根據(jù)得到的閾值進(jìn)行分割的方法。
迭代找閾值的主要步驟:
- 定義精度dt,即前后兩個(gè)閾值的差值小于dt時(shí)認(rèn)為找到了合適的閾值。
- 定義初始閾值T0,一般用灰度均值。
- 根據(jù)當(dāng)前閾值T,大于T的灰度值分為一組,取其平均值m1;小于T的灰度值分為另一組,同樣取其平均值m2 。
- 得到新的閾值T = (m1 + m2) / 2 。
- 重復(fù)步驟3和步驟4直到前后閾值差小于dt 。
具體代碼:(OpenCV)
double dt = 5; //預(yù)定義閾值差(精度)double T = 0, preT = 0;int i = 0, j = 0, count = 0;for (i = 0; i < backRImg->height; i++) { //取均值for (j = 0; j < backRImg->width; j++) {T += (backRImg->imageData + backRImg->widthStep * i)[j];count++;}}T = T * 1.0 / count;while ( abs(preT - T) > dt) {preT = T;int m1 = 0, m2 = 0, cnt1 = 0, cnt2 = 0;for (i = 0; i < backRImg->height; i++) {for (j = 0; j < backRImg->width; j++) { int grayValue = (backRImg->imageData + backRImg->widthStep * i)[j]; //灰度值if (grayValue > T) {m1 += grayValue;cnt1++;}else {m2 += grayValue;cnt2++;}}}m1 = m1 * 1.0 / cnt1;m2 = m2 * 1.0 / cnt2;T = (m1 + m2) / 2;}然后再根據(jù)得到的閾值進(jìn)行分割操作即可。
總結(jié)