Enterprise Document Text Extractor: OpenCV & EasyOCR Pipeline for EDMS Searchability
Bagaimana saya membangun sistem pra-pemrosesan citra menggunakan OpenCV dan OCR (EasyOCR/Tesseract) untuk mengekstrak isi teks dokumen fisik agar dapat dicari pada sistem manajemen dokumen korporat.
Ringkasan Eksekutif
Saat menjalani program internship bootcamp di Berijalan Techno Center, saya berkesempatan untuk berkontribusi dalam pengembangan proyek EDMS (Enterprise Document Management System) perusahaan, yang dikenal secara komersial sebagai Documend (https://berijalan.co.id/products/documend). Salah satu tantangan fungsional terbesar pada platform manajemen dokumen saat itu adalah dokumen fisik yang diunggah (dalam bentuk pindaian foto atau PDF) bersifat statis dan isinya tidak dapat dicari (searchable). Pengguna hanya bisa mencari berkas berdasarkan nama dokumen atau metadata dasar.
Karena belum ada API OCR internal yang tersedia kala itu, saya berinisiatif merancang dan membangun sebuah purwarupa pipeline Enterprise Document Text Extractor secara mandiri menggunakan Python, OpenCV, dan mesin OCR (EasyOCR & Tesseract). Purwarupa ini ditujukan untuk meluruskan, memperjelas kontras dokumen pudar, mengekstrak isi teks secara asinkron, dan menyediakannya untuk kebutuhan indeks pencarian teks penuh (full-text search index). Meskipun perubahan kustom ini akhirnya tidak diintegrasikan ke produk produksi EDMS dan tetap menjadi proyek pribadi saya, proyek ini membuktikan pemahaman mendalam saya terhadap teknik computer vision dan rekayasa data citra.
Arsitektur Pipeline Ekstraksi Teks
Pipeline ekstraksi teks dirancang untuk menangani variasi dokumen fisik yang diunggah pengguna dengan kualitas kamera seadanya dan sudut pemotretan yang miring. Proses ini berjalan secara sekuensial:
graph TD
User[Dokumen Fisik / Foto Pudar] -->|Upload| Web[Upload Gateway]
subgraph Preprocessing [OpenCV Preprocessing Layer]
Web -->|1. Grayscale| Gray[Grayscale Conversion]
Gray -->|2. Deskew| Rotate[Deskewing via minAreaRect]
Rotate -->|3. Contrast Enhancement| CLAHE[CLAHE Adaptation]
CLAHE -->|4. Denoise| Blur[Bilateral Filter]
end
subgraph Extraction [OCR Inference Layer]
Blur -->|EasyOCR / Deep Learning| Easy[EasyOCR Engine]
Blur -->|Legacy Tesseract| Tess[Tesseract OCR Engine]
end
Easy -->|Output Text| Search[(Full-Text Search Index / EDMS)]
Tess -->|Output Text| Search
style Preprocessing fill:#f9f,stroke:#333,stroke-width:1px
style Extraction fill:#bfb,stroke:#333,stroke-width:1px
Detail Rekayasa Citra dengan OpenCV
Foto dokumen yang redup, berbayang, atau miring sering kali tidak terbaca sama sekali oleh mesin OCR. Untuk mengoptimalkannya, saya menerapkan tiga teknik pra-pemrosesan citra utama:
- Deskewing (Pelurusan Gambar):
Menggunakan fungsi
cv2.minAreaRectuntuk menghitung sudut kemiringan teks (skew angle) pada area teks terdeteksi, kemudian memutar gambar kembali ke posisi lurus menggunakan matriks transformasi afinitas (cv2.warpAffine) untuk mengoreksi rotasi tulisan. - CLAHE (Contrast Limited Adaptive Histogram Equalization): Teknik pemerataan histogram lokal untuk meningkatkan kontras teks secara adaptif. CLAHE sangat efektif untuk dokumen KTP atau struk yang tintanya pudar atau memiliki pencahayaan tidak merata karena bayangan kamera.
- Bilateral Filtering: Menghaluskan noise latar belakang citra (seperti bintik kertas atau motif latar belakang dokumen) tanpa menumpulkan ketajaman tepi garis karakter huruf. Ini krusial karena binarisasi biasa sering kali memecah garis huruf jika noise-nya terlalu tebal.
Berikut adalah implementasi Python yang saya bangun untuk tahap pra-pemrosesan dokumen:
import cv2
import numpy as np
def deskew_image(image):
"""
Melakukan koreksi kemiringan (deskewing) menggunakan minAreaRect
untuk mendeteksi sudut orientasi teks/dokumen secara otomatis.
"""
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.bitwise_not(gray)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
coords = np.column_stack(np.where(thresh > 0))
if len(coords) == 0:
return image, 0.0
rect = cv2.minAreaRect(coords)
angle = rect[-1]
# Normalisasi sudut rotasi
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
if abs(angle) > 45:
return image, 0.0
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
return rotated, angle
def preprocess_clahe_denoised(img_gray):
"""
Meningkatkan kontras lokal menggunakan CLAHE dan menghaluskan noise
latar belakang dengan Bilateral Filter tanpa merusak tepi huruf.
"""
# Terapkan CLAHE untuk memperjelas tulisan pudar
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
enhanced = clahe.apply(img_gray)
# Bilateral filter untuk mereduksi noise latar belakang secara selektif
denoised = cv2.bilateralFilter(enhanced, 9, 75, 75)
return denoised
Evaluasi & Komparasi Mesin OCR (EasyOCR vs Tesseract)
Dalam mengevaluasi performa ekstraksi teks Bahasa Indonesia dan Inggris pada dokumen fisik, saya membandingkan dua pendekatan mesin OCR:
- EasyOCR (Deep Learning berbasis PyTorch):
- Kelebihan: Sangat tangguh dalam mengenali karakter yang tidak beraturan, font tidak standar, dan citra dengan kontras rendah pasca-proses CLAHE.
- Kekurangan: Membutuhkan resource komputasi (CPU/GPU) yang lebih tinggi dibanding Tesseract.
- Tesseract OCR (Pattern Matching Tradisional):
- Kelebihan: Sangat cepat dan efisien untuk dokumen teks bersih terstruktur (seperti PDF pindaian mesin scanner).
- Kekurangan: Sangat sensitif terhadap noise latar belakang dan kemiringan dokumen.
Dari hasil pengujian terhadap 100+ sampel foto dokumen pudar/miring:
- Tanpa Pra-pemrosesan: Tesseract sering kali menghasilkan teks kosong atau simbol acak (gibberish).
- Dengan Pipeline Pra-pemrosesan OpenCV: Panjang karakter teks yang diekstraksi secara benar oleh EasyOCR meningkat hingga 45% pada foto dokumen berselimut bayangan. Tesseract juga mengalami peningkatan keterbacaan yang signifikan setelah sudut rotasi diluruskan (deskewed).
Dampak & Hasil Pembelajaran
- Pencarian EDMS Mandiri: Membuktikan kelayakan konsep pencarian teks penuh (full-text search) di EDMS menggunakan indeks teks ter-OCR tanpa bergantung pada API eksternal berbayar.
- Keahlian Rekayasa Citra: Memperkuat pemahaman saya mengenai manipulasi ruang warna (color space), transformasi afinitas citra, histogram kontras lokal, serta integrasi pustaka pembelajaran mendalam berbasis PyTorch dalam alur rekayasa data.