Apply EasyOCR
The node that actually reads the words in your image
- image
- IMAGE
- MASK
- JSON
Most ComfyUI nodes move pixels around and hope. Apply EasyOCR is the rare one that reads: it detects every text region in your image, recognizes what the words say, and hands you three outputs - an annotated image, a mask, and the text as structured data. It's the whole EasyOCR Python library (the Jaided AI one) wrapped into a single node, and it ships in the prodogape/ComfyUI-EasyOCR pack.
The name isn't a lie and there's no API key or cloud call involved - everything runs locally. When would you reach for it? Most people find this node the way r/comfyui finds it: building an automated watermark/logo removal pipeline. OCR the image, grab the MASK, feed it into an inpainting node, and text disappears without you hand-masking hundreds of product photos. It's also genuinely useful for captioning pipelines (the JSON output is labelme-format, made for annotation datasets) and for cleaning scanned documents before they go through a detailer.
How it works
Under the hood it's textbook EasyOCR. The node takes your batch of images, converts each frame to a PIL/numpy array, spins up an easyocr.Reader for the languages you asked for, and calls readtext(). That call runs two stages: CRAFT detects text regions as boxes, then the recognition model reads the characters inside each box. Detection and recognition model files (craft_mlt_25k.pth, latin_g2.pth, zh_sim_g2.pth, …) download automatically on first use into ComfyUI/models/EasyOCR/ - that's why your first run hangs for a while. It's a portable, CPU-friendly library that also runs happily on GPU.
The inputs that matter
Only five inputs, and honestly two of them decide everything:
- language_list / language_name - the two language controls. The dropdown (
language_list) has 44 entries including 简体中文, 繁體中文, Japanese, Korean, Cyrillic, Thai and so on; the text field (language_name, defaultch_sim,en) takes comma-separated EasyOCR language codes directly. The detect enum switches between them: set it tochooseand it uses the dropdown, set it toinputand it parses the code string. If you speak one language, leave it alone and it just works. - gpu - boolean, default
true. Set it tofalseif you're on CPU-only or hitting VRAM pressure; EasyOCR runs fine on CPU, just slower. - image - any IMAGE tensor. It loops over every frame in the batch, so a batch of N images gets N OCR passes.
The outputs and where they go
The trio is the whole point:
- IMAGE - your original image with red rectangles drawn around every detected text box, plus the recognized text and its confidence score painted above each box. This is the "show me it worked" output.
- MASK - white rectangles on black, exactly covering the detected text. This is the output that makes the watermark-removal pipeline work: wire it into an inpainting node and the text regions get repainted.
- JSON - labelme-format data with each shape's bounding box points, the recognized label, and the confidence. Pipe it into whatever tooling you use for annotations or captions.
Installing it
ComfyUI Manager - search "ComfyUI-EasyOCR" and install. Or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/prodogape/ComfyUI-EasyOCR
Then restart ComfyUI. The node auto-installs its Python dependencies on startup via requirements.txt (the pack's only real dependency is easyocr, but that pulls in opencv, scipy, shapely, pyclipper and friends, so the install is chunkier than it looks). If you installed outside Manager and the auto-install didn't fire, run pip install easyocr in ComfyUI's embedded Python yourself.
Gotchas worth knowing
- Models re-download and reload on every execution. The Reader is constructed inside each call, not cached, so every run pays the model-load cost - and a batch of N images pays it N times. Fine for single images; slow for bulk cleanup. It's the node's biggest wart.
- Detection isn't magic. As one r/comfyui watermark-removal thread put it: EasyOCR "works for detecting text, but sometimes it misses stylized logos or semi-transparent watermarks." If your logos are fancy or faint, the mask will have gaps and you'll be patching them manually. CRAFT is good at text, not at brandmarks.
- First run feels broken. It isn't - it's downloading models. Watch
ComfyUI/models/EasyOCR/fill up. If you're behind a restrictive firewall, that download can silently stall, and this node doesn't expose EasyOCR'sdownload_enabledflag, so the fix is fetching the.pthfiles manually.
Read the words, take the mask, inpaint, done. It's one of those small single-purpose nodes that quietly powers entire automated workflows.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| gpu | BOOLEAN | true | — |
| detect | COMBO | choose | 2 options: choose, input |
| language_list | COMBO | English | 44 options: English, 简体中文, 繁體中文, العربية, Azərbaycan, Euskal, +38 |
| language_name | STRING | ch_sim,en | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| MASK | MASK | — |
| JSON | JSON | — |