Bagaimana saya bisa tahu persis apa yang berubah antara dua gambar?

28

Misalnya, untuk percakapan terkini tentang kompresi JPEG, saya ingin membandingkan piksel untuk piksel yang berubah antara dua JPEG (satu dengan tingkat kompresi 100, dan satu dengan tingkat kompresi 95).

Bagaimana cara menghasilkan peta visual yang bagus dari apa yang berubah tanpa pemrograman perangkat lunak khusus yang membosankan?

taksi
sumber
2
Tidak mengirimkan ini sebagai jawaban karena mungkin bukan solusi yang layak untuk foto, tetapi GitHub (situs programmer) memiliki beberapa cara menarik untuk membandingkan gambar: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Cobalah mengklik "2-up", "Geser", "Kulit Bawang" dan "Perbedaan".
Henrik N

Jawaban:

35

Photoshop + Layers FTW. (Ya, Anda juga dapat menggunakan Gimp, atau perangkat lunak pengeditan lainnya dengan fungsi yang sama.)

Mulailah dengan gambar dasar Anda, dalam kasus di atas, saya menggunakan gambar 100 kualitas jpeg.

  1. buat layer baru di atasnya
  2. rekatkan gambar kedua ke dalam lapisan itu
  3. atur layer style ke "difference" (lihat panah merah muda kiri pada gambar 1 di bawah)
  4. buat layer efek di atas itu (Layer> New Adjustment Layer> Threshold)
  5. atur efek ke threshold (lihat panah merah muda kanan di gambar 1 di bawah)
  6. atur nilai ambang ke 1

Pada gambar yang dihasilkan, piksel apa pun yang berbeda di antara kedua gambar akan berwarna putih. Anda dapat menyesuaikannya untuk memungkinkan hal-hal menjadi "sedikit berbeda" dengan mengubah nilai ambang batas.

Contoh menunjukkan BANYAK perbedaan antara jpeg 92 dan 100 dari Lightroom. membandingkan jpeg 92 dan 100 dari LR dengan lapisan Photoshop

Contoh tidak menunjukkan perbedaan sama sekali antara 95 dan 100. membandingkan jpeg 95 dan 100 dari LR dengan lapisan Photoshop

Bukannya itu hanya menunjukkan biner "diubah atau tidak", bagaimana jika Anda ingin lebih detail tentang seberapa banyak ia berubah, katakan dengan saluran warna?

  1. ganti lapisan penyesuaian ambang batas dengan lapisan penyesuaian kurva.
  2. edit kurva
  3. nyalakan kliping acara
  4. ambil pegangan putih input di bawah sudut kanan bawah dan seret ke kiri, sejauh yang Anda bisa
  5. perlahan-lahan kembali ke kanan sampai Anda tidak melihat kliping (gambar pratinjau semuanya hitam)
  6. hidupkan kliping kembali dan simpan perubahan kurva

Semakin cerah piksel yang dihasilkan, semakin banyak warnanya. Kelemahannya adalah Anda berakhir dengan banyak lumpur abu-abu ... jadi terkadang lebih mudah untuk hanya mengiriknya untuk melihat perbedaannya. Itu sebabnya saya membangun keduanya dan beralih mana yang terlihat.

lihat perbedaan lebih deskriptif

taksi
sumber
Pertanyaan newb, tetapi bagaimana Anda melakukan langkah 4, "buat layer efek di atas itu"? Tidak dapat menemukannya di mana pun. Ini juga 7 tahun kemudian dan saya menggunakan versi terbaru untuk mungkin mereka telah mengubah nama juga?
whitneyland
14

Jika Anda menggunakan Photoshop, inilah cara saya melakukannya:

Letakkan dua jpeg dalam file psd yang sama, dalam dua lapisan terpisah. Mereka harus tumpang tindih persis, karena dimensi mereka sama. (mana yang berjalan di atas tidak masalah).

Atur blending mode layer ke "Perbedaan." Anda akan melihat sebagian besar hasil hitam. Tergantung pada perbedaan kualitas antara dua lapisan asli Anda mungkin melihat lebih atau kurang dari kebisingan.

masukkan deskripsi gambar di sini

Jin
sumber
Perbedaan itu sendiri tidak banyak membantu ketika Anda pergi dengan kekosongan hitam besar seperti itu. :)
cabbey
@cabbey yakin, membandingkan 100% hingga 95% kemungkinan besar Anda akan mendapatkan warna hitam pekat. Tapi itu pertanyaanmu, bukan? Di jawaban pemilik Anda, Anda mengubah nilai dari dokumen asli yang dibandingkan, yang membuatnya tidak lagi memiliki pengaturan kompresi asli.
Jin
Anda mendapatkan hitam pekat pada perbandingan apa pun, karena perbedaannya sangat kecil. Lapisan ambang / kurva setelah perbedaan tidak melakukan apa pun pada pengaturan kompresi, itu hanya membantu visualisasi batas bawah sup hitam yang disiapkan perbedaan. (Saya tidak 100% yakin apa yang Anda maksudkan dengan hal itu, jadi saya bisa menuju ke arah yang berbeda di sana ....)
cabbey
@cabbey jika Anda meminta operasi bit-wise murni dari perbedaan antara 2 gambar, maka mode blending "Perbedaan" saja memberi Anda itu. Ketika Anda menyesuaikan ambang / kurva, meskipun hasilnya lebih jelas dengan mata telanjang, tapi itu bukan representasi akurat tentang apa yang telah berubah. Ketika Anda melakukannya, Anda tidak lagi membandingkan 100% hingga 95%.
Jin
Tentu Anda. Tingkat kompresi berhenti berpengaruh pada photoshop kedua yang memuat gambar dari disk ke buffer internal, sekarang menjadi array piksel yang tidak terkompresi dalam memori ... jika piksel tersebut sampai di sana karena gambar tersebut memiliki gumpalan persegi di sana atau karena itu adalah artefak dari tingkat kompresi tidak relevan.
taksi
13

Semua paket pemrosesan gambar harus membuatnya mudah. Saya akan menunjukkan kepada Anda bagaimana melakukannya di Mathematica, jika Anda memiliki akses ke sistem ini. Mathematica adalah bahasa pemrograman, tetapi sangat mudah untuk melakukan manipulasi semacam ini, jadi jika Anda memiliki akses ke sana (misalnya melalui lisensi situs universitas), saya sarankan Anda mencobanya!

Pertama, impor gambar:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

Kompres ulang menggunakan kompresi JPEG

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Grafik Mathematica

Sekarang ambil perbedaan nilai piksel, konversikan terlebih dahulu dengan angka floating point untuk memastikan bahwa nilai negatif dipertahankan.

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Grafik Mathematica

Tidak banyak yang terlihat pada gambar perbedaan (perbedaannya kecil), dan nilai negatif terpotong menjadi hitam. Jadi mari kita skala ulang semua nilai untuk mengisi seluruh rentang dinamis (minimum akan diskalakan ke 0, maksimum ke 1):

ImageAdjust[diff]

Grafik Mathematica

ImageDifferencememberikan perbedaan absolut dari kedua gambar, dan tidak menghasilkan angka negatif. Ini adalah operasi yang lebih mungkin Anda temukan dalam paket pemrosesan gambar, terutama yang GUI (Photoshop, GIMP).

ImageDifference[img, img2]

Grafik Mathematica

Kami juga dapat mengambil satu saluran RGB, misalnya yang merah, dan memvisualisasikan perbedaan positif dan negatif menggunakan warna 'berlawanan':

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Grafik Mathematica

Inilah hal yang sama, dengan perbedaan diperkuat 5 kali. Artefak JPEG lebih mudah dikenali sekarang.

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Grafik Mathematica

Keuntungan menggunakan bahasa pemrograman adalah kita dapat dengan mudah mengotomatisasi ini dan melihat bagaimana perbedaannya berubah untuk "tingkat kompresi" antara 0,1 dan 1,0:

Grid@Partition[Table[
   ArrayPlot[
    0.5 + ImageData[
      First@ColorSeparate[
        ImageSubtract[Image[img, "Real"], 
         Image[ImportString@
           ExportString[img, "JPEG", "CompressionLevel" -> c], 
          "Real"]], "Red"]], ColorFunction -> "RedGreenSplit", 
    ColorFunctionScaling -> False],
   {c, 0.1, 1, 0.1}
   ], 5]

Grafik Mathematica

Szabolcs
sumber
Itu selalu baik untuk melihat opsi scripted / otomatis! :)
jrista
5

Anda dapat menggunakan alat baris perintah Imagemagick.

composite imagesrc1.jpg imagesrc2.jpg -compose difference diffs.jpg

akan memberikan nilai absolut perbedaan untuk setiap saluran RGB.

mikael
sumber
0
  1. Buka salah satu gambar di GIMP atau Photoshop.
  2. Tambahkan gambar kedua sebagai layer baru di atas yang pertama.
  3. Atur blending mode dari lapisan atas ke "Perbedaan"

Dalam gambar yang dihasilkan bagian hitam menunjukkan di mana gambar asli identik dan apa pun yang lebih terang menunjukkan perbedaan.

Dan
sumber
Perbedaan itu sendiri tidak banyak membantu ketika Anda pergi dengan kekosongan hitam besar seperti itu. :)
cabbey
Anda selalu dapat menyesuaikan level pada gambar yang dihasilkan. Setiap kali saya menggunakan teknik ini, saya punya gambar yang cukup berbeda untuk dapat melihat perubahannya :)
Dan