Menemukan kotak di Gambar

34

Saya perlu menemukan kotak dalam gambar menggunakan OpenCV (tidak ada masalah di matlab atau lainnya, umumnya yang saya harapkan adalah beberapa ide).

Perhatikan gambar uji di bawah ini:

masukkan deskripsi gambar di sini

Saya perlu menemukan kotak berwarna pada gambar di atas secara akurat (bukan strip panjang putih).

Apa yang telah aku lakukan :

  • Saya menerapkan metode umum (yang datang dengan sampel OpenCV), yaitu menemukan kontur di semua bidang warna, perkiraan dan periksa jumlah elemen = 4. Ini berfungsi untuk beberapa memperluas itu, beberapa kotak terdeteksi, terutama yang gelap.

  • Langkah selanjutnya yang saya lakukan adalah prediksi . yaitu pengaturan ini diperbaiki . Jadi, jika ada yang diperoleh, saya bisa memprediksi yang tersisa. Ini juga berhasil sampai batas tertentu. Tetapi akurasi sangat buruk.

Tetapi saya merasa prediksi bukanlah metode yang baik di sini dan tidak selalu memberikan jawaban yang akurat seperti yang diberikan pada langkah pertama.

Apa yang saya butuhkan :

1) Apakah ada metode lain yang lebih baik untuk mendeteksi kotak ini lebih akurat? Atau beberapa metode?

Satu poin penting adalah bahwa waktu tidak menjadi masalah di sini . Algoritma bisa lambat, tidak masalah. Tetapi akurasi adalah kriteria utama.

Terkadang, gambar bisa menjadi lebih buram.

Dan salah satu masalah utama yang saya hadapi adalah beberapa kotak memiliki warna yang hampir sama dengan latar belakang (periksa kolom 3 kotak pertama dan kedua).

Mencari ide, terima kasih sebelumnya

PEMBARUAN:

Di bawah ini adalah hasil akurat maksimum yang saya dapatkan:

masukkan deskripsi gambar di sini

Tentu saja, gambar hasil diubah ukurannya sedikit.

PEMBARUAN 2:

Saya telah memberikan solusi yang jauh lebih baik dalam jawaban saya di bawah ini: https://dsp.stackexchange.com/a/7526/818

Abid Rahman K
sumber
Apakah latar belakang Anda selalu keputihan?
1
ide saya adalah untuk menghitung "saturasi" dan ambang sat img tetapi menggunakan contoh Anda itu tidak bekerja dengan baik (menghitung saturasi sebagai maks (RG, RB, GB). Fakta bahwa beberapa kotak terlihat hampir seperti latar belakang membuat masalahnya cukup sulit. Jika semua gambar Anda memiliki pola yang sama (garis-garis putih panjang dengan kotak di sebelahnya) Anda harus mempertimbangkan untuk menemukan bit yang paling mudah (seperti kotak yang benar-benar berwarna, atau garis-garis putih) menyimpulkan lokasi yang mungkin untuk yang lain kotak dan ... menemukan cara untuk memeriksa apakah mereka benar-benar ada atau tidak. Cukup tapi menarik! Bisakah Anda memberi lebih banyak gambar?
Yah, saya pikir ini seharusnya tidak dipindahkan.
Junuxx
1
Bisakah Anda memberikan lebih banyak gambar? Juga, benda apa ini?
Andrey Rubshtein
2
OP perlu menjawab beberapa pertanyaan. Mungkin latar belakang putih tidak perlu. Dan ada apa dengan cahaya? Apakah akan seburuk itu? Ini kelihatannya tidak perlu bagi saya.
Tae-Sung Shin

Jawaban:

9

Upaya pertama menggunakan Matlab:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

Hasil di wilayah berikut:

daerah berlabel

Seperti yang Anda lihat, memilih ambang yang menghasilkan jumlah wilayah tertinggi (T = 120) sudah akan memberikan 7 lokasi yang benar, beberapa lokasi digabung, satu positif palsu dan dua negatif palsu.

Ini adalah upaya yang cukup sederhana tetapi saya pikir itu menunjukkan bahwa pendekatan tersebut berhasil. Menambahkan beberapa barang untuk memecah daerah yang memanjang, atau melakukan ini untuk setiap saluran warna secara terpisah adalah beberapa hal yang dapat Anda lakukan untuk meningkatkannya.

Ini juga akan membantu jika Anda memberikan beberapa gambar uji lagi.

Junuxx
sumber
8

Saya telah mencoba sesuatu yang lain untuk meningkatkan hasil saya dalam pertanyaan. Solusi di bawah ini dengan asumsi bahwa kuadrat pertama (oranye) selalu terdeteksi pada langkah 1. Dan praktis karena warna kontrasnya yang tinggi dibandingkan dengan latar belakang. Bahkan hasil yang saya tunjukkan dalam pertanyaan telah mendeteksi dengan benar

Langkah 1: Temukan sebanyak mungkin kotak

Saya membagi gambar menjadi bidang R, G, B, H, S, V dan menetapkan ambang batas gambar untuk nilai ambang yang berbeda seperti kelipatan 25. Untuk setiap gambar, saya menemukan kotak di dalamnya, dan meletakkannya di "gambar topeng" . Saya juga menemukan tinggi dan lebar rata-rata bujur sangkar.

gambar topeng (Total 7/12 kotak terdeteksi):

gambar topeng

Langkah 2: Bentuk kotak kotak

Selanjutnya saya menemukan centroid kotak ini dalam gambar topeng. Mengurutkan mereka dan menemukan pusat massa persegi pertama (oranye). Dari analisis dekat, kita dapat melihat celah antara dua kotak adalah kuadrat baik dalam arah horizontal maupun vertikal. Jadi dengan cara ini, saya membuat kotak kotak seperti di bawah ini dan menyebutnya ideal_squares (itu hanya sebuah nama, itu tidak berarti ini adalah output yang saya butuhkan):

ideal_squares:

gambar yang ideal

Langkah 3: Remap the ideal_image

Sekarang kami memiliki centroid ideal_squares dan centroid asli. Saya menemukan kecocokan yang benar untuk setiap centroid asli dari ideal_centroids (dengan mengambil jarak euclidean di antara mereka). Lalu saya menggunakan Scipy interpolate.griddata untuk interpolasi dan memetakan ulang ideal_image sesuai dengan nilai centroid (hampir sama dengan melengkungkan yang dilakukan dalam T&J ini: Cara menghapus cacat kecembungan pada sudoku square & transformasi Gambar di OpenCV ). Jadi di bawah ini adalah output yang saya dapatkan:

Keluaran:

Gambar Keluaran

Langkah 4: ATAU beroperasi output di atas dengan gambar topeng dari langkah pertama

hasil akhir

Sekarang Anda dapat melihat semua kotak terdeteksi, tetapi dengan masalah yang disebutkan di bawah ini:

Masalah:

Lihatlah output Langkah 3, yaitu gambar yang dipetakan ulang dari kotak persegi. Kecuali dua kotak pusat, semua kotak lainnya terpotong. Ini adalah masalah yang terkait dengan pemetaan ulang ini. Saya tidak yakin di mana masalahnya, dengan scipy.interpolate.griddata () atau cv2.remap (). Saya pikir seluruh gambar akan bengkok, tetapi tidak. Itu warp gambar hanya di dalam centroid yang kami berikan. Jika saya bisa memperbaikinya, hasilnya akan baik-baik saja.

Jadi, jika seseorang tahu ide bagus untuk itu, selamat datang !!!

Abid Rahman K
sumber
5

Catatan: Metode ini akan sangat lambat.

Hasilkan topeng yang terlihat seperti kontur objek yang ideal. Mirip dengan ini:

topeng objek

kemudian geser (posisi, skala, rotasi) topeng di atas gambar dan cocokkan dengan kontur gambar nyata (mungkin kabur sedikit untuk mendapatkan respons yang lebih lembut) untuk menghitung seberapa mirip mereka, (posisi, skala, rotasi) dengan respons kesamaan tertinggi seharusnya adalah (posisi, skala, rotasi) dari objek nyata.

Metode ini tidak keberatan memadukan kuadrat ke latar belakang atau bahkan sebagian oklusi objek, karena mempertimbangkan seluruh objek.

Saya secara pribadi telah menggunakan metode ini dengan sukses untuk melacak moncong dan kumis tikus, tetapi saya memiliki beberapa anggapan seperti itu dekat dengan posisi terakhir yang diketahui dll. Tapi saya pikir Anda dapat menurunkan ruang pencarian dengan menerapkan beberapa asumsi seperti: ukuran yang mungkin dari objek di kamera, seberapa jauh dari pusat dapat atau rotasi <10deg dll.

SlimJim
sumber
5

Langkah 1: Apa pun gambar biner terakhir yang Anda peroleh dari analisis dalam bidang B, G, R, H, S, V, dalam gambar tersebut lakukan algoritma penghitungan gumpalan.

Langkah 2: Temukan gumpalan terbesar berdasarkan luas atau panjang kontur. Karena gumpalan Anda sebagian besar merupakan jenis jajaran genjang sehingga luas atau kontur, siapa pun akan melakukannya.

Langkah 3: Dengan gumpalan terbesar (karena gumpalan terbesar adalah gumpalan terbaik yang menyerupai kuadrat dunia nyata Anda) cobalah untuk menemukan orientasi gumpalan ... ini bisa Anda dapatkan dengan memasang persegi panjang paling pas ATAU Anda bisa mendapatkan titik sudut ... dapatkan kemiringan garis yang menyertainya (baik dalam cakrawala dan arah vertikal).

Langkah 4: Setelah Anda mendapatkan dua lereng, buat dua garis berjalan melalui sumbu gumpalan. untuk sumbu Anda dapat rata-rata titik sudut atau Anda dapat menggunakan centroid (pusat massa) ... Saya akan pergi dengan rata-rata titik sudut ...

Langkah 5: Karena di setiap arah horizontal dan vertikal, jaraknya sama (jarak horizontal dan vertikal idealnya juga sama karena berasal dari gambar persegi ideal Anda, tetapi kami tidak akan menganggapnya ..) hanya perlu menemukan kemungkinan centroid yang lain jajaran genjang

BOTTOM LINE: Jika ada satu kotak yang terdeteksi dengan sempurna, Anda dapat membuat seluruh kotak. Terus tandai pusat pada interval 2H (H = lebar horizontal gumpalan terbesar) sepanjang sumbu horizontal gumpalan terbesar dan pada interval 2V (V = ketinggian vertikal gumpalan terbesar) secara vertikal di sepanjang sumbu vertikal gumpalan.

Beberapa foto untuk didukung masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

rotating_image
sumber
1
+1 - Akan lebih bagus jika Anda bisa menerapkannya.
Abid Rahman K
2
@AbidRahmanK Bukan itu tujuan StackExchange. Pertanyaan -> Jawab. Kalau tidak, ini akan berakhir dengan bursa kerja.
Jan Kruger
2

pengaturan ini sudah diperbaiki

Saya tidak benar-benar tahu prediksi seperti apa yang Anda lakukan sebelumnya, tetapi pernahkah Anda mencoba untuk fokus pada strip panjang putih sebagai root. Kemudian (jika 3 kolom kuadrat berukuran sama), Anda dapat mendeteksi ketinggian kotak (jarak antara dua strip) dan Anda dapat mendeteksi area max dan min (tinggi dan lebar) pada gambar.

Kemudian, cobalah untuk mendeteksi warna yang paling umum di dalam seluruh kotak Anda dan mengaturnya ke area "non-kotak". Sisanya seharusnya kotak yang Anda cari.


sumber
Saya menemukan 3-4 kotak menggunakan metode kontur. Kemudian dapatkan tinggi dan lebar setiap kotak. Kemudian memeriksa celah antara kotak yang terdeteksi dan diasumsikan jika celah di antara mereka cukup besar untuk menampung kotak lain. Itulah prediksi yang saya buat.
Abid Rahman K
Beberapa kotak memiliki warna yang hampir sama dengan latar belakang. Jadi saya khawatir, mereka juga akan dianggap sebagai area non-persegi sesuai metode Anda.
Abid Rahman K
Mungkin Anda bisa mencoba bekerja pada setiap kolom untuk merencanakan kurva di mana sumbu x akan menjadi tinggi (dalam pixel) dalam gambar dan sumbu y akan menjadi intensitas. Kemudian, Anda bisa mencoba menemukan beberapa ujung tombak dengan bentuk turunan.
itu deteksi tepi itu sendiri, kan? Saya mencobanya, tetapi tidak mendapatkan hasil yang baik.
Abid Rahman K
1
Ya itu, tetapi Anda bisa melihat sendiri mengapa gagal dan mungkin mengisolasi beberapa daerah yang menarik dalam plot. Omong-omong, jika Anda menemukan beberapa tips bermanfaat untuk menyelesaikan masalah Anda, silakan posting mereka. Semoga sukses untuk riset Anda
0

Saya akan menyarankan menggunakan transformasi Hough, yang merupakan algoritma yang sangat kuat untuk menemukan bentuk parametrik sederhana misalnya garis, lingkaran dll. Deteksi garis akan menjadi yang terbaik dalam kasus Anda. Setidaknya Anda bisa menemukan sisi-sisi dari tetesan putih panjang; kemudian, dengan algoritme ekstraktor sudut mana pun (Harris atau bahkan SIFT atau SURF), Anda dapat menemukan sudut di sepanjang garis tersebut, bahkan menggunakan fakta bahwa kotak-kotak tersebut kira-kira berjarak sama.

canahari
sumber