1、OTSU 算法是由日本学者 OTSU 于 1979 年提出的一种对图像进行二值化的高效算法。1. OTSU 算法原理简介对于一幅图像,设当前景与背景的分割阈值为 t 时,前景点占图像比例为 w0,均值为 u0,背景点占图像比例为 w1,均值为 u1。则整个图像的均值为 u = w0*u0+w1*u1。建立目标函数 g(t)=w0*(u0-u)2+w1*(u1-u)2,g(t)就是当分割阈值为 t 时的类间方差表达式。OTSU 算法使得 g(t)取得全局最大值,当 g(t)为最大时所对应的 t 称为最佳阈值。OTSU 算法又称为最大类间方差法。2.OTSU 算法例程下面是 OSTU 算法的 C
2、语言代码及其测试,代码基于 opencv。cpp view plaincopy1. #include 2. #include 3. 4. int otsu(IplImage *image) 5. 6. assert(NULL != image); 7. 8. int width = image-width; 9. int height = image-height; 10. int x=0,y=0; 11. int pixelCount256; 12. float pixelPro256; 13. int i, j, pixelSum = width * height, threshold =
3、 0; 14. 15. uchar* data = (uchar*)image-imageData; 16. 17. /初始化 18. for(i = 0; i widthStep + j+; 30. 31. 32. 33. 34. /计算每个像素在整幅图像中的比例 35. for(i = 0; i deltaMax) 70. 71. deltaMax = deltaTmp; 72. threshold = i; 73. 74. 75. /返回最佳阈值; 76. return threshold; 77. 78. 79. int main(int argc, char* argv) 80. 8
4、1. IplImage* srcImage = cvLoadImage(“D:technologyCVDatabaseimagerice.png“,0); 82. assert(NULL != srcImage); 83. 84. cvNamedWindow(“src“); 85. cvShowImage(“src“,srcImage); 86. 87. IplImage* biImage = cvCreateImage(cvGetSize(srcImage),8,1); 88. 89. /计算最佳阈值 90. int threshold = otsu(srcImage); 91. /对图像二值化 92. cvThreshold(srcImage,biImage,threshold,255,CV_THRESH_BINARY); 93. 94. cvNamedWindow(“binary“); 95. cvShowImage(“binary“,biImage); 96. 97. cvWaitKey(0); 98. 99. cvReleaseImage( 100. cvReleaseImage( 101. cvDestroyWindow(“src“); 102. cvDestroyWindow(“binary“); 103. 104. return 0; 105.