通过迭代方法选择阈值, 计算方法如下: (1)选择灰度图的平均值作为初始阈值T0 ; (2)计算小于等于T0的平均值T1, 和大于T0的平均值T2; (3)新的阈值为T = (T1 + T2)/ 2; (4)比较T和T0,若相等,则返回T,即为迭代阈值; 否则 T0 = T,重复(1)-(3) int IterationThreshold(CvMat* gray); IplImage *src = cvLoadImage('flower.jpg',1); const int width = src->width; const int height = src->height; CvMat *gray = cvCreateMat(height, width, CV_8UC1); cvCvtColor(src, gray, CV_BGR2GRAY); int thres = IterationThreshold(gray); cvThreshold(gray, gray, thres, 255, CV_THRESH_BINARY); cvShowImage('GRAY', gray); cvCvtColor(gray, src, CV_GRAY2BGR); cvSaveImage('DST.bmp', src); int IterationThreshold(CvMat* gray) int height = gray->height; for(int j = 0; j < height; j ++) uchar*data = (uchar*)(gray->data.ptr + j * gray->step); for (int i = 0; i < width; i ++) for (int i = 0; i < 256; i ++) for ( int i = 0; i < T0+1; i ++) for ( int i = T0 + 1; i < 256; i ++) T = (T1 / num1 + T2 / num2) / 2;
源图和效果图如下:
|