Saya menulis sebuah skrip kecil dengan python di mana saya mencoba untuk mengekstrak atau memotong bagian dari kartu remi yang hanya mewakili karya seni, menghilangkan sisanya. Saya sudah mencoba berbagai metode ambang tetapi tidak bisa sampai di sana. Juga perhatikan bahwa saya tidak bisa hanya merekam secara manual posisi karya seni karena tidak selalu dalam posisi atau ukuran yang sama, tetapi selalu dalam bentuk persegi panjang di mana yang lainnya hanyalah teks dan batas.
from matplotlib import pyplot as plt
import cv2
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)
binary = cv2.bitwise_not(binary)
kernel = np.ones((15, 15), np.uint8)
closing = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
plt.imshow(closing),plt.show()
Output saat ini adalah hal terdekat yang bisa saya dapatkan. Saya bisa berada di jalan yang benar dan mencoba beberapa perselisihan lebih lanjut untuk menggambar persegi panjang di sekitar bagian putih, tapi saya tidak berpikir itu metode yang berkelanjutan:
Sebagai catatan terakhir, lihat kartu di bawah, tidak semua bingkai memiliki ukuran atau posisi yang persis sama, tetapi selalu ada karya seni dengan hanya teks dan batas di sekitarnya. Tidak harus dipotong dengan sangat tepat, tetapi jelas bahwa seni adalah "wilayah" kartu, dikelilingi oleh wilayah lain yang berisi beberapa teks. Tujuan saya adalah mencoba menangkap wilayah karya seni sebaik mungkin.
sumber
Jawaban:
Saya menggunakan transformasi garis Hough untuk mendeteksi bagian linear dari gambar. Persimpangan semua garis digunakan untuk membangun semua persegi panjang yang mungkin, yang tidak mengandung titik persimpangan lainnya. Karena bagian dari kartu yang Anda cari selalu yang terbesar dari segi empat (setidaknya dalam sampel yang Anda berikan), saya hanya memilih yang paling besar dari segi empat sebagai pemenang. Skrip berfungsi tanpa interaksi pengguna.
Ini adalah hasil dengan sampel yang Anda berikan:
Kode untuk menemukan penyilangan garis dapat ditemukan di sini: temukan titik persimpangan dua garis yang ditarik menggunakan houghlines opencv
Anda dapat membaca lebih lanjut tentang Garis Hough di sini .
sumber
Kita tahu bahwa kartu memiliki batas lurus sepanjang sumbu x dan y. Kita dapat menggunakan ini untuk mengekstrak bagian gambar. Kode berikut mengimplementasikan pendeteksian garis horizontal dan vertikal pada gambar.
Anda hanya perlu mengklik dua area untuk disertakan. Area klik sampel dan hasil yang sesuai adalah sebagai berikut:
Hasil dari gambar lain:
sumber
Saya pikir tidak mungkin untuk memotong ROI karya seni secara otomatis menggunakan teknik pemrosesan gambar tradisional karena sifat dinamis dari warna, dimensi, lokasi, dan tekstur untuk setiap kartu. Anda harus mempelajari pembelajaran mesin / mendalam dan melatih classifier Anda sendiri jika Anda ingin melakukannya secara otomatis. Alih-alih, inilah pendekatan manual untuk memilih dan memotong ROI statis dari sebuah gambar.
Idenya adalah untuk menggunakan
cv2.setMouseCallback()
dan penangan acara untuk mendeteksi apakah mouse telah diklik atau dilepaskan. Untuk implementasi ini, Anda dapat mengekstraksi ROI karya seni dengan menahan tombol kiri mouse dan menarik untuk memilih ROI yang diinginkan. Setelah Anda memilih ROI yang diinginkan, tekanc
untuk memotong dan menyimpan ROI. Anda dapat mengatur ulang ROI menggunakan tombol kanan mouse.ROI karya seni yang disimpan
Kode
sumber