@Iosipovich

Как заставить tesseract.js выбирать похожее слово из списка?

Суть в чем: скрипт распознает текст на изображении, но не всегда правильно. Поэтому я создал список слов чтоб tesseract выбирал слова из него, если он ошибется на 1 букву то выберет похожее слово из списка. Но я не могу настроить эту функцию так чтоб он выбирал похожее слово. Он выбирает слово если оно в точности похоже на то что он распознал, но не похожее. Пример: картинка base64 с надписью hello, tesseract распознает на ней слово bello, смотрит на список ['hello', 'goodbye',] - выбирает слово hello так как оно самое похожее на распознанное слово.

мой код html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Base64 Image OCR</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            margin-top: 50px;
        }
        #output {
            margin-top: 20px;
            font-size: 1.2em;
            white-space: pre-wrap; /* Preserve whitespace formatting */
        }
        #base64Input {
            width: 80%;
            height: 100px;
        }
    </style>
</head>
<body>
    <h1>Base64 Image OCR</h1>
    <textarea id="base64Input" placeholder="Вставьте сюда base64-изображение"></textarea>
    <button id="processButton">Распознать текст</button>
    <div id="output"></div>
    <script src="https://cdn.jsdelivr.net/npm/tesseract.js@4/dist/tesseract.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/string-similarity/umd/string-similarity.min.js"></script>
    <script src="/script.js"></script>
</body>
</html>

мой код js:
document.getElementById('processButton').addEventListener('click', async function() {
    const base64Image = document.getElementById('base64Input').value.trim();
    if (base64Image) {
        document.getElementById('output').innerText = 'Обработка...';

        // Создание внешнего холста для обработки изображения
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');
        const img = new Image();

        img.onload = async function() {
            // Установка размеров холста согласно изображению
            canvas.width = img.width;
            canvas.height = img.height;

            // Нанесение изображения на холст
            ctx.drawImage(img, 0, 0);

            // Получение данных об изображении
            const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
            const data = imageData.data;

            // Применение коррекции контраста
            for (let i = 0; i < data.length; i += 4) {
                let r = data[i];
                let g = data[i + 1];
                let b = data[i + 2];
                
                // Преобразование в оттенки серого
                let gray = 0.299 * r + 0.587 * g + 0.114 * b;
                
                // Применение порога для высокого контраста
                let threshold = gray > 128 ? 255 : 0;
                
                data[i] = data[i + 1] = data[i + 2] = threshold;
            }

            // Возврат измененных данных на холст
            ctx.putImageData(imageData, 0, 0);

            // Преобразование холста обратно в base64-изображение
            const contrastBase64Image = canvas.toDataURL();

            // Пользовательский список слов для Tesseract
            const customWords = ['hello', 'goodbye', 'morning', 'buffer'];

            // Выполнение OCR на улучшенном изображении
            try {
                const result = await Tesseract.recognize(
                    contrastBase64Image,
                    'eng',
                    {
                        logger: m => console.log(m),
                        tessedit_char_whitelist: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ buffer',
                        psm: Tesseract.PSM.SINGLE_BLOCK // Режим сегментации страницы
                    }
                );

                // Извлечение и проверка распознанного текста
                const recognizedText = result.data.text.trim();
                console.log(`Распознанный текст: ${recognizedText}`); // Вывод распознанного текста в консоль
                const words = recognizedText.split(/\s+/);

                // Поиск наиболее похожего слова из customWords для каждого распознанного слова
                const similarWords = words.map(word => {
                    const bestMatch = stringSimilarity.findBestMatch(word, customWords).bestMatch;
                    console.log(`Слово: ${word}, Наилучшее совпадение: ${bestMatch.target}, Оценка: ${bestMatch.rating}`); // Вывод каждого совпадения слова
                    return bestMatch.rating > 0.6 ? bestMatch.target : null; // Понижен порог похожести
                }).filter(word => word !== null); // Фильтрация слов, не входящих в customWords

                if (similarWords.length > 0) {
                    document.getElementById('output').innerText = similarWords.join(' ');
                } else {
                    document.getElementById('output').innerText = 'В пользовательском списке слов нет допустимых слов';
                }
            } catch (error) {
                console.error(error);
                document.getElementById('output').innerText = 'Ошибка обработки изображения';
            }
        };

        // Загрузка изображения
        img.src = base64Image;
    }
});
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
SummerWeb Ярославль
от 120 000 до 180 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
19 июн. 2024, в 06:58
15000 руб./за проект
19 июн. 2024, в 01:11
7000 руб./за проект
18 июн. 2024, в 23:10
15000 руб./за проект