Một người khác sử dụng ImageMagick


178

Làm thế nào tôi có thể nhận được sự khác biệt giữa hai hình ảnh? Tôi có hình ảnh gốc. Ai đó đã viết trên một bản sao chính xác của hình ảnh gốc. Bây giờ, tôi cần so sánh bản gốc với văn bản trên hình ảnh và chỉ trích xuất văn bản ở định dạng hình ảnh.

Ví dụ: Tôi có một hình ảnh của một ngôi nhà. Ai đó đã lấy một bản sao và viết vào Xin chào! trên bản sao. Tôi muốn bằng cách nào đó so sánh hai bức tranh, xóa ngôi nhà, và để lại một hình ảnh của dòng chữ Hello Hello!

Điều này có thể với ImageMagick không? Tôi biết có nhiều cách để có được sự khác biệt thống kê giữa các hình ảnh, nhưng đó không phải là điều tôi đang tìm kiếm.


8
Hãy thử phần này của hướng dẫn sử dụng ImageMagick!
Benoit

1
Tôi biết câu hỏi này là về ImageMagick, nhưng tôi chỉ cần bao gồm một liên kết đến Resemble.js cho người tìm kiếm "nhân quả" có thể là người sau một giải pháp bất khả tri.
brichins

Có ai biết một công cụ sẽ so sánh 2 hình ảnh bằng cách trừ đi các pixel của hình ảnh thứ hai, từ hình ảnh thứ nhất không? Tôi không thích tự viết.
MarcusJ

Imagemagick 7 có hàm băm tri giác, một kỹ thuật sử dụng các khoảnh khắc hình ảnh bất biến. Thật tuyệt theo nghĩa là nó băm giống nhau ngay cả sau khi xoay, biến dạng nòng, thay đổi kích thước, thay đổi gamma, giới thiệu tiếng ồn, hình mờ ...
v.oddou

1
@ v.oddou, Cảm ơn. Tôi đọc tài liệu và làm thêm vài bài kiểm tra. Nó dường như hoạt động kém với các bản vẽ đường kẻ có dân cư rất thưa thớt và mật độ điểm ảnh cực thấp. Có vẻ như mật độ pixel là chìa khóa trong PHASH xác định độ tương tự.
BReddy

Câu trả lời:


320

Yêu thích của riêng tôi là hai:

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

Sự khác biệt duy nhất giữa 2 lệnh trên: lệnh thứ nhất hiển thị sự khác biệt trực quan giữa hai hình ảnh dưới dạng tệp PNG, lệnh thứ hai dưới dạng PDF.

Tệp diff kết quả hiển thị tất cả các pixel khác màu đỏ. Những cái không thay đổi xuất hiện màu trắng.

Ngắn và ngọt.

Lưu ý, hình ảnh của bạn không cần phải cùng loại. Bạn thậm chí có thể trộn JPEG, TIFF, PNG - trong một điều kiện: hình ảnh phải có cùng kích thước (kích thước hình ảnh tính bằng pixel). Định dạng đầu ra được xác định bởi phần mở rộng của tên tệp đầu ra.

Nếu bạn, vì một số lý do, cần một độ phân giải cao hơn so với mặc định (72 dpi) - sau đó chỉ cần thêm một -densitytham số thích hợp :

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

Ví dụ minh họa

Dưới đây là một vài minh họa về kết quả cho các biến thể của lệnh trên. Lưu ý: hai tệp được so sánh là các tệp PDF , do đó, nó cũng hoạt động với các tệp này (miễn là chúng là 1 máy nhắn tin)!


Trái: Ảnh có văn bản       Trung tâm: Ảnh gốc       Phải: Khác biệt (= văn bản) bằng pixel đỏ. Chỉ các pixel khác nhau màu đỏ;  pixel giống hệt nhau có màu trắng

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

Đây là lệnh tương tự tôi đã đề xuất ở trên.


Trái: Hình ảnh với văn bản       Trung tâm: Ảnh gốc       Phải: Sự khác biệt về pixel 'màu xanh nước biển'. Chỉ pixel chênh lệch màu xanh lá cây;  pixel giống hệt nhau có màu trắng

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

Lệnh này thêm một tham số để làm cho các pixel khác biệt 'màu xanh lục' thay vì màu đỏ mặc định.


Trái: Hình ảnh với văn bản       Trung tâm: Ảnh gốc       Phải: Xanh lam khác (nhưng w. Một số bối cảnh bối cảnh) Chỉ các pixel màu xanh khác nhau;  đầu tiên của hình ảnh được so sánh như là một nền sángl

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

Lệnh này sẽ loại bỏ -compose srcmột phần - kết quả là hành vi mặc định comparegiữ nền sáng của một trong 2 hình ảnh khác nhau. (Lần này với tham số được thêm vào để làm cho các pixel khác xuất hiện màu xanh lam.)


Tôi không thể hiểu cli so sánh này đến từ đâu? Nó là một phần của imagebrick? có sẵn trên cửa sổ?
Krishnom

2
@Krishnom: Không có thứ gọi là 'imagebrick'. Ý bạn là ImageMagick?
Kurt Pfeifle

2
@Krishnom: Câu hỏi được hỏi rõ ràng về một giải pháp ImageMagick. Một phần của bộ phần mềm v6.x của ImageMagick có một công cụ CLI riêng được gọi 'compare'. Đối với v7.x của ImageMagick, bạn nên chạy 'magick compare'thay thế.
Kurt Pfeifle

Lỗi của tôi. Cảm ơn đã sửa lỗi đó (imagebrick -> imageMagick). Tôi sẽ cho nó nó một cơ hội. Tôi cũng đang tìm kiếm công cụ để so sánh hình ảnh số lượng lớn. Cảm ơn vì sự giúp đỡ một lần nữa
Krishnom

@Krishnom: Tôi không biết "hình ảnh số lượng lớn" là gì. Nhưng tôi vẫn cá rằng bộ công cụ ImageMagick có thể làm những gì bạn muốn.
Kurt Pfeifle

53

Mặc dù comparethực hiện công việc tốt cho nhiều ứng dụng, tôi thấy rằng đôi khi tôi thích một cách tiếp cận khác, đặc biệt là khi so sánh các hình ảnh chủ yếu là thang độ xám:

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

Ý tưởng là như sau: chuyển đổi cả hai file1.pngfile2.pngsang thang độ xám. Sau đó, trat đầu tiên là kênh màu đỏ của hình ảnh kết quả, thứ hai là kênh màu xanh lá cây. Kênh màu xanh được hình thành từ hai cái này bằng cách sử dụng darkentoán tử soạn thảo, về cơ bản có nghĩa là lấy mức tối thiểu.

Vì vậy, những thứ có màu trắng trong cả hai hình ảnh đều trắng. Những thứ có màu đen trong cả hai hình ảnh đều màu đen. Những thứ có màu trắng trong hình ảnh thứ nhất nhưng màu đen ở màu thứ hai chuyển sang màu đỏ và những thứ có màu trắng ở hình thứ hai nhưng màu đen ở màu thứ nhất chuyển sang màu xanh lá cây.

Kết quả cung cấp cho bạn một hình ảnh được mã hóa màu độc đáo, nơi bạn có thể dễ dàng liên kết màu xanh lá cây với đầu vào đầu tiên và màu đỏ với thứ hai. Dưới đây là một ví dụ trong đó tôi đang sử dụng điều này để so sánh đầu ra từ LaTeX so với đầu ra từ KaTeX (trước khi tôi sửa một số lỗi để làm cho điều này tốt hơn):

nhập mô tả hình ảnh ở đây

Bạn có thể kết hợp các cách tiếp cận, sử dụng compaređể xem nơi nào đó thay đổi và sau đó sử dụng ở trên để xem chi tiết hơn về cách thay đổi.


2
Đẹp! Tôi cần một số tương tác để tôi nhân rộng phương pháp của bạn trong Gimp. Để tham khảo: 1) tải hình ảnh dưới dạng các lớp, 2) Màu sắc -> Làm bão hòa cả hai lớp, 3) xóa các kênh alpha khỏi cả hai lớp trong tab Lớp, 4) chọn các kênh G + B trên một lớp, chọn tất cả và xóa các kênh với màu đen, giống với các kênh R + B trên lớp thứ hai, 4) đặt chế độ Màn hình cho lớp trên trong tab Lớp.
Matěj Šmíd

1
@Palmstrom: Cảm ơn! Ban đầu tôi đã tự so sánh các hình ảnh này bằng cách sử dụng Gimp, nhưng tôi đã sử dụng chế độ lớp chiết xuất hạt ngũ cốc trực tiếp trên các hình ảnh đầu vào, vì vậy các khu vực chung sẽ có màu xám, trong khi khác biệt sẽ có màu đen theo một hướng và màu trắng theo hướng khác . Khó đọc hơn, nhưng tạo nhanh hơn và nó có thể chứa thông tin màu. Tôi đoán bạn sẽ khớp lệnh của tôi thậm chí chặt chẽ hơn nữa nếu bạn đang sử dụng chỉ làm tối màu Thay vì màn hình Thay vì màn hình và các kênh không sử dụng màu trắng thay vì màu đen.
MvG

1
Một số đầu vào PDF dẫn đến hình ảnh bị đảo ngược sau khi chuyển đổi thang độ xám vì một số lý do. Sử dụng -colorspace graythay vì -grayscale Rec709Luminancesửa lỗi đó, nhưng điều này làm rối tung bố cục. Thêm -respect-parentheseslà tùy chọn đầu tiên convertđể chăm sóc điều đó.
Brecht Machiels

Đây là một tập lệnh để hiển thị trực quan hai trang PDF bằng cách sử dụng phương pháp này: gist.github.com/brechtm/891de9f72516c1b2cbc1 . Nó xuất ra một JPG cho mỗi trang của các tệp PDF trong một pdfdiffthư mục và in thêm số lượng các trang khác nhau giữa hai tệp PDF.
Brecht Machiels

1
Trong ImageMagick v6.7.7-10 có vẻ như -grayscalekhông được hỗ trợ, tôi đã phải sử dụng -colorspace graynhư @BrechtMachiels đề xuất
austinmarton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.