Saya sudah mencoba menghapus gambar untuk OCR: (garis)
Saya perlu menghapus garis-garis ini untuk kadang-kadang lebih lanjut memproses gambar dan saya mendapatkan cukup dekat tetapi banyak waktu ambang terlalu banyak dari teks:
copy = img.copy()
blur = cv2.GaussianBlur(copy, (9,9), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,30)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
dilate = cv2.dilate(thresh, kernel, iterations=2)
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 300:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(copy, (x, y), (x + w, y + h), (36,255,12), 3)
Sunting: Selain itu, menggunakan angka konstan tidak akan berfungsi jika font berubah. Apakah ada cara umum untuk melakukan ini?
Jawaban:
Ini ide. Kami memecah masalah ini menjadi beberapa langkah:
Tentukan rata-rata area kontur persegi panjang. Kami ambang lalu menemukan kontur dan filter menggunakan area persegi panjang pembatas dari kontur. Alasan kami melakukan ini adalah karena pengamatan bahwa setiap karakter khas hanya akan begitu besar sedangkan kebisingan besar akan menjangkau area persegi panjang yang lebih besar. Kami kemudian menentukan area rata-rata.
Hapus kontur outlier besar. Kami beralih melalui kontur lagi dan menghapus kontur besar jika mereka
5x
lebih besar dari area kontur rata-rata dengan mengisi kontur. Alih-alih menggunakan area ambang tetap, kami menggunakan ambang dinamis ini untuk ketahanan lebih.Dilatasi dengan kernel vertikal untuk menghubungkan karakter . Idenya adalah memanfaatkan pengamatan bahwa karakter disejajarkan dalam kolom. Dengan melebarkan dengan kernel vertikal kami menghubungkan teks bersama sehingga noise tidak akan dimasukkan dalam kontur gabungan ini.
Hapus kebisingan kecil . Sekarang setelah teks disimpan, kami menemukan kontur dan menghapus kontur yang lebih kecil dari
4x
area kontur rata-rata.Bitwise-dan untuk merekonstruksi gambar . Karena kami hanya menginginkan kontur untuk tetap berada di topeng kami, kami bitwise-dan untuk melestarikan teks dan mendapatkan hasil kami.
Berikut visualisasi prosesnya:
Kami menetapkan ambang Otsu untuk mendapatkan gambar biner kemudian menemukan kontur untuk menentukan rata-rata area kontur persegi panjang. Dari sini kami menghapus kontur outlier besar yang disorot dengan warna hijau dengan mengisi kontur
Selanjutnya kita membangun kernel vertikal dan melebar untuk menghubungkan karakter. Langkah ini menghubungkan semua teks yang diinginkan untuk menyimpan dan mengisolasi suara menjadi gumpalan individual.
Sekarang kami menemukan kontur dan filter menggunakan area kontur untuk menghilangkan kebisingan kecil
Berikut adalah semua partikel kebisingan yang dihapus yang disorot dengan warna hijau
Hasil
Kode
Catatan: Pemrosesan gambar tradisional terbatas pada ambang, operasi morfologis, dan pemfilteran kontur (perkiraan kontur, area, rasio aspek, atau deteksi gumpalan). Karena gambar input dapat bervariasi berdasarkan ukuran teks karakter, menemukan solusi tunggal cukup sulit. Anda mungkin ingin melihat pelatihan classifier Anda sendiri dengan pembelajaran mesin / mendalam untuk solusi yang dinamis.
sumber