Saya memiliki gambar ini yang berisi teks (angka dan huruf) di dalamnya. Saya ingin mendapatkan lokasi dari semua teks dan angka yang ada di gambar ini. Saya juga ingin mengekstraksi semua teks.
Bagaimana cara mendapatkan kordinat serta semua teks (angka dan huruf) di gambar saya. Untuk mis 10B, 44, 16, 38, 22B dll
python
opencv
machine-learning
image-processing
deep-learning
Pulkit Bhatnagar
sumber
sumber
Jawaban:
Berikut adalah pendekatan potensial menggunakan operasi morfologis untuk memfilter kontur non-teks. Idenya adalah:
Dapatkan gambar biner. Memuat gambar, skala abu-abu, lalu ambang batas Otsu
Hapus garis horizontal dan vertikal. Buat kernel horisontal dan vertikal menggunakan
cv2.getStructuringElement
lalu hapus garis dengancv2.drawContours
Hapus garis diagonal, objek lingkaran, dan kontur melengkung. Saring menggunakan area kontur
cv2.contourArea
dan pendekatan konturcv2.approxPolyDP
untuk mengisolasi kontur non-teksEkstrak ROI dan OCR teks. Temukan kontur dan filter untuk ROI kemudian OCR menggunakan Pytesseract .
Garis horizontal yang dihapus disorot dalam warna hijau
Garis vertikal yang dihapus
Menghapus berbagai kontur non-teks (garis diagonal, objek melingkar, dan kurva)
Wilayah teks yang terdeteksi
sumber
Baiklah, inilah solusi lain yang mungkin. Saya tahu Anda bekerja dengan Python - Saya bekerja dengan C ++. Saya akan memberi Anda beberapa ide dan mudah-mudahan, jika Anda menginginkannya, Anda akan dapat menerapkan jawaban ini.
Gagasan utamanya adalah untuk tidak menggunakan pra-pemrosesan sama sekali (setidaknya tidak pada tahap awal) dan sebaliknya fokus pada setiap karakter target, dapatkan beberapa properti , dan filter setiap gumpalan sesuai dengan properti ini.
Saya mencoba untuk tidak menggunakan pra-pemrosesan karena: 1) Filter dan tahapan morfologis dapat menurunkan kualitas gumpalan dan 2) gumpalan target Anda tampaknya menunjukkan beberapa karakteristik yang dapat kami eksploitasi, terutama: rasio aspek dan area .
Lihat saja, angka dan huruf semuanya tampak lebih tinggi daripada yang lebih luas ... lebih jauh lagi, semuanya tampak bervariasi dalam nilai area tertentu. Misalnya, Anda ingin membuang objek "terlalu lebar" atau "terlalu besar" .
Idenya adalah bahwa saya akan memfilter semua yang tidak termasuk dalam nilai yang telah dihitung sebelumnya. Saya memeriksa karakter (angka dan huruf) dan datang dengan nilai area minimum, maksimum dan rasio aspek minimum (di sini, rasio antara tinggi dan lebar).
Mari kita bekerja pada algoritma. Mulailah dengan membaca gambar dan mengubah ukurannya menjadi setengah dimensi. Gambar Anda terlalu besar. Konversikan ke skala abu-abu dan dapatkan gambar biner melalui otsu, berikut dalam pseudo-code:
Keren. Kami akan bekerja dengan gambar ini. Anda perlu memeriksa setiap gumpalan putih, dan menerapkan "filter properti" . Saya menggunakan komponen yang terhubung dengan statistik untuk loop melalui setiap gumpalan dan mendapatkan area dan aspek rasio, di C ++ ini dilakukan sebagai berikut:
Sekarang, kita akan menerapkan filter properti. Ini hanya perbandingan dengan ambang yang dihitung sebelumnya. Saya menggunakan nilai-nilai berikut:
Di dalam
for
lingkaran Anda , bandingkan properti gumpalan saat ini dengan nilai-nilai ini. Jika hasil tes positif, Anda "mengecat" gumpalan hitam. Melanjutkan di dalamfor
lingkaran:Setelah loop, buat gambar yang difilter:
Dan ... cukup banyak. Anda memfilter semua elemen yang tidak mirip dengan yang Anda cari. Menjalankan algoritme Anda mendapatkan hasil ini:
Saya juga telah menemukan Bounding Boxes of the blob untuk lebih memvisualisasikan hasil:
Seperti yang Anda lihat, beberapa elemen tidak terdeteksi. Anda dapat memperbaiki "filter properti" untuk mengidentifikasi karakter yang Anda cari dengan lebih baik. Solusi yang lebih dalam, yang melibatkan sedikit pembelajaran mesin, membutuhkan konstruksi "vektor fitur ideal", mengekstraksi fitur dari gumpalan, dan membandingkan kedua vektor melalui ukuran kesamaan. Anda juga dapat menerapkan beberapa proses pasca untuk meningkatkan hasil ...
Apa pun, kawan, masalah Anda tidak sepele atau tidak mudah diukur, dan saya hanya memberi Anda ide. Semoga Anda dapat menerapkan solusi Anda.
sumber
Salah satu metode adalah dengan menggunakan jendela geser (Itu mahal).
Tentukan ukuran karakter dalam gambar (semua karakter memiliki ukuran yang sama seperti yang terlihat pada gambar) dan atur ukuran jendela. Coba tesseract untuk deteksi (Gambar input membutuhkan pra pemrosesan). Jika sebuah jendela mendeteksi karakter secara berurutan, maka simpan koordinat jendela tersebut. Gabungkan koordinat dan dapatkan wilayah pada karakter.
sumber