Суть в чем: скрипт распознает текст на изображении, но не всегда правильно. Поэтому я создал список слов чтоб 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;
}
});