ImageMagick का उपयोग करके एक छवि "डिफ"


178

मैं दो छवियों के बीच अंतर कैसे प्राप्त कर सकता हूं? मेरी मूल छवि है। किसी ने मूल छवि के सटीक डुप्लिकेट पर लिखा है। अब, मुझे छवि पर लिखे गए मूल की तुलना करने और छवि प्रारूप में सिर्फ लेखन को निकालने की आवश्यकता है।

उदाहरण: मेरे पास एक घर की तस्वीर है। किसी ने एक प्रति ली और लिखा "हैलो!" कॉपी पर। मैं किसी तरह दोनों चित्रों की तुलना करना चाहता हूं, घर को हटाता हूं, और "हैलो!" शब्दों की एक छवि के साथ छोड़ दिया जाता हूं।

क्या यह ImageMagick के साथ संभव है? मुझे पता है कि छवियों के बीच सांख्यिकीय अंतर प्राप्त करने के तरीके हैं, लेकिन यह वह नहीं है जो मैं देख रहा हूं।


8
ImageMagick उपयोग गाइड के इस अनुभाग का प्रयास करें !
बेनोइट

1
मैं जानता हूँ कि इस सवाल का ImageMagick के बारे में है, लेकिन मैं सिर्फ एक लिंक शामिल करना पड़ा Resemble.js "causual" खोजकर्ता जो एक नास्तिक समाधान के बाद हो सकता है के लिए।
ब्रिचिंस

क्या कोई ऐसे उपकरण के बारे में जानता है जो दूसरी छवि के पिक्सल को घटाकर 2 छवियों की तुलना करेगा, पहली से? मैं अपना खुद का लिखना पसंद नहीं करूँगा।
माक्र्स जे।

Imagemagick 7 में अवधारणात्मक हैश है, जो एक तकनीक है जिसका उपयोग अनौपचारिक छवि के क्षणों में किया जाता है। यह इस अर्थ में अच्छा है कि यह रोटेशन, बैरल विरूपण, आकार, गामा परिवर्तन, शोर परिचय, वॉटरमार्किंग के बाद भी समान हैश करता है ...
v.oddou

1
@ v.oddou, धन्यवाद। मैंने डॉक्स पढ़े और कुछ और परीक्षण किए। यह रेखा चित्र के साथ बहुत खराब प्रदर्शन करता है जो बहुत कम आबादी वाले और बहुत कम पिक्सेल घनत्व वाले होते हैं। ऐसा लगता है कि पिक्सेल घनत्व PHASH की समानता की पहचान करने में महत्वपूर्ण है।
बीआरडी

जवाबों:


320

मेरे अपने पसंदीदा ये दो हैं:

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

ऊपर दिए गए 2 आदेशों के बीच एकमात्र अंतर: पहला एक PNG फ़ाइल के रूप में दो छवियों के बीच दृश्य अंतर दिखाता है, दूसरा एक पीडीएफ के रूप में।

परिणामस्वरूप भिन्न फ़ाइल सभी पिक्सेल प्रदर्शित करती है जो लाल रंग में भिन्न होती हैं। जो अपरिवर्तित हैं वे सफेद दिखाई देते हैं।

छोटा एवं सुन्दर।

ध्यान दें, आपकी छवियों को एक ही प्रकार की आवश्यकता नहीं है। आप जेपीईजी, टीआईएफएफ, पीएनजी को भी मिला सकते हैं - एक शर्त के तहत: चित्र समान आकार (पिक्सेल में छवि आयाम) के होने चाहिए। आउटपुट स्वरूप आउटपुट फ़ाइल नाम के एक्सटेंशन द्वारा निर्धारित किया जाता है।

आपको किसी कारण से, डिफ़ॉल्ट एक (72 डीपीआई) की तुलना में अधिक रिज़ॉल्यूशन की आवश्यकता होती है - फिर एक उपयुक्त -densityपैरामीटर जोड़ें :

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

उदाहरण दिया

उपरोक्त आदेश की विविधताओं के लिए परिणामों के कुछ चित्र यहां दिए गए हैं। नोट: तुलना की गई दो फाइलें पीडीएफ फाइलें भी थीं , इसलिए यह इन के साथ भी काम करती है (जब तक वे 1-पेजर हैं)!


बाएँ: पाठ केंद्र के साथ छवि       : मूल छवि       सही: लाल पिक्सेल में अंतर (= पाठ)। लाल अंतर पिक्सेल केवल;  समान पिक्सेल सफेद हैं

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

यह वही कमांड है जो मैंने पहले ऊपर सुझाई थी।


बायां: पाठ केंद्र के साथ छवि       : मूल छवि       अधिकार: 'सीग्रीन' पिक्सल में अंतर। केवल Seagreen अंतर पिक्सेल;  समान पिक्सेल सफेद हैं

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

यह कमांड डिफॉल्ट लाल के बजाय अंतर पिक्सेल को 'सीग्रीन' बनाने के लिए एक पैरामीटर जोड़ता है।


बायां: पाठ केंद्र के साथ छवि       : मूल छवि       सही: नीला भिन्न (लेकिन डब्ल्यू। कुछ संदर्भ पृष्ठभूमि) केवल नीले अंतर पिक्सेल;  पहले की तुलना में छवियों को हल्का-हल्का पृष्ठभूमि के रूप मेंएल

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

यह कमांड -compose srcभाग को हटा देता है - परिणाम डिफ़ॉल्ट व्यवहार होता है, compareजो कि 2 अलग-अलग छवियों में से पहले एक को एक हल्की पृष्ठभूमि के रूप में रखता है। (इस बार जोड़े गए पैरामीटर को नीले रंग में प्रदर्शित करने के लिए अतिरिक्त पैरामीटर के साथ।)


मुझे समझ में नहीं आ रहा है कि यह तुलना कहां से आई है? क्या यह इमेजब्रिक का हिस्सा है? खिड़कियों पर उपलब्ध है?
कृष्णोम

2
@ कृष्णम: 'इमेजब्रिक' जैसी कोई चीज नहीं है। क्या आपका मतलब है ImageMagick?
कर्ट फ़िफ़ेल

2
@ कृष्णम: प्रश्न ने स्पष्ट रूप से एक ImageMagick समाधान के बारे में पूछा। ImageMagick के v6.x सॉफ्टवेयर सूट के एक अलग सीएलआई टूल को बुलाया गया था 'compare'। ImageMagick के v7.x के लिए आपको 'magick compare'इसके बजाय चलना चाहिए।
कर्ट फ़िफ़ेल

मेरी गलती। इसे सही करने के लिए धन्यवाद (इमेजब्रिक -> इमेजमैजिक)। मुझे इसे एक मौका और देना होगा। मैं भी थोक छवियों की तुलना करने के लिए उपकरण देख रहा हूँ। मदद के लिए फिर से धन्यवाद
कृष्णोम

@ कृष्णम: मुझे नहीं पता कि "बल्क इमेज" क्या होती है। लेकिन मैं अभी भी शर्त लगाता हूं कि टूल के ImageMagick सूट आप क्या कर सकते हैं।
कर्ट फ़िफ़ेल

53

जबकि compareकई अनुप्रयोगों के लिए एक अच्छा काम करता है, मैंने पाया कि कभी-कभी मैं एक अलग दृष्टिकोण पसंद करता हूं, खासकर जब छवियों की तुलना करना जो ज्यादातर ग्रेस्कूल हैं:

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

विचार इस प्रकार है: दोनों को file1.pngऔर file2.pngग्रेस्केल में परिवर्तित करें । फिर परिणामस्वरूप छवि के लाल चैनल के रूप में पहले को ट्रैट करें, दूसरे को ग्रीन चैनल के रूप में। ब्लू चैनल इन दोनों से darkenकंपोज़ ऑपरेटर का उपयोग करके बनाया गया है , जिसका अर्थ अनिवार्य रूप से न्यूनतम लेना है।

तो दोनों छवियों में सफेद रंग की चीजें सफेद रहती हैं। जो चीजें दोनों छवियों में काली हैं, वे काली रहती हैं। वे चीजें जो पहली छवि में सफेद हैं, लेकिन दूसरी बारी में काली हैं, और दूसरी में सफेद हैं और पहली बारी में काली हैं।

परिणाम आपको एक अच्छी तरह से रंग-कोडित छवि देता है जहां आप आसानी से पहले इनपुट के साथ हरे रंग को जोड़ सकते हैं और दूसरे के साथ लाल कर सकते हैं। यहाँ एक उदाहरण है जहाँ मैं इसका उपयोग KaTeX के खिलाफ LaTeX से आउटपुट की तुलना करने के लिए कर रहा हूँ (इससे पहले कि मैं इसे बेहतर बनाने के लिए कुछ बग तय करूँ ):

यहां छवि विवरण दर्ज करें

आप दृष्टिकोणों को जोड़ सकते हैं, compareयह देखने के लिए कि कहां कुछ बदल गया है और फिर ऊपर का उपयोग करके और अधिक विस्तार से देखने के लिए कि यह कैसे बदल गया।


2
अच्छा! मुझे कुछ इंटरैक्शन की आवश्यकता थी इसलिए मैंने जिम्प में आपके तरीके को दोहराया। संदर्भ के लिए: 1) परतों के रूप में छवियों को लोड करें, 2) रंग -> दोनों परतों को मिटाएं, 3) परत टैब में दोनों परतों से अल्फा चैनल निकालें, 4) एक परत पर जी + बी चैनलों का चयन करें, सभी का चयन करें और चैनलों को साफ़ करें काले रंग के साथ, दूसरी परत पर R + B चैनलों के साथ समान, 4) परत टैब में ऊपरी परत के लिए स्क्रीन मोड सेट करें।
Mat --j dmíd

1
@Palmstrom: धन्यवाद! मैंने मूल रूप से इन इमेज की तुलना खुद जिम्प का उपयोग करके की थी, लेकिन मैंने ऐसा सीधे इनपुट इमेज पर "ग्रेन एक्सट्रैक्ट" लेयर मोड का उपयोग करते हुए किया था , इसलिए सामान्य क्षेत्र ग्रे हो जाएंगे, जबकि अंतर एक दिशा में काला और दूसरे में सफेद होगा । पढ़ने के लिए कठिन, लेकिन जल्दी उत्पन्न करने के लिए, और इसमें रंग जानकारी हो सकती है। मुझे लगता है कि अगर आप "स्क्रीन" के बजाय "केवल डार्क" का उपयोग कर रहे थे, और रंग अप्रयुक्त चैनलों को काले रंग के बजाय सफेद रंग में उपयोग कर रहे थे, तो आप मेरी आज्ञा से और भी अधिक निकटता से मिलान करेंगे।
MvG

1
कुछ पीडीएफ इनपुट के परिणामस्वरूप किसी कारण के लिए ग्रेस्केल रूपांतरण के बाद एक उलटा छवि होती है। फिक्स के -colorspace grayबजाय का उपयोग करके -grayscale Rec709Luminance, लेकिन यह रचना को गड़बड़ कर देता है। उस की देखभाल के -respect-parenthesesलिए पहले विकल्प के रूप में जोड़ें convert
ब्रेख्त मैकिएल्स

इस विधि का उपयोग करते हुए दो पीडीएफ पृष्ठ-दर-पृष्ठ अलग करने के लिए एक स्क्रिप्ट है: gist.github.com/brechtm/891de9f72516c1b2cbc1 । यह एक pdfdiffनिर्देशिका में पीडीएफ के प्रत्येक पृष्ठ के लिए एक जेपीजी आउटपुट करता है और इसके अलावा उन पृष्ठों की संख्या को प्रिंट करता है जो दो पीडीएफ के बीच भिन्न होते हैं।
ब्रेख्त मचिएल्स

1
ImageMagick v6.7.7-10 में ऐसा लगता है -grayscaleकि यह समर्थित नहीं है, मुझे -colorspace gray@BrechtMachiels का उपयोग करने का सुझाव दिया गया था
austinmarton
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.