public static uint[] ProjectSubImageOnHorizontalLine(GrayImage image, SplitMultiLines.Line line) { int width = image.Width; var density = new uint[width]; int stop = line.StartSpace * width; Parallel.For(0, width, (j) => { int start = width * line.StartText + j; uint lineProject = 0; for (int index = start; index < stop; index += width) { if (image.Pixels[index] > 0) { lineProject++; } } density[j] = lineProject; }); return(density); }
public static uint[] ProjectSubImageOnVerticalLine(GrayImage image, SplitMultiLines.Line line) { int width = image.Width; var density = new uint[image.Height]; int lineWidth = line.StartSpace - line.StartText; Parallel.For(0, density.Length, (i) => { int index = i * width + line.StartText; uint lineProject = 0; for (int j = 0; j < lineWidth; j++) { if (image.Pixels[index] > 0) { lineProject++; } index++; } density[i] = lineProject; }); return(density); }
public static List <TextBlock> FindAllTextBlock(GrayImage image, uint[] density, SplitMultiLines.Line line, int lineIndex) { if (lineIndex == 0) { AvgGapBlocks.Clear(); AvgGapIntraChars.Clear(); } startIndex = line.StartText; stopIndex = line.StartSpace; var blocks = InitTextBlocks(image, density, lineIndex); if (blocks.Count < 2) { return(blocks); } GetAverageParams(blocks); PreProcessAllBlocksType(blocks, density, image); CalculateAverageGaps(blocks); MergeMarkBlocks(blocks); CalculateAverageGaps(blocks); MergeHalfCharBlocks(blocks); CalculateAverageGaps(blocks); GetTextBlockRatio(blocks); AvgGapBlocks.Add(avgGapBlock); AvgGapIntraChars.Add(avgGapIntraChar); return(blocks); }