Apa cara terbaik untuk mendeteksi sudut-sudut faktur / kwitansi / lembar kertas di foto? Ini akan digunakan untuk koreksi perspektif selanjutnya, sebelum OCR.
Pendekatan saya saat ini adalah:
RGB> Gray> Canny Edge Detection dengan thresholding> Dilate (1)> Hapus objek kecil (6)> hapus objek boarder> pilih blog besar berdasarkan Convex Area. > [deteksi sudut - Tidak diterapkan]
Saya tidak bisa tidak berpikir pasti ada pendekatan 'cerdas' / statistik yang lebih kuat untuk menangani jenis segmentasi ini. Saya tidak memiliki banyak contoh pelatihan, tetapi saya mungkin bisa mengumpulkan 100 gambar.
Konteks yang lebih luas:
Saya menggunakan matlab untuk prototipe, dan berencana untuk mengimplementasikan sistem di OpenCV dan Tesserect-OCR. Ini adalah yang pertama dari sejumlah masalah pemrosesan gambar yang perlu saya selesaikan untuk aplikasi khusus ini. Jadi saya mencari solusi saya sendiri dan membiasakan kembali diri saya dengan algoritma pemrosesan gambar.
Berikut beberapa contoh gambar yang ingin saya tangani oleh algoritme: Jika Anda ingin menerima tantangan, gambar besar ada di http://madteckhead.com/tmp
(sumber: madteckhead.com )
(sumber: madteckhead.com )
(sumber: madteckhead.com )
(sumber: madteckhead.com )
Dalam kasus terbaik ini memberi:
(sumber: madteckhead.com )
(sumber: madteckhead.com )
(sumber: madteckhead.com )
Namun gagal dengan mudah pada kasus lain:
(sumber: madteckhead.com )
(sumber: madteckhead.com )
(sumber: madteckhead.com )
Terima kasih sebelumnya untuk semua ide hebatnya! Saya suka BEGITU!
EDIT: Kemajuan Transformasi Hough
T: Algoritme apa yang akan mengelompokkan garis kasar untuk menemukan sudut? Mengikuti saran dari jawaban saya dapat menggunakan Transformasi Hough, memilih garis, dan memfilternya. Pendekatan saya saat ini agak kasar. Saya telah membuat asumsi faktur akan selalu kurang dari 15 derajat tidak sesuai dengan gambar. Saya berakhir dengan hasil yang masuk akal untuk garis jika ini masalahnya (lihat di bawah). Tetapi saya tidak sepenuhnya yakin tentang algoritme yang cocok untuk mengelompokkan garis (atau memilih) untuk memperkirakan sudut. Garis Hough tidak kontinu. Dan pada gambar yang berisik, bisa ada garis paralel sehingga diperlukan beberapa bentuk atau jarak dari metrik asal garis. Ada ide?
(sumber: madteckhead.com )
sumber
Jawaban:
Saya teman Martin yang mengerjakan ini awal tahun ini. Ini adalah proyek pengkodean pertama saya, dan agak berakhir dengan terburu-buru, jadi kodenya perlu beberapa kesalahan ... decoding ... Saya akan memberikan beberapa tip dari apa yang saya lihat sudah Anda lakukan, dan kemudian urutkan kode saya pada hari libur saya besok.
Tip pertama,
OpenCV
danpython
luar biasa, pindah ke mereka sesegera mungkin. : DAlih-alih menghapus objek kecil dan atau kebisingan, turunkan batasan cerdik, sehingga menerima lebih banyak tepi, dan kemudian menemukan kontur tertutup terbesar (dalam penggunaan OpenCV
findcontour()
dengan beberapa parameter sederhana, saya pikir saya menggunakanCV_RETR_LIST
). mungkin masih kesulitan saat berada di atas selembar kertas putih, tetapi jelas memberikan hasil terbaik.Untuk
Houghline2()
Transformasi, coba denganCV_HOUGH_STANDARD
kebalikan dariCV_HOUGH_PROBABILISTIC
, itu akan memberikan nilai rho dan theta , mendefinisikan garis dalam koordinat kutub, dan kemudian Anda dapat mengelompokkan garis dalam toleransi tertentu.Pengelompokan saya bekerja sebagai tabel pencarian, untuk setiap baris yang dihasilkan dari transformasi hough akan menghasilkan pasangan rho dan theta. Jika nilai-nilai ini ada di dalam, katakanlah 5% dari sepasang nilai dalam tabel, mereka dibuang, jika mereka berada di luar 5% itu, entri baru ditambahkan ke tabel.
Anda kemudian dapat melakukan analisis garis paralel atau jarak antar garis dengan lebih mudah.
Semoga ini membantu.
sumber
Sekelompok mahasiswa di universitas saya baru-baru ini mendemonstrasikan aplikasi iPhone (dan aplikasi OpenCV python) yang mereka tulis untuk melakukan hal ini. Seingat saya, langkah-langkahnya adalah seperti ini:
Ini tampaknya bekerja dengan cukup baik dan mereka dapat mengambil foto selembar kertas atau buku, melakukan deteksi sudut dan kemudian memetakan dokumen dalam gambar ke bidang datar hampir secara realtime (ada satu fungsi OpenCV yang harus dilakukan pemetaan). Tidak ada OCR saat saya melihatnya berfungsi.
sumber
Inilah yang saya dapatkan setelah sedikit eksperimen:
Tidak sempurna, tetapi setidaknya berfungsi untuk semua sampel:
sumber
for line in lines[0]: cv2.line(edges, (line[0], line[1]), (line[2], line[3]), (255,0,0), 2, 8) # finding contours contours, _ = cv2.findContours(edges.copy(), cv.CV_RETR_EXTERNAL, cv.CV_CHAIN_APPROX_TC89_KCOS) contours = filter(lambda cont: cv2.arcLength(cont, False) > 100, contours) contours = filter(lambda cont: cv2.contourArea(cont) > 10000, contours)
Alih-alih memulai dari deteksi tepi, Anda bisa menggunakan deteksi sudut.
Marvin Framework menyediakan implementasi algoritma Moravec untuk tujuan ini. Anda bisa menemukan sudut-sudut kertas sebagai titik awal. Di bawah keluaran algoritma Moravec:
sumber
Anda juga dapat menggunakan MSER (Wilayah ekstrem yang stabil maksimum ) melalui hasil operator Sobel untuk menemukan wilayah gambar yang stabil. Untuk setiap wilayah yang dikembalikan oleh MSER Anda dapat menerapkan convex hull dan poly aproksimasi untuk mendapatkan beberapa seperti ini:
Tetapi jenis deteksi ini berguna untuk deteksi langsung lebih dari satu gambar yang tidak selalu memberikan hasil terbaik.
sumber
Setelah deteksi tepi, gunakan Hough Transform. Kemudian, letakkan titik-titik tersebut di SVM (mesin vektor pendukung) dengan labelnya, jika contoh memiliki garis halus, SVM tidak akan mengalami kesulitan untuk membagi bagian yang diperlukan dari contoh dan bagian lain. Saran saya tentang SVM, letakkan parameter seperti konektivitas dan panjang. Artinya, jika poin terhubung dan panjang, kemungkinan besar itu adalah garis tanda terima. Kemudian, Anda dapat menghilangkan semua poin lainnya.
sumber
Di sini Anda memiliki kode @Vanuan menggunakan C ++:
sumber
std::vector<cv::Vec4i> lines;
dideklarasikan dalam lingkup global dalam proyek saya.Ubah ke ruang lab
Gunakan cluster kmeans segment 2
sumber