“ Diff” รูปภาพโดยใช้ ImageMagick


179

ฉันจะรับความแตกต่างระหว่างสองภาพได้อย่างไร ฉันมีภาพต้นฉบับ มีคนเขียนทับภาพต้นฉบับที่แน่นอน ตอนนี้ฉันต้องเปรียบเทียบต้นฉบับกับการเขียนบนภาพและแยกการเขียนในรูปแบบภาพ

ตัวอย่าง: ฉันมีรูปบ้าน มีคนหยิบสำเนาและเขียนว่า“ Hello!” บนสำเนา ฉันต้องการที่จะเปรียบเทียบภาพสองภาพเอาบ้านและทิ้งไว้กับภาพของคำว่า "Hello!"

เป็นไปได้ไหมที่ ImageMagick ฉันรู้ว่ามีวิธีที่จะได้ความแตกต่างทางสถิติระหว่างภาพ แต่นั่นไม่ใช่สิ่งที่ฉันกำลังมองหา


8
ลองใช้ส่วนนี้ของคู่มือการใช้งาน ImageMagick!
เบอนัวต์

1
ฉันรู้ว่าคำถามนี้เกี่ยวกับ ImageMagick แต่ฉันต้องรวมลิงก์ไปยังResemble.jsสำหรับผู้ค้นหา "ที่เป็นสาเหตุ" ซึ่งอาจเป็นโซลูชันที่ไม่เชื่อเรื่องพระเจ้า
brichins

ไม่มีใครรู้ว่าเครื่องมือที่จะเปรียบเทียบ 2 ภาพโดยการลบพิกเซลของภาพที่สองจากครั้งแรกหรือไม่ ฉันไม่ต้องการเขียนเอง
MarcusJ

Imagemagick 7 มี hash perceptual ซึ่งเป็นเทคนิคการใช้ช่วงเวลาที่รูปภาพคงที่ มันดีในแง่ที่ว่ามันจะแฮชเหมือนกันแม้หลังจากการหมุน, การบิดเบือนบาร์เรล, ปรับขนาด, เปลี่ยนแกมม่า, แนะนำเสียง, ลายน้ำ ...
v.oddou

1
@ v.oddou ขอบคุณ ฉันอ่านเอกสารและทำการทดสอบเพิ่มเติมอีกสองสามข้อ ดูเหมือนว่าจะทำงานได้ไม่ดีกับการวาดเส้นซึ่งมีประชากรเบาบางมากและมีความหนาแน่นของพิกเซลต่ำมาก ดูเหมือนความหนาแน่นของพิกเซลเป็นกุญแจสำคัญใน PHASH เพื่อระบุความคล้ายคลึงกัน
BReddy

คำตอบ:


321

รายการโปรดของฉันคือสองคนนี้:

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

ข้อแตกต่างเพียงอย่างเดียวระหว่างคำสั่ง 2 ข้อด้านบน: อันแรกแสดงความแตกต่างทางภาพระหว่างสองภาพในรูปแบบไฟล์ PNG และอีกไฟล์หนึ่งเป็น PDF

ไฟล์ diff ที่เป็นผลลัพธ์จะแสดงพิกเซลทั้งหมดที่แตกต่างกันในสีแดง สิ่งที่ไม่เปลี่ยนแปลงจะปรากฏเป็นสีขาว

สั้นและหวาน

หมายเหตุภาพของคุณไม่จำเป็นต้องเป็นประเภทเดียวกัน คุณสามารถผสม JPEG, TIFF, PNG - ภายใต้เงื่อนไขเดียว: รูปภาพควรมีขนาดเท่ากัน (ขนาดภาพเป็นพิกเซล) รูปแบบเอาต์พุตถูกกำหนดโดยส่วนขยายของชื่อไฟล์เอาต์พุต

หากคุณต้องการความละเอียดสูงกว่าค่าเริ่มต้น (72 dpi) ด้วยเหตุผลบางประการคุณควรเพิ่ม-densityพารามิเตอร์ที่เหมาะสม:

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

ตัวอย่างที่แสดง

ต่อไปนี้เป็นตัวอย่างบางส่วนของผลลัพธ์สำหรับชุดคำสั่งด้านบน หมายเหตุ: ไฟล์ทั้งสองที่เปรียบเทียบนั้นเป็น ไฟล์ PDFดังนั้นจึงใช้งานได้กับไฟล์เหล่านี้ (ตราบใดที่ยังเป็น 1 เพจเจอร์)!


ซ้าย:รูปภาพพร้อมศูนย์ข้อความ       :ภาพต้นฉบับ       ขวา:ความแตกต่าง (= ข้อความ) เป็นพิกเซลสีแดง พิกเซลแตกต่างสีแดงเท่านั้น  พิกเซลที่เหมือนกันคือสีขาว

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

นี่เป็นคำสั่งเดียวกับที่ฉันแนะนำไว้ข้างต้น


ซ้าย:รูปภาพพร้อมศูนย์ข้อความ       :ภาพต้นฉบับ       ด้านขวา:ความแตกต่างของพิกเซล 'สีเขียว' พิกเซลความแตกต่างทางทะเลเท่านั้น  พิกเซลที่เหมือนกันคือสีขาว

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

คำสั่งนี้เพิ่มพารามิเตอร์เพื่อสร้างความแตกต่างของพิกเซล 'ซีกกรีน' แทนที่จะเป็นสีแดงเริ่มต้น


ซ้าย:รูปภาพพร้อมศูนย์ข้อความ       :ภาพต้นฉบับ       ขวา:สีน้ำเงินต่างกัน (แต่มีพื้นหลังบริบทบางส่วน) พิกเซลแตกต่างสีฟ้าเท่านั้น  ภาพแรกที่เปรียบเทียบเป็นภาพพื้นหลังที่สว่างขึ้นl

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

คำสั่งนี้จะลบ-compose srcส่วนหนึ่งออก - ผลลัพธ์คือพฤติกรรมเริ่มต้นcompareซึ่งเก็บไว้เป็นพื้นหลังที่จางลงภาพแรกที่แตกต่างกัน 2 ภาพ (เวลานี้พร้อมพารามิเตอร์เพิ่มเพื่อให้พิกเซลแตกต่างปรากฏเป็นสีน้ำเงิน)


ฉันไม่สามารถเข้าใจได้ว่า cli เปรียบเทียบนี้มาจากไหน มันเป็นส่วนหนึ่งของ imagebrick หรือไม่? พร้อมใช้งานบน windows หรือไม่
Krishnom

2
@ Krishnom: ไม่มีสิ่งเช่น 'imagebrick' คุณหมายถึง ImageMagick หรือเปล่า
Kurt Pfeifle

2
@ Krishnom: คำถามที่ถามอย่างละเอียดเกี่ยวกับโซลูชั่น ImageMagick เป็นส่วนหนึ่งของชุดซอฟต์แวร์ v6.x ImageMagick ของมีเครื่องมือ CLI 'compare'แยกต่างหากที่เรียกว่า สำหรับ v7.x ของ ImageMagick คุณควรเรียกใช้'magick compare'แทน
Kurt Pfeifle

ความผิดฉันเอง. ขอบคุณสำหรับการแก้ไข (imagebrick -> imageMagick) ฉันจะลองดู ฉันยังต้องการเครื่องมือในการเปรียบเทียบภาพจำนวนมาก ขอบคุณสำหรับความช่วยเหลืออีกครั้ง
Krishnom

@ Krishnom: ฉันไม่รู้ว่า "ภาพจำนวนมาก" คืออะไร แต่ฉันยังคงเดิมพันว่าชุดเครื่องมือ ImageMagick สามารถทำสิ่งที่คุณต้องการ
Kurt Pfeifle

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ดำเนินการเขียนซึ่งหมายถึงการทำขั้นต่ำ

ดังนั้นสิ่งที่เป็นสีขาวในภาพทั้งสองจึงเป็นสีขาว สิ่งที่เป็นสีดำในภาพทั้งสองเป็นสีดำ สิ่งที่เป็นสีขาวในภาพแรก แต่สีดำในเทิร์นที่สองเป็นสีแดงและสิ่งที่เป็นสีขาวในภาพที่สอง แต่สีดำในสีเขียวเทิร์นแรก

ผลที่ได้จะให้ภาพที่มีรหัสสีเป็นอย่างดีซึ่งคุณสามารถเชื่อมโยงสีเขียวเข้ากับอินพุตแรกและสีแดงกับวินาทีได้อย่างง่ายดาย นี่คือตัวอย่างที่ฉันใช้สิ่งนี้เพื่อเปรียบเทียบผลลัพธ์จาก LaTeX กับที่จากKaTeX (ก่อนที่ฉันจะแก้ไขข้อผิดพลาดบางอย่างเพื่อทำให้ดีขึ้น):

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถรวมวิธีต่างๆโดยใช้compareเพื่อดูว่ามีอะไรเปลี่ยนแปลงไปบ้างจากนั้นใช้วิธีด้านบนเพื่อดูรายละเอียดเพิ่มเติมว่ามีการเปลี่ยนแปลงอย่างไร


2
ดี! ฉันต้องการการโต้ตอบบางอย่างดังนั้นฉันจึงจำลองวิธีการของคุณใน Gimp สำหรับการอ้างอิง: 1) โหลดภาพเป็นเลเยอร์ 2) สี -> ทำให้ทั้งสองเลเยอร์ 3) ลบช่องอัลฟาออกจากเลเยอร์ทั้งสองในแท็บเลเยอร์ 4) เลือกช่อง G + B ในชั้นเดียวเลือกทั้งหมดและล้างช่อง ด้วยสีดำเช่นเดียวกันกับช่อง R + B ในชั้นที่สอง 4) ตั้งค่าโหมดหน้าจอสำหรับชั้นบนในแท็บเลเยอร์
MatějŠmíd

1
@Palmstrom: ขอบคุณ! ตอนแรกฉันทำการเปรียบเทียบภาพเหล่านี้โดยใช้ Gimp ตัวเอง แต่ฉันใช้โหมดเลเยอร์ "แยกข้าว"โดยตรงในภาพอินพุตพื้นที่ทั่วไปจะกลายเป็นสีเทาในขณะที่ diff จะเป็นสีดำในทิศทางเดียวและสีขาวในอีกทิศทางหนึ่ง . อ่านยาก แต่สร้างได้เร็วกว่าและสามารถมีข้อมูลสีได้ ฉันเดาว่าคุณจะจับคู่คำสั่งของฉันอย่างใกล้ชิดยิ่งขึ้นถ้าคุณใช้ "มืดเท่านั้น" แทน "หน้าจอ" และสีที่ไม่ได้ใช้ช่องสีขาวแทนที่จะเป็นสีดำ
MvG

1
อินพุต PDF บางตัวส่งผลให้ภาพกลับด้านหลังจากแปลงเป็นสีเทาด้วยเหตุผลบางประการ ใช้-colorspace grayแทนการ-grayscale Rec709Luminanceแก้ไขปัญหานั้น แต่สิ่งนี้จะทำให้เกิดความยุ่งเหยิง เพิ่ม-respect-parenthesesเป็นตัวเลือกแรกที่convertจะดูแล
Brecht Machiels

นี่คือสคริปต์เพื่อสายตา diff สองไฟล์ PDF หน้าโดยหน้าโดยใช้วิธีการนี้: gist.github.com/brechtm/891de9f72516c1b2cbc1 มันออกหนึ่ง JPG สำหรับแต่ละหน้าของ PDF ในpdfdiffไดเรกทอรีและพิมพ์ตัวเลขของหน้าซึ่งแตกต่างกันระหว่างสอง PDF
Brecht Machiels

1
ใน ImageMagick v6.7.7-10 ดูเหมือนว่า-grayscaleไม่รองรับฉันต้องใช้-colorspace gray@BrechtMachiels ที่แนะนำ
austinmarton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.