Bagaimana cara mengetahui apakah dua gambar itu sama? [Tutup]

20

Saya memiliki lebih dari 10.000 gambar yang sekitar 2000 adalah duplikat dalam format lain (seperti dalam JPEG, PNG, GIF). Kedua angka ini meningkat setiap hari. Saya perlu menghapus duplikat itu dan untuk itu saya harus tahu cara menemukannya terlebih dahulu.

Pikiran pertama saya adalah memeriksa piksel gambar dan menemukan gambar lain yang memiliki piksel berwarna sama di koordinat yang sama. Tetapi opsi ini tidak selalu berhasil. Katakanlah saya mencari duplikat. Adapun objek yang dapat dicari saya memilih file PNG 8 bit. Ini akan menemukan semua duplikat dari gambar itu, tetapi hanya PNG 8 bit, kadang-kadang 8bit GIF dan jarang JPEG (karena saya kira algoritmik gambarnya?).

Pikiran kedua saya adalah untuk menduplikasi semua gambar itu dan mewarnai ulang mereka dalam palet dua warna yang ketat (katakanlah hitam & putih) dan melakukan pemindaian yang sama seperti yang dinyatakan di atas. Sekali lagi gambar JPEG tidak 100% mirip dengan format PNG atau GIF (alasan yang sama seperti di atas?).

Pikiran ketiga adalah untuk mengurangi persentase pada seberapa banyak gambar perlu terbiasa dan meningkatkan seberapa banyak warna dapat bervariasi, menghasilkan penghapusan gambar yang tidak diinginkan ...

Adakah pikiran?

Aistis
sumber
Format dengan kompresi lossy akan mengarah ke gambar yang tidak 100% identik dengan versi losless. Haruskah Anda memiliki utilitas baris perintah atau dapatkah Anda menjalankan program gui, yang memberikan saran, lalu memperlihatkan gambar yang memiliki, katakan> 90% piksel serupa (menghitung rata-rata penyimpangan)? (dan tentu saja ukuran piksel harus identik dalam format apa pun)
thorsten müller
1
Berapa banyak yang akan memiliki nama file yang sama tetapi ekstensi berbeda?
JeffO
4
Jawaban yang berguna yang tidak memerlukan minggu pengkodean: stackoverflow.com/questions/596262/…
mac

Jawaban:

17

Hash perseptual mungkin jawabannya:

http://www.phash.org/

Hash perseptual adalah sidik jari dari file multimedia yang berasal dari berbagai fitur dari kontennya. Tidak seperti fungsi hash kriptografi yang bergantung pada efek longsoran dari perubahan kecil pada input yang mengarah ke perubahan drastis pada output, hash perceptual "dekat" satu sama lain jika fitur-fiturnya mirip.

Joe
sumber
9
  1. Periksa dimensi. Jika berbeda => gambar tidak sama.
  2. Periksa format. Jika sama => Lakukan perbandingan yang tepat, piksel demi piksel.
  3. Jika format berbeda lakukan ini:

Jangan bandingkan RGB (merah, hijau, biru). Bandingkan Brightness dengan setengah bobot dan bandingkan warna / rona dengan separuh lainnya (atau 2 / 3rds vs 1/3). Hitung selisih nilai dan tergantung pada nilai 'toleransi' mereka sama atau tidak.

JPEG sangat mengompres informasi warna tetapi mencoba untuk tidak merusak nilai liminance.

Boris Yankov
sumber
6

Ketika saya sedang menyaring banyak gambar untuk dupes beberapa tahun yang lalu saya menemukan bahwa mengurangi semuanya menjadi 8x8 thumbnail dan kemudian menghitung skor kesamaan berdasarkan kuadrat jarak (memperlakukan tiga warna secara terpisah) antara thumbnail bekerja cukup baik. Perhatikan bahwa Anda dapat menyimpan BANYAK thumbnail 8x8 dalam memori.

Hampir semua dupes mendapat skor di bawah non-dupes, tentang satu-satunya masalah adalah beberapa gambar yang kontras sangat rendah dan keseluruhan serupa meskipun konten yang sebenarnya bervariasi (latar belakang dalam setiap kasus adalah pasir pantai.)

Ini juga efektif untuk menangkap gambar yang dupes kecuali seseorang telah mengurangi resolusi atau kualitasnya untuk memotong ukuran file.

Loren Pechtel
sumber
1
Biasanya YUV lebih baik dari RGB, kurang sensitif terhadap perubahan kecil dalam keseimbangan warna.
Martin Beckett
Teknik thumbnails ini untuk pra-pilih pencocokan potensial adalah valid, YUV adalah sentuhan yang bagus dan saya telah melihatnya beralih ke peta luminance murni untuk alasan yang sama.
Patrick Hughes
@ Martin Beckett: Jumlah kuadrat dari perbedaan RGB adalah hal pertama yang saya coba dan bekerja cukup baik sehingga saya tidak berusaha memperbaikinya - dan pada saat itu menangkap dupes dengan pengeditan. Dengan definisi dupe yang ketat itu sudah cukup baik sehingga saya akan membiarkannya menghapus otomatis.
Loren Pechtel
@ Loren, jika itu adalah pengeditan piksel kecil dari gambar yang sama yang seharusnya berfungsi. Hanya saja hal-hal seperti jpeg mengacaukan RGB lebih dari ruang warna YUV. Tip ;-)
Martin Beckett
Secara alami, gambar yang sangat gelap cenderung memiliki jumlah kuadrat-perbedaan yang lebih rendah, bahkan jika mereka tidak sama sekali. Ambang mungkin disesuaikan dengan luminositas rata-rata gambar. Saya menggunakan luminositas rata-rata ini sebagai pra-filter untuk menghindari perbandingan gambar O (n ^ 2), jadi sudah ada di sana.
Gabriel
1

Mungkin Anda harus menulis beberapa kode yang memindai gambar agar mirip. Anda dapat mengonversi semua foto ke format ARGB dan membandingkannya. (dalam kenangan)

Pendekatan yang mungkin bisa seperti ini: Membagi gambar dalam zona. Pindai warna dan / atau kecerahan rata-rata zona untuk membandingkan dua gambar untuk kemiripan.

Jika lebih dari mengatakan, 90% dari zona cocok, Anda memilih satu untuk pindah ke daftar kandidat penghapusan. Dengan cara ini Anda memiliki daftar kandidat. Anda dapat menggunakan rasio aspek gambar untuk mengkategorikan gambar dalam gambar horizontal dan vertikal untuk mempercepat perbandingan. dengan cara ini Anda dapat mengkompensasi algoritma lossy yang tidak mereproduksi warna piksel yang tepat. Anda menjalankan program semalam, dan di pagi hari Anda sudah selesai :) di. Net ini bisa dilakukan dengan mudah dengan dia GDI + lib.

Onno
sumber