---
title: 'Graylog'
summary: 'Краткое руководство по установки Graylog'
date: '10 05 2024'
draft: false
tags:
- Python
- OCR
- tensorflow
- pytesseract
- opencv-python 
---
# Скрипт для перевода изображения в текст

# Устанавливаем библиотеки

```python
pip install opencv-python pytesseract tensorflow
```

Не забудьте дополнительно установить Tesseract OCR на ваш компьютер, так как pytesseract является только оболочкой для него. Инструкции по установке можно найти [здесь](https://github.com/tesseract-ocr/tesseract).


# Сам скрипт

```python
import cv2
import pytesseract
import os

class TextRecognizer:
    def __init__(self, tesseract_cmd: str, languages: str = 'rus+eng'):
        # Указываем путь к Tesseract и языки для распознавания
        pytesseract.pytesseract.tesseract_cmd = tesseract_cmd
        self.languages = languages

    def recognize_text(self, image):
        """Распознавание текста на нескольких языках."""
        text = pytesseract.image_to_string(image, config='--oem 3 --psm 6', lang=self.languages)
        return text.strip()

class TextSaver:
    def __init__(self, directory: str = '.'):
        self.directory = directory

    def save_text_to_file(self, text, filename='result.txt'):
        """Сохранение распознанного текста в файл."""
        path = os.path.join(self.directory, filename)
        with open(path, 'w', encoding='utf-8') as file:
            file.write(text)
        print(f"Распознанный текст сохранен в файл '{path}'.")

class ImageProcessor:
    def __init__(self, recognizer: TextRecognizer, saver: TextSaver):
        self.recognizer = recognizer
        self.saver = saver

    def ask_yes_no(self, question):
        """Запрос подтверждения (да/нет)."""
        while True:
            answer = input(f"{question} (да/д/y/yes, нет/н/n/no): ").strip().lower()
            if answer in ('да', 'д', 'y', 'yes'):
                return True
            elif answer in ('нет', 'н', 'n', 'no'):
                return False
            else:
                print("Пожалуйста, введите 'да', 'д', 'y', 'yes', 'нет', 'н', 'n' или 'no'.")

    def save_image(self, image, filename):
        """Сохранение изображения."""
        cv2.imwrite(filename, image)
        print(f"Изображение сохранено как {filename}")

    def preprocess_image(self, image):
        """Создание нескольких вариантов улучшенных изображений."""
        # Преобразование в серый
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        
        # Вариант 1: Бинаризация
        binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]
        self.save_image(binary, 'binary.png')
        
        # Вариант 2: Гауссово размытие
        blurred = cv2.GaussianBlur(gray, (5, 5), 0)
        self.save_image(blurred, 'blurred.png')
        
        # Вариант 3: Адаптивное пороговое преобразование
        adaptive_thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                                                cv2.THRESH_BINARY, 11, 2)
        self.save_image(adaptive_thresh, 'adaptive_thresh.png')
        
        return {
            '1': ('binary.png', binary),
            '2': ('blurred.png', blurred),
            '3': ('adaptive_thresh.png', adaptive_thresh)
        }

    def process_image(self, image_path: str):
        """Основной процесс обработки изображения."""
        if not os.path.isfile(image_path):
            print("Указанный файл не найден. Пожалуйста, проверьте путь.")
            return

        image = cv2.imread(image_path)
        if image is None:
            print("Не удалось загрузить изображение. Убедитесь, что файл является изображением.")
            return

        # Предварительное улучшение изображения
        if self.ask_yes_no("Хотите улучшить качество изображения перед распознаванием?"):
            options = self.preprocess_image(image)
            print("Варианты улучшения:")
            print("1 - Бинаризация")
            print("2 - Гауссово размытие")
            print("3 - Адаптивное пороговое преобразование")
            
            choice = input("Выберите вариант улучшения (1/2/3): ").strip()
            if choice in options:
                selected_image = options[choice][1]
                print(f"Использование варианта {choice} для распознавания.")
            else:
                print("Некорректный выбор. Используется исходное изображение.")
                selected_image = image
        else:
            selected_image = image

        if self.ask_yes_no("Хотите распознать текст на изображении?"):
            text = self.recognizer.recognize_text(selected_image)
            print(f"Распознанный текст:\n{text}")

            if self.ask_yes_no("Хотите сохранить текст?"):
                self.saver.save_text_to_file(text)

# Убедитесь, что вы используете правильное условие для запуска основной функции
if __name__ == "__main__":
    tesseract_cmd_path = r'C:\Users\<user>\AppData\Local\Programs\Tesseract-OCR\tesseract.exe'
    
    # Инициализация классов
    recognizer = TextRecognizer(tesseract_cmd=tesseract_cmd_path)
    saver = TextSaver(directory='.')
    processor = ImageProcessor(recognizer=recognizer, saver=saver)

    # Запуск обработки изображения
    image_path = input("Укажите путь до изображения (можно без кавычек): ").strip().strip('"')
    processor.process_image(image_path)

```