.NET OCRing изображение

>>> ["foo", "bar", "baz"].index("bar")
1

Ссылка: Структуры данных> Больше в Списках

Протесты следуют

Примечание, которое, в то время как это - возможно, самый чистый способ ответить на вопрос , как спросили , index, довольно слабый компонент list API, и я не могу помнить прошлый раз, когда я использовал его в гневе. На это указали мне в комментариях, что, потому что на этот ответ в большой степени ссылаются, это должно быть сделано больше завершенным. Некоторые протесты [приблизительно 117] следуют. Это, вероятно, стоит первоначально смотреть на docstring для него:

>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.

Линейная временная сложность в длине списка

index вызов проверяет каждый элемент списка в порядке, пока это не находит соответствие. Если Ваш список длинен, и Вы не знаете примерно, где в списке он происходит, этот поиск мог стать узким местом. В этом случае необходимо рассмотреть различную структуру данных. Обратите внимание, что, если Вы знаете примерно, где найти соответствие, можно дать index подсказка. Например, в этом отрывке, l.index(999_999, 999_990, 1_000_000) примерно пять порядков величины быстрее, чем прямой l.index(999_999), потому что первый только должен искать 10 записей, в то время как последние поиски миллион:

>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514

Только возвраты индекс первое соответствие к его аргументу

А звонят в [1 112], перерывает список в порядке, пока это не находит соответствие, и остановки там. , Если Вы ожидаете нуждаться в индексах большего количества соответствий, необходимо использовать понимание списка или выражение генератора.

>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2

Большинство мест, где я однажды использовал бы index, я теперь, использует понимание списка или выражение генератора, потому что они более generalizable. Таким образом, если Вы рассматриваете достижение для [1 114], смотрите на эти превосходные функции Python.

Броски, если элемент, не существующий в списке

, А звонят в [1 115] результаты в ValueError если объект не существующий.

>>> [1, 1].index(2)
Traceback (most recent call last):
  File "", line 1, in 
ValueError: 2 is not in list

, Если объект не мог бы присутствовать в списке, Вы должны любой

  1. Проверка на него сначала с [1 117] (чистый, читаемый подход), или
  2. Обертка эти index вызов в try/except блок, который ловит ValueError (вероятно, быстрее, по крайней мере, то, когда список для поиска длинен, и объект, обычно присутствует.)
8
задан Kirschstein 15 July 2009 в 13:08
поделиться

5 ответов

Похоже, ответ состоит в том, чтобы предоставить MODI больший холст. Я также пытался сделать снимок экрана элемента управления и распознавать его и столкнулся с той же проблемой. В конце концов, я взял изображение элемента управления, скопировал изображение в более крупное растровое изображение и распечатал большее растровое изображение.

Еще одна проблема, которую я обнаружил, заключалась в том, что у вас должно быть правильное расширение для вашего файла изображения. Другими словами, .tmp его не сокращает.

Я сохранил работу по созданию более крупного источника внутри моего метода распознавания текста, который выглядит примерно так (я имею дело непосредственно с объектами изображения):

public static string ExtractText(this Image image)
{
    var tmpFile = Path.GetTempFileName();
    string text;
    try
    {
        var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
        var gfxResize = Graphics.FromImage(bmp);
        gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
        bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
        var doc = new MODI.Document();
        doc.Create(tmpFile + ".bmp");
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        var img = (MODI.Image)doc.Images[0];
        var layout = img.Layout;
        text = layout.Text;
    }
    finally
    {
        File.Delete(tmpFile);
        File.Delete(tmpFile + ".bmp");
    }

    return text;
}

Я не точно знаю, каков минимальный размер, но похоже, что 1024 x 768 помогает.

7
ответ дан 5 December 2019 в 14:05
поделиться

У меня была такая же проблема при использовании

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);

в файле TIFF размером 2400x2496. Изменение его размера до 50% (уменьшение размера) устранило проблему, и метод больше не генерировал исключение, однако он неправильно распознавал текст, например обнаруживал «релевантность» вместо «ссылка» или «712017» вместо «712517». . Я продолжал пробовать разные размеры изображений, но у всех была одна и та же проблема, пока я не изменил команду на

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

, что означало, что я не хочу, чтобы она определяла ориентацию и не исправляла перекосы. Теперь команда отлично работает со всеми изображениями, включая tiff 2400x2496.

Надеюсь, это поможет людям, столкнувшимся с той же проблемой

0
ответ дан 5 December 2019 в 14:05
поделиться

modi ocr работает только со мной. попробуйте сохранить изображение в формате "tif".

извините, мой плохой английский

1
ответ дан 5 December 2019 в 14:05
поделиться

У меня была та же проблема "Проблема с OCR" с некоторыми изображениями. Я изменил масштаб изображения (в моем случае на 50%), т.е. уменьшил его размер и вуаля! это работает!

0
ответ дан 5 December 2019 в 14:05
поделиться

да, сообщения в этой теме помогли мне заставить его работать, вот что я могу добавить:

пытался загрузить изображения (маленькие), затем ocr...

- при обработке изображений, кажется, что их размер должен быть равен 2! ( удалось обработать изображения: 512x512, 128x128, 256x64 ... другие размеры в основном не удавались (например, 1103x334))

  • прозрачный фон также создавал проблемы. Я получил наилучшие результаты, когда создал новый tif с границами powerof2, белым фоном, вставил в него загруженное изображение, сохранил.

  • масштабирование изображения не помогло, так как OCR дает неправильные результаты, особенно для "немецких" символов, таких как "ü".

  • в конце концов я также использовал: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

  • используя modi из office 2003

greetings

womd

3
ответ дан 5 December 2019 в 14:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: