It turns out that using PageSegMode.SingleBlock helped.
On Wednesday, November 13, 2024 at 8:22:48 AM UTC-6 Mark Bussey wrote:
> First attempt at using tesseract ocr. I am using Tesseract-ocr v3.02 (I
> know it's old, but didn't see the need to include neural network code) to
> read the digits found on an image of a Sudoku puzzle.
> I am coding in C#, .Net application. I want to read an unfinished Sudoku
> puzzle from my local newspaper e-edition, and finish it on my laptop
> screen. Trivial, or so I thought.
>
> Here is an example input image.
> [image: SudokuBoard.jpg]
> I am grabbing each sub-square individually, and processing that to get
> just one digit at a time.
> The code includes an offset to make the sub-square smaller, to eliminate
> the lined borders around the digits in the image.
> Here is my code:
>
> {
> string docPath =
> Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
>
> Bitmap img = new Bitmap(Path.Combine(docPath,
> "SudokuBoard.jpg"));
>
> int i = 1;
> int iOffset = 10;
>
> for (int y = 0; y < img.Height - 10; y += img.Height / 9)
> {
> int j = 0;
> for (int x = 0; x < img.Width - 10; x += img.Width / 9)
> {
> ++j;
>
> TesseractEngine engine = new
> TesseractEngine("./tessdata", "eng", EngineMode.Default);
> engine.SetVariable("tessedit_char_whitelist",
> "123456789");
>
> Rect rectangle = new Rect(x + iOffset, y + iOffset,
> (img.Width / 9) - (2 + iOffset), (img.Height / 9) - iOffset);
>
> try
> {
> Page page = engine.Process(img, rectangle,
> PageSegMode.SingleChar);
>
> Pix pix = page.GetThresholdedImage();
>
> pix.Save(Path.Combine(docPath, "SudokuOcrImg_" +
> i.ToString() + "," + j.ToString() + ".bmp"), ImageFormat.Bmp);
>
> string strOcrText = page.GetText();
> if (page.GetText().Length > 0)
> {
> if
> (char.IsDigit(char.Parse(strOcrText.Substring(0,1))))
> {
>
> Console.WriteLine(page.GetText().Substring(0, 1));
> }
> else
> {
> Console.WriteLine(".");
> }
> }
> else
> {
> Console.WriteLine(".");
> }
> }
> catch (Exception e)
> {
> Console.WriteLine("exception");
> }
> }
>
> ++i;
> }
>
> I process the entire image one row at a time, 9 cells in each row.
> I output a dot where the image has an empty cell.
> I'm wondering about the info dumped to the Console in between valid digits.
> I highlighted one such info dump in red.
> Here is the output to the console:
> .
> 4
> .
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> 2
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> .
> .
> .
> 1
> 6
> .
> 3
> 5
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> 7
> .
> .
> 3 <- this is from a blank sub-square
> 9 <- this is from a blank sub-square
> 2
> 4
> 7
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> 3
> 3 <- this is from a blank sub-square
> . <- this is missing the value "6"
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> 7
> 5
> .
> .
> .
> .
> .
> . <- this is missing value "2"
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> .
> 9
> .
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> .
> 6
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> .
> .
> 7 <- this is from a blank sub-square
> 1
> 4
> .
> 5
> 7 <- this is from a blank sub-square
> 9
> .
> 6
> 3
> 4
> .
> .
> .
> .
> 1
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> 4
> 5
> .
> 3
> . <- this is missing the value "9"
> .
> .
> .
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> 1
> Bottom=0, top=76, base=0, x=0
>
> Total count=0
> Min=0.00 Really=0
> Lower quartile=0.00
> Median=0.00, ile(0.5)=0.00
> Upper quartile=0.00
> Max=0.00 Really=0
> Range=1
> Mean= 0.00
> SD= 0.00
> .
> .
> 7
> .
>
>
> I am including the pix images of each sub-square that was processed.
> there are 81 of them - sorry. Why do some have additional noise?
> Looks like I am not getting the center of each sub-square as I thought I
> was.
> [image: SudokuOcrImg_1,1.bmp] [image: SudokuOcrImg_1,2.bmp] [image:
> SudokuOcrImg_1,3.bmp] [image: SudokuOcrImg_1,4.bmp] [image:
> SudokuOcrImg_1,5.bmp] [image: SudokuOcrImg_1,6.bmp][image:
> SudokuOcrImg_1,7.bmp] [image: SudokuOcrImg_1,8.bmp] [image:
> SudokuOcrImg_1,9.bmp]
>
> [image: SudokuOcrImg_2,1.bmp] [image: SudokuOcrImg_2,2.bmp] [image:
> SudokuOcrImg_2,3.bmp] [image: SudokuOcrImg_2,4.bmp] [image:
> SudokuOcrImg_2,5.bmp] [image: SudokuOcrImg_2,6.bmp] [image:
> SudokuOcrImg_2,7.bmp] [image: SudokuOcrImg_2,8.bmp] [image:
> SudokuOcrImg_2,9.bmp]
> [image: SudokuOcrImg_3,1.bmp] [image: SudokuOcrImg_3,2.bmp] [image:
> SudokuOcrImg_3,3.bmp] [image: SudokuOcrImg_3,4.bmp] [image:
> SudokuOcrImg_3,5.bmp] [image: SudokuOcrImg_3,6.bmp] [image:
> SudokuOcrImg_3,7.bmp] [image: SudokuOcrImg_3,8.bmp] [image:
> SudokuOcrImg_3,9.bmp]
> [image: SudokuOcrImg_4,1.bmp] [image: SudokuOcrImg_4,2.bmp] [image:
> SudokuOcrImg_4,3.bmp] [image: SudokuOcrImg_4,4.bmp] [image:
> SudokuOcrImg_4,5.bmp] [image: SudokuOcrImg_4,6.bmp] [image:
> SudokuOcrImg_4,7.bmp] [image: SudokuOcrImg_4,8.bmp] [image:
> SudokuOcrImg_4,9.bmp]
> [image: SudokuOcrImg_5,1.bmp] [image: SudokuOcrImg_5,2.bmp] [image:
> SudokuOcrImg_5,3.bmp] [image: SudokuOcrImg_5,4.bmp] [image:
> SudokuOcrImg_5,5.bmp] [image: SudokuOcrImg_5,6.bmp] [image:
> SudokuOcrImg_5,7.bmp] [image: SudokuOcrImg_5,8.bmp] [image:
> SudokuOcrImg_5,9.bmp] <- this 9 doesn't show the bar at the top edge
> [image: SudokuOcrImg_6,1.bmp] [image: SudokuOcrImg_6,2.bmp] [image:
> SudokuOcrImg_6,3.bmp] [image: SudokuOcrImg_6,4.bmp] [image:
> SudokuOcrImg_6,5.bmp] [image: SudokuOcrImg_6,6.bmp][image:
> SudokuOcrImg_6,7.bmp] [image: SudokuOcrImg_6,8.bmp] [image:
> SudokuOcrImg_6,9.bmp]
> [image: SudokuOcrImg_7,1.bmp] [image: SudokuOcrImg_7,2.bmp] [image:
> SudokuOcrImg_7,3.bmp] [image: SudokuOcrImg_7,4.bmp] [image:
> SudokuOcrImg_7,5.bmp] [image: SudokuOcrImg_7,6.bmp] [image:
> SudokuOcrImg_7,7.bmp] [image: SudokuOcrImg_7,8.bmp] [image:
> SudokuOcrImg_7,9.bmp]
> [image: SudokuOcrImg_8,1.bmp] [image: SudokuOcrImg_8,2.bmp] [image:
> SudokuOcrImg_8,3.bmp] [image: SudokuOcrImg_8,4.bmp] [image:
> SudokuOcrImg_8,5.bmp] [image: SudokuOcrImg_8,6.bmp] [image:
> SudokuOcrImg_8,7.bmp] [image: SudokuOcrImg_8,8.bmp] [image:
> SudokuOcrImg_8,9.bmp]
> [image: SudokuOcrImg_9,1.bmp] [image: SudokuOcrImg_9,2.bmp] [image:
> SudokuOcrImg_9,3.bmp] [image: SudokuOcrImg_9,4.bmp] [image:
> SudokuOcrImg_9,5.bmp] [image: SudokuOcrImg_9,6.bmp] [image:
> SudokuOcrImg_9,7.bmp] [image: SudokuOcrImg_9,8.bmp] [image:
> SudokuOcrImg_9,9.bmp]
>
>
> I hope someone can lead me toward a solution for what seems like such a
> simple problem.
>
> Thanks,
> Mark Bussey
>
>
>
>
>
--
You received this message because you are subscribed to the Google Groups
"tesseract-ocr" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/tesseract-ocr/c3a1f836-2768-44fa-9789-86d6cb82da7bn%40googlegroups.com.