ImageMagick kullanarak bir görüntüyü “farklılaştırma”


179

İki resim arasındaki farkı nasıl alabilirim? Orijinal görüntüm var. Birisi orijinal görüntünün tam kopyasını yazdı. Şimdi, orijinali resimdeki yazılı ile karşılaştırmam ve sadece yazı biçimini resim formatında çıkarmam gerekiyor.

Örnek: Bir ev resmim var. Birisi bir kopyasını aldı ve “Merhaba!” Yazdı. kopya üzerinde. Bir şekilde iki resmi karşılaştırmak, evi kaldırmak ve “Merhaba!” Kelimelerinin resmini bırakmak istiyorum.

ImageMagick ile bu mümkün müdür? Görüntüler arasındaki istatistiksel farkı elde etmenin yolları olduğunu biliyorum, ama aradığım şey bu değil.


8
ImageMagick kullanım kılavuzunun bu bölümünü deneyin !
Benoit

1
Bu sorunun ImageMagick ile ilgili olduğunu biliyorum, ama sadece agnostik bir çözümden sonra olabilecek "causual" araştırmacı için Resemble.js'ye bir bağlantı eklemek zorunda kaldım .
brichins

Herkes ikinci görüntünün piksellerini ilkinden çıkararak 2 görüntüyü karşılaştıracak bir araç biliyor mu? Kendi yazmamı tercih ederim.
MarcusJ

Imagemagick 7, değişmez görüntü anlarını kullanan bir teknik olan algısal hash'a sahiptir. rotasyon, varil deformasyonu, yeniden boyutlandırma, gama değişimi, gürültü tanıtımı, filigranlamadan sonra bile aynı hash olması anlamında güzel ...
v.oddou

1
@ v.oddou, Teşekkürler. Dokümanları okudum ve birkaç test daha yaptım. Çok seyrek nüfuslu ve aşırı düşük piksel yoğunluğuna sahip çizgi çizimleri ile kötü performans gösteriyor gibi görünüyor. Görünüşe göre piksel yoğunluğu PHASH'da benzerliği belirleyen anahtardır.
BReddy

Yanıtlar:


321

Kendi favorilerim şu ikisi:

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

Yukarıdaki 2 komut arasındaki tek fark: birincisi iki resim arasındaki görsel farkı bir PNG dosyası, ikincisi PDF olarak gösterir.

Ortaya çıkan diff dosyası, kırmızı renkte farklı olan tüm pikselleri görüntüler. Değişmeyenler beyaz görünür.

Kısa ve güzel.

Resimlerinizin aynı türde olması gerekmediğini unutmayın . JPEG, TIFF, PNG'yi tek bir koşulda bile karıştırabilirsiniz: görüntüler aynı boyutta olmalıdır (piksel olarak görüntü boyutu). Çıktı biçimi, çıktı dosya adının uzantısıyla belirlenir.

Herhangi bir nedenle varsayılan çözünürlükten (72 dpi) daha yüksek bir çözünürlüğe ihtiyacınız varsa - sadece uygun bir -densityparametre ekleyin :

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

Resimli örnekler

Yukarıdaki komutun varyasyonları için birkaç sonuç örneği aşağıda verilmiştir. Not: karşılaştırılan iki dosya bile PDF dosyalarıdır , bu yüzden bu dosyalarla da çalışır (1-çağrı cihazı oldukları sürece)!


Sol: Metin ile Görüntü       Merkezi: Orijinal resim       Sağ: Farklılıklar (= metin) kırmızı piksel. Yalnızca kırmızı pikseller;  özdeş pikseller beyaz

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

Bu, yukarıda daha önce önerdiğim komutla aynı.


Sol: Metin ile Görüntü       Merkezi: Orijinal görüntü       Sağ: 'Seagreen piksellerinizin farklılıklar. Yalnızca deniz yeşili fark pikselleri;  özdeş pikseller beyaz

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

Bu komut, fark piksellerini varsayılan kırmızı yerine 'deniz yeşili' yapmak için bir parametre ekler.


Sol: Metin ile Görüntü       : Merkezi'nde Orijinal resim       Hakkı: Mavi diffs (. Ama w bazı bağlam arka plan) Yalnızca mavi fark pikselleri;  aydınlatılmış bir arka plan olarak karşılaştırılan görüntülerin ilkil

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

Bu komut -compose srcparçayı kaldırır - sonuç varsayılan davranışı compare, 2 farklı görüntünün ilki olan açık bir arka plan olarak tutar. (Bu kez fark piksellerinin mavi görünmesini sağlamak için parametre eklendi.)


Bu karşılaştırma klibi nereden geldi anlayamıyorum? Imagebrick'in bir parçası mı? Windows üzerinde kullanılabilir mi?
Krishnom

2
@ Krishnom: 'imagebrick' diye bir şey yok. Şunu mu demek istediniz: ImageMagick?
Kurt Pfeifle

2
@Krishnom: Soru bir ImageMagick çözümü hakkında açıkça sordu. ImageMagick'in v6.x yazılım paketinin bir parçası olarak adlandırılan ayrı bir CLI aracı vardı 'compare'. ImageMagick'in v7.x sürümü için çalıştırmalısınız 'magick compare'.
Kurt Pfeifle

Benim hatam. Bunu düzelttiğiniz için teşekkürler (imagebrick -> imageMagick). Bir deneyeceğim. Ayrıca toplu görüntüleri karşılaştırmak için bir araç arıyorum. Tekrar yardım için teşekkürler
Krishnom

@Krishnom: "Toplu resim" in ne olduğunu bilmiyorum. Ama yine de ImageMagick araç takımının istediğinizi yapabileceğini iddia ediyorum.
Kurt Pfeifle

53

compareBirçok uygulama için iyi bir iş olsa da, bazen çoğunlukla gri tonlamalı görüntüleri karşılaştırırken farklı bir yaklaşım tercih ettiğimi fark ettim:

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

Fikir şu şekildedir: her ikisini de file1.pngve file2.pnggri tonlamaya dönüştürün . Ardından, ilkini elde edilen görüntünün kırmızı kanalı, ikincisi yeşil kanal olarak trat edin. Mavi kanal, darkenoluşturma operatörü kullanılarak bu ikisinden oluşturulur, bu da esasen minimumun alınması anlamına gelir.

Her iki görüntüde de beyaz olan şeyler beyaz kalır. Her iki görüntüde de siyah olan şeyler siyah kalır. İlk görüntüde beyaz, ikinci görüntüde siyah olan şeyler kırmızı, ikinci görüntüde siyah olan, ilk görüntüde siyah olan şeyler yeşile döner.

Sonuç olarak, yeşil ile birinci girdi ve kırmızı ile ikinciyi kolayca ilişkilendirebileceğiniz güzel bir renk kodlu görüntü elde edersiniz. İşte LaTeX çıktısını KaTeX ile karşılaştırmak için bunu kullandığım bir örnek ( bunu daha iyi hale getirmek için bazı hataları düzeltmeden önce ):

resim açıklamasını buraya girin

Bir şeyin nerede değiştiğini comparegörmek için düğmelerini ve sonra nasıl değiştiğini daha ayrıntılı olarak görmek için yukarıdakileri kullanarak yaklaşımları birleştirebilirsiniz .


2
Güzel! Biraz etkileşime ihtiyacım vardı, bu yüzden yöntemini Gimp'te çoğalttım. Referans için: 1) görüntüleri katman olarak yükleyin, 2) Renk -> Her iki katmandaki desaturate edin, 3) Katmanlar sekmesindeki her iki katmandan alfa kanallarını kaldırın, 4) bir katmandaki G + B kanallarını seçin, tümünü seçin ve kanalları temizleyin siyah renkle, ikinci katmandaki R + B kanalları ile aynı, 4) Katmanlar sekmesinde üst katman için Ekran modunu ayarlayın.
Matěj Šmíd

1
@Palmstrom: Teşekkürler! Başlangıçta bu görüntü karşılaştırmalarını kendim Gimp kullanarak yaptım, ancak bunu doğrudan giriş görüntülerinde “tahıl özü” katman modunu kullanarak yaptım , bu nedenle ortak alanlar gri olurken, fark bir yönde siyah, diğeri beyaz . Okuması daha zor, ancak üretilmesi daha hızlıdır ve renk bilgisi içerebilir. “Ekran” yerine “sadece koyulaştır” kullanıyorsanız ve kullanılmayan kanalları siyah yerine beyaz renklendirirseniz, komutumu daha yakından eşleştireceğinizi tahmin ediyorum.
MvG

1
Bazı PDF girişleri, herhangi bir nedenden dolayı gri tonlamalı dönüştürmeden sonra ters çevrilmiş bir görüntüyle sonuçlanır. Bunu düzeltmek -colorspace grayyerine kullanmak -grayscale Rec709Luminance, ama bu kompozisyon berbat. Bununla ilgilenmek -respect-parenthesesiçin ilk seçenek olarak ekleyin convert.
Brecht Machiels

Bu yöntemi kullanarak iki PDF'yi sayfa sayfa görsel olarak dağıtan bir komut dosyası: gist.github.com/brechtm/891de9f72516c1b2cbc1 . Bir pdfdiffdizindeki PDF'lerin her sayfası için bir JPG çıktısı ve ayrıca iki PDF arasında farklılık gösteren sayfaların sayısını yazdırır.
Brecht Machiels

1
ImageMagick v6.7.7-10 -grayscaledesteklenmiyor gibi görünüyor , -colorspace gray@BrechtMachiels önerdiği gibi kullanmak zorunda
austinmarton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.