/// <summary> /// 获取验证码图片的baseline和meanline在X轴上的坐标 /// </summary> public static void GetGuidePoint() { int[] pointArray = new int[ImgBoundary.rightUpPoint.Y]; int i = 0, j = 0; //找到每一列从字符底部到字符顶部遇到的第一个字符像素的X坐标值 for (j = ImgBoundary.leftDownPoint.Y; j < ImgBoundary.rightUpPoint.Y; j++) { pointArray[j] = 0; for (i = ImgBoundary.rightUpPoint.X; i > ImgBoundary.leftDownPoint.X; i--) { if (0 == BinaryArray[i,j]) { pointArray[j] = i; break; } } } //找出上述X坐标值中数量最多的X值作为baseline Int32[] Histogram = new Int32[ImgBoundary.rightUpPoint.Y]; Array.Clear(Histogram, 0, ImgBoundary.rightUpPoint.Y); foreach (Int32 b in pointArray) { if(b != 0) { Histogram[b]++; } } //根据研究对象的特征,高于baseline三个像素以上的区域才会被认为是在baseline以下区域,因此将得到的坐标值+3个像素点作为baseline的值 GuidePoint.X = Array.IndexOf(Histogram, Histogram.Max());// +3; //找到每一列从字符顶部到字符底部遇到的第一个字符像素的X坐标值 for (j = ImgBoundary.leftDownPoint.Y; j < ImgBoundary.rightUpPoint.Y; j++) { pointArray[j] = 0; for (i = ImgBoundary.leftDownPoint.X; i < ImgBoundary.rightUpPoint.X; i++) { if (0 == BinaryArray[i,j]) { pointArray[j] = i; break; } } } //找到上述X值中数量最多的点作为meanline的参考点 Array.Clear(Histogram, 0, ImgBoundary.rightUpPoint.X); // 初始化 foreach (Int32 b in pointArray) { if(b != 0) { Histogram[b]++; // 统计直方图 } } //小于meanline 2个像素的会被认为是meanline以上的区域,故直接将meanline减2个像素 Int32 midValIndex = Array.IndexOf(Histogram, Histogram.Max()); int tmpVal = ImgBoundary.leftDownPoint.X + (ImgBoundary.rightUpPoint.X - ImgBoundary.leftDownPoint.X) / 5; //防止meanline以上没有有效像素,故并不直接以计算值作为guidePoint if(midValIndex > tmpVal) { GuidePoint.Y = midValIndex; } else { GuidePoint.Y = tmpVal; } }