Saya mencoba menemukan kotak teks pembatas dalam gambar dan saat ini saya menggunakan pendekatan ini:
// calculate the local variances of the grayscale image
Mat t_mean, t_mean_2;
Mat grayF;
outImg_gray.convertTo(grayF, CV_32F);
int winSize = 35;
blur(grayF, t_mean, cv::Size(winSize,winSize));
blur(grayF.mul(grayF), t_mean_2, cv::Size(winSize,winSize));
Mat varMat = t_mean_2 - t_mean.mul(t_mean);
varMat.convertTo(varMat, CV_8U);
// threshold the high variance regions
Mat varMatRegions = varMat > 100;
Saat diberi gambar seperti ini:
Lalu ketika saya menunjukkan varMatRegions
saya mendapatkan gambar ini:
Seperti yang Anda lihat, ia agak mengkombinasikan blok teks kiri dengan header kartu, untuk sebagian besar kartu metode ini berfungsi dengan baik tetapi pada kartu yang lebih sibuk dapat menyebabkan masalah.
Alasan buruk bagi kontur untuk terhubung adalah karena kontur kotak hampir mengambil seluruh kartu.
Adakah yang bisa menyarankan cara lain saya bisa menemukan teks untuk memastikan deteksi teks yang tepat?
200 poin kepada siapa pun yang dapat menemukan teks dalam kartu di atas keduanya.
Jawaban:
Anda dapat mendeteksi teks dengan menemukan elemen tepi dekat (terinspirasi dari LPD):
Pemakaian:
Hasil:
Sebuah. element = getStructureElement (cv :: MORPH_RECT, cv :: Size (17, 3));
b. element = getStructureElement (cv :: MORPH_RECT, cv :: Size (30, 30));
Hasil serupa untuk gambar lain yang disebutkan.
sumber
n
? Terima kasih atas solusinya, ini bekerja dengan sangat baik!cv::Rect a;
. Diperbesar dengan n:a.x-=n/2;a.y-=n/2;a.width+=n;a.height+=n;
.Saya menggunakan metode berbasis gradien dalam program di bawah ini. Menambahkan gambar yang dihasilkan. Harap dicatat bahwa saya menggunakan versi gambar yang diperkecil untuk diproses.
versi c ++
versi python
sumber
rect
. Ada satupyrdown
, jadi gandakanx, y, width, height
darirect
4.Berikut adalah pendekatan alternatif yang saya gunakan untuk mendeteksi blok teks:
Di bawah ini adalah kode yang ditulis dalam python dengan pyopencv, seharusnya mudah untuk port ke C ++.
Gambar asli adalah gambar pertama di posting Anda.
Setelah preprocessing (skala abu-abu, ambang dan dilatasi - jadi setelah langkah 3) gambar tampak seperti ini:
Di bawah ini adalah gambar yang dihasilkan ("contoured.jpg" di baris terakhir); kotak pembatas akhir untuk objek dalam gambar terlihat seperti ini:
Anda dapat melihat blok teks di sebelah kiri terdeteksi sebagai blok terpisah, dibatasi dari lingkungannya.
Menggunakan skrip yang sama dengan parameter yang sama (kecuali untuk tipe thresholding yang diubah untuk gambar kedua seperti dijelaskan di bawah), berikut adalah hasil untuk 2 kartu lainnya:
Menyetel parameter
Parameter (nilai ambang, parameter pelebaran) dioptimalkan untuk gambar ini dan tugas ini (menemukan blok teks) dan dapat disesuaikan, jika perlu, untuk gambar kartu lain atau jenis objek lain yang dapat ditemukan.
Untuk thresholding (langkah 2), saya menggunakan threshold hitam. Untuk gambar di mana teks lebih ringan dari latar belakang, seperti gambar kedua di posting Anda, ambang putih harus digunakan, jadi ganti dengan tipe penyimpanan dengan
cv2.THRESH_BINARY
). Untuk gambar kedua saya juga menggunakan nilai yang sedikit lebih tinggi untuk ambang (180). Memvariasikan parameter untuk nilai ambang batas dan jumlah iterasi untuk pelebaran akan menghasilkan berbagai tingkat sensitivitas dalam membatasi objek dalam gambar.Menemukan jenis objek lain:
Misalnya, mengurangi pelebaran hingga 5 iterasi pada gambar pertama memberi kita batasan objek yang lebih baik dalam gambar, dengan kasar menemukan semua kata dalam gambar (daripada blok teks):
Mengetahui ukuran kata yang kasar, di sini saya membuang area yang terlalu kecil (di bawah 20 piksel lebar atau tinggi) atau terlalu besar (di atas 100 piksel lebar atau tinggi) untuk mengabaikan objek yang tidak mungkin berupa kata, untuk mendapatkan hasil dalam gambar di atas.
sumber
cv2.findContours
. DikatakanValueError: too many values to unpack
.cv2.findContours
mengembalikan 3 argumen, dan kode asli hanya menangkap 2.@ Pendekatan dhanushka menunjukkan janji yang paling, tetapi saya ingin bermain-main dengan Python jadi lanjutkan dan terjemahkan untuk bersenang-senang:
Sekarang untuk menampilkan gambar:
Bukan yang paling Pythonic dari skrip tetapi saya mencoba menyerupai kode asli C ++ sedekat mungkin untuk diikuti oleh pembaca.
Ini berfungsi hampir sama seperti aslinya. Saya akan senang membaca saran bagaimana itu bisa diperbaiki / diperbaiki agar menyerupai hasil asli sepenuhnya.
sumber
drawContours
keadaan itu "Fungsi menggambar garis kontur pada gambar jika ketebalan> 0 atau mengisi area yang dibatasi oleh kontur jika ketebalan <0." Ini dilakukan agar kami dapat memeriksa rasio piksel bukan nol untuk memutuskan apakah kotak tersebut kemungkinan berisi teks.Anda dapat mencoba metode ini yang dikembangkan oleh Chucai Yi dan Yingli Tian.
Mereka juga berbagi perangkat lunak (yang didasarkan pada Opencv-1.0 dan harus dijalankan di bawah platform Windows.) Yang dapat Anda gunakan (meskipun tidak ada kode sumber yang tersedia). Ini akan menghasilkan semua kotak pembatas teks (ditampilkan dalam bayangan warna) pada gambar. Dengan menerapkan ke gambar sampel Anda, Anda akan mendapatkan hasil berikut:
Catatan: untuk membuat hasilnya lebih kuat, Anda dapat menggabungkan kotak yang berdekatan menjadi satu.
Pembaruan: Jika tujuan akhir Anda adalah untuk mengenali teks dalam gambar, Anda dapat memeriksa gttext , yang merupakan perangkat lunak bebas OCR dan alat Truthing Tanah untuk Gambar Berwarna dengan Teks. Kode sumber juga tersedia.
Dengan ini, Anda bisa mendapatkan teks yang dikenal seperti:
sumber
Above Code versi JAVA: Terima kasih @ William
Dan gunakan kode ini dalam praktiknya:
sumber
Implementasi Python untuk solusi @ dhanushka:
sumber
Ini adalah versi C # jawaban dari dhanushka menggunakan OpenCVSharp
sumber
ini adalah versi VB.NET dari jawaban dari dhanushka menggunakan EmguCV .
Beberapa fungsi dan struktur di EmguCV perlu pertimbangan berbeda dari versi C # dengan OpenCVSharp
sumber