Spaces:
Sleeping
Sleeping
| """ | |
| OCR فارسی با یک خط بارگذاری تصویر + نمایش نتایج در گریدیو | |
| """ | |
| import gradio as gr | |
| import cv2, io, os | |
| import numpy as np | |
| from PIL import Image, ImageDraw, ImageFont | |
| import tesserocr # حتماً در تصویر داکر نصب شده باشد | |
| from tesserocr import PyTessBaseAPI | |
| # ------------------------------- | |
| # تحریرک Tesseract سادهخط | |
| # ------------------------------- | |
| DEFAULT_TESS_PATH = '/usr/share/tesseract-ocr/4.00/tessdata/' # در بیشتر تصاویر داکر HuggingFace | |
| RESIZE_LONG_SIDE = 1024 # مقیاس برای کاهش هزینه پردازش | |
| def resize_longest(img: Image.Image, max_long: int = RESIZE_LONG_SIDE): | |
| w, h = img.size | |
| ratio = max_long / max(w, h) | |
| if ratio >= 1: | |
| return img | |
| new_w = int(w * ratio) | |
| new_h = int(h * ratio) | |
| return img.resize((new_w, new_h), Image.LANCZOS) | |
| def persian_ocr_one(file): | |
| if isinstance(file, tuple): | |
| img = Image.open(file[0]) | |
| else: | |
| img = Image.open(file) | |
| img = img.convert("RGB") | |
| img = resize_longest(img) | |
| pix = np.array(img) | |
| # تبدیل به طیفهای تأثیرگذار برای متون فارسی | |
| gray = cv2.cvtColor(pix, cv2.COLOR_RGB2GRAY) | |
| den = cv2.fastNlMeansDenoising(gray, None, 10, 7, 21) | |
| image_bin = Image.fromarray(den) | |
| # راهاندازی Tesseract فقط یکبار در هر فراخوانی (به دلیل thread-safe بودن) | |
| # دقت کنید زبان را روی 'fas' تنظیم کرده باشید | |
| tess_args = ( | |
| 6, # PSM__SINGLE_BLOCK | |
| {"lang": "fas"} # فارسی | |
| ) | |
| api = PyTessBaseAPI(path=DEFAULT_TESS_PATH, | |
| lang='fas', | |
| psm=tesserocr.PSM.SINGLE_BLOCK) | |
| api.SetImage(image_bin) | |
| text = api.GetUTF8Text().strip() | |
| api.End() | |
| return text | |
| # ------------------------------- | |
| # رابط کاربری مینیمال | |
| # ------------------------------- | |
| demo = gr.Interface( | |
| fn=persian_ocr_one, | |
| inputs=gr.Image(type="filepath", label="تصویر"), | |
| outputs=gr.Textbox(label="متن استخراجشده (فارسی)"), | |
| title="OCR فارسی", | |
| description="تصویری که شامل متن فارسی است را بارگذاری کنید تا متن داخل آن استخراج شود." | |
| ) | |
| if __name__ == "__main__": | |
| demo.queue(max_size=20).launch() |