"Diff" gambar menggunakan ImageMagick

178

Bagaimana saya bisa mendapatkan perbedaan antara dua gambar? Saya memiliki gambar aslinya. Seseorang telah menulis duplikat persis dari gambar aslinya. Sekarang, saya perlu membandingkan yang asli dengan yang ditulis pada gambar dan hanya mengekstrak tulisan dalam format gambar.

Contoh: Saya punya foto rumah. Seseorang mengambil salinan dan menulis "Halo!" pada salinan. Saya ingin entah bagaimana membandingkan dua gambar, menghapus rumah, dan dibiarkan dengan gambar kata "Halo!".

Apakah ini mungkin dengan ImageMagick? Saya tahu ada cara untuk mendapatkan perbedaan statistik antara gambar, tetapi bukan itu yang saya cari.

Justin Noel
sumber
8
Coba bagian ini dari panduan penggunaan ImageMagick!
Benoit
1
Aku tahu pertanyaan ini adalah tentang ImageMagick, tapi aku hanya harus menyertakan link ke Resemble.js untuk "causual" pencari yang mungkin setelah solusi agnostik.
brichins
Adakah yang tahu alat yang akan membandingkan 2 gambar dengan mengurangi piksel gambar kedua, dari yang pertama? Saya lebih suka tidak menulis sendiri.
MarcusJ
Imagemagick 7 memiliki hash perseptual, sebuah teknik yang menggunakan momen gambar invarian. itu bagus dalam arti bahwa hash yang sama bahkan setelah rotasi, distorsi barel, mengubah ukuran, perubahan gamma, pengenalan kebisingan, watermarking ...
v.oddou
1
@ v.oddou, Terima kasih. Saya membaca dokumen dan melakukan beberapa tes lagi. Tampaknya berkinerja buruk dengan gambar garis yang sangat jarang penduduknya dan kerapatan piksel sangat rendah. Sepertinya kerapatan piksel adalah kunci dalam mengidentifikasi kesamaan PHASH.
BReddy

Jawaban:

320

Favorit saya sendiri adalah dua ini:

 compare image1 image2 -compose src diff.png
 compare image1 image2 -compose src diff.pdf

Satu-satunya perbedaan antara 2 perintah di atas: yang pertama menunjukkan perbedaan visual antara dua gambar sebagai file PNG, yang kedua sebagai PDF.

File diff yang dihasilkan menampilkan semua piksel yang berbeda dalam warna merah. Yang tidak berubah tampak putih.

Pendek dan manis.

Catatan, gambar Anda tidak perlu harus bertipe sama. Anda bahkan dapat mencampur JPEG, TIFF, PNG - dalam satu kondisi: gambar harus berukuran sama (dimensi gambar dalam piksel). Format output ditentukan oleh ekstensi nama file output.

Jika Anda, karena alasan tertentu, memerlukan resolusi yang lebih tinggi daripada yang standar (72 dpi) - maka tambahkan saja -densityparameter yang sesuai :

 compare -density 300 image1 image2 -compose src diff.jpeg

Contoh ilustrasi

Berikut adalah beberapa ilustrasi hasil untuk variasi dari perintah di atas. Catatan: kedua file yang dibandingkan itu bahkan file PDF , jadi ini juga berfungsi dengan baik (asalkan 1-halaman)!


Kiri: Gambar dengan pusat teks       : Gambar asli       Kanan: Perbedaan (= teks) dalam piksel merah. Pixel perbedaan merah saja;  piksel identik berwarna putih

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf

Ini adalah perintah yang sama yang saya sarankan sebelumnya di atas.


Kiri: Gambar dengan pusat teks       : Gambar asli       Kanan: Perbedaan dalam piksel 'seagreen'. Hanya piksel perbedaan Seagreen;  piksel identik berwarna putih

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf

Perintah ini menambahkan parameter untuk membuat perbedaan piksel 'seagreen' alih-alih merah standar.


Kiri: Gambar dengan teks       Pusat: Gambar asli       Kanan: Biru berbeda (tetapi dengan beberapa latar belakang konteks) Pixel perbedaan biru saja;  pertama dari gambar yang dibandingkan sebagai latar belakang yang lebih terangl

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf

Perintah ini menghapus -compose srcbagian - hasilnya adalah perilaku default compareyang membuat latar belakang yang terang sebagai yang pertama dari 2 gambar yang berbeda. (Kali ini dengan parameter yang ditambahkan untuk membuat piksel diff muncul berwarna biru.)

Kurt Pfeifle
sumber
Saya tidak dapat memahami dari mana cli perbandingan ini berasal? Apakah itu bagian dari imagebrick? tersedia di windows?
Krishnom
2
@ Krishnom: Tidak ada yang namanya 'imagebrick'. Apakah maksud Anda ImageMagick?
Kurt Pfeifle
2
@ Krishnom: Pertanyaan dengan jelas bertanya tentang solusi ImageMagick. Bagian dari suite perangkat lunak v6.x ImageMagick memiliki alat CLI terpisah yang disebut 'compare'. Untuk v7.x dari ImageMagick Anda harus menjalankannya 'magick compare'.
Kurt Pfeifle
Salahku. Terima kasih telah memperbaiki itu (imagebrick -> imageMagick). Saya akan mencobanya. Saya juga mencari alat untuk membandingkan gambar massal. Terima kasih atas bantuannya lagi
Krishnom
@ Krishnom: Saya tidak tahu apa itu "gambar massal". Tetapi saya masih bertaruh bahwa rangkaian alat ImageMagick dapat melakukan apa yang Anda inginkan.
Kurt Pfeifle
53

Meskipun comparemelakukan pekerjaan yang baik untuk banyak aplikasi, saya menemukan bahwa kadang-kadang saya lebih suka pendekatan yang berbeda, terutama ketika membandingkan gambar yang sebagian besar skala abu-abu:

convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \
        '(' file2.png -flatten -grayscale Rec709Luminance ')' \
        '(' -clone 0-1 -compose darken -composite ')' \
        -channel RGB -combine diff.png

Idenya adalah berikut: mengkonversi baik file1.pngdan file2.pnguntuk grayscale. Kemudian trat yang pertama sebagai saluran merah dari gambar yang dihasilkan, yang kedua sebagai saluran hijau. Saluran biru terbentuk dari keduanya menggunakandarken operator penulisan, yang pada dasarnya berarti mengambil minimum.

Jadi hal-hal yang putih di kedua gambar tetap putih. Hal-hal yang hitam di kedua gambar tetap hitam. Benda-benda yang berwarna putih di gambar pertama tetapi hitam di belokan kedua merah, dan benda-benda yang putih di belokan kedua tetapi hitam di belokan pertama berwarna hijau.

Hasilnya memberi Anda gambar kode warna dengan baik di mana Anda dapat dengan mudah mengaitkan hijau dengan input pertama dan merah dengan yang kedua. Berikut adalah contoh di mana saya menggunakan ini untuk membandingkan output dari LaTeX dengan yang dari KaTeX (sebelum saya memperbaiki beberapa bug untuk membuat ini lebih baik):

masukkan deskripsi gambar di sini

Anda dapat menggabungkan pendekatan, gunakan compareuntuk melihat di mana sesuatu berubah dan kemudian menggunakan di atas untuk melihat lebih detail bagaimana itu berubah.

MvG
sumber
2
Bagus! Saya membutuhkan interaksi, jadi saya meniru metode Anda di Gimp. Untuk referensi: 1) memuat gambar sebagai lapisan, 2) Warna -> Desaturate kedua lapisan, 3) menghapus saluran alpha dari kedua lapisan pada tab Layers, 4) pilih saluran G + B pada satu lapisan, pilih semua dan hapus saluran dengan warna hitam, sama dengan saluran R + B pada lapisan kedua, 4) mengatur mode Layar untuk lapisan atas pada tab Layers.
Matěj Šmíd
1
@Palmstrom: Terima kasih! Saya awalnya melakukan perbandingan gambar ini menggunakan Gimp sendiri, tetapi saya melakukannya dengan menggunakan mode layer "ekstrak biji-bijian" langsung pada gambar input, sehingga area umum akan berakhir abu-abu, sedangkan diff akan menjadi hitam di satu arah dan putih di yang lain . Sulit dibaca, tetapi lebih cepat dihasilkan, dan dapat berisi informasi warna. Saya kira Anda akan cocok dengan perintah saya bahkan lebih dekat jika Anda menggunakan "hanya gelap" daripada "layar", dan warna saluran yang tidak digunakan putih bukan hitam.
MvG
1
Beberapa input PDF menghasilkan gambar terbalik setelah konversi skala abu-abu untuk beberapa alasan. Menggunakan -colorspace grayalih-alih -grayscale Rec709Luminanceperbaikan itu, tetapi ini mengacaukan komposisi. Tambahkan -respect-parenthesessebagai opsi pertama convertuntuk mengatasinya.
Brecht Machiels
Berikut ini skrip untuk secara visual membedakan dua PDF halaman demi halaman menggunakan metode ini: gist.github.com/brechtm/891de9f72516c1b2cbc1 . Ini menghasilkan satu JPG untuk setiap halaman PDF dalam pdfdiffdirektori dan juga mencetak jumlah halaman yang berbeda antara kedua PDF.
Brecht Machiels
1
Di ImageMagick v6.7.7-10-10 tampaknya -grayscaletidak didukung, saya harus menggunakan -colorspace grayseperti yang disarankan
@BrechtMachiels