Làm thế nào tôi có thể nói chính xác những gì đã thay đổi giữa hai hình ảnh?


28

Ví dụ, đối với một cuộc trò chuyện gần đây về nén JPEG, tôi muốn so sánh pixel với pixel, thứ đã thay đổi giữa hai JPEG (một với mức nén 100 và một với mức nén 95).

Làm cách nào để tạo bản đồ trực quan tốt về những gì đã thay đổi mà không cần lập trình phần mềm tùy chỉnh tẻ nhạt?


2
Không gửi câu trả lời này vì đây có thể không phải là giải pháp khả thi cho ảnh, nhưng GitHub (trang web của lập trình viên) có một số cách so sánh hình ảnh thú vị: github.com/cameronmcefee/Image-Diff-View-Modes/commit/, Hãy thử nhấp vào "2-up", "Vuốt", "Da hành" và "Khác biệt".
Henrik N

Câu trả lời:


35

Photoshop + Lớp FTW. (Có, bạn cũng có thể sử dụng Gimp hoặc bất kỳ phần mềm chỉnh sửa nào khác có cùng chức năng.)

Bắt đầu với hình ảnh cơ sở của bạn, trong trường hợp trên, tôi đã sử dụng hình ảnh 100 chất lượng jpeg.

  1. tạo một lớp mới trên nó
  2. dán hình ảnh thứ hai vào lớp đó
  3. đặt kiểu lớp thành "khác biệt" (xem mũi tên màu hồng bên trái trong hình thứ 1 bên dưới)
  4. tạo một lớp hiệu ứng trên đó (Lớp> Lớp điều chỉnh mới> Ngưỡng)
  5. đặt hiệu ứng thành ngưỡng (xem mũi tên màu hồng bên phải trong hình thứ 1 bên dưới)
  6. đặt giá trị ngưỡng thành 1

Trong hình ảnh thu được, bất kỳ pixel nào khác biệt giữa hai hình ảnh sẽ có màu trắng. Bạn có thể điều chỉnh nó để cho phép mọi thứ "khác một chút" bằng cách thay đổi giá trị ngưỡng.

Ví dụ hiển thị RẤT NHIỀU sự khác biệt giữa jpeg 92 và 100 từ Lightroom. so sánh jpeg 92 và 100 từ LR với các lớp Photoshop

Ví dụ cho thấy không có sự khác biệt nào giữa 95 và 100. so sánh jpeg 95 và 100 từ LR với các lớp Photoshop

Không phải là chỉ hiển thị nhị phân "thay đổi hay không", nếu bạn muốn biết thêm chi tiết về mức độ thay đổi của nó, hãy nói theo kênh màu?

  1. thay thế lớp điều chỉnh ngưỡng bằng một lớp điều chỉnh đường cong.
  2. chỉnh sửa đường cong
  3. bật chương trình cắt
  4. lấy tay cầm màu trắng đầu vào bên dưới góc dưới bên phải và kéo nó sang bên trái, xa nhất có thể
  5. từ từ di chuyển về bên phải cho đến khi bạn không thấy bất kỳ sự cắt xén nào (hình ảnh xem trước toàn màu đen)
  6. tắt cắt lại và lưu thay đổi đường cong

Các pixel kết quả càng sáng, chúng càng khác nhau về màu sắc đó. Tuy nhiên, nhược điểm là bạn có rất nhiều bùn xám ... vì vậy đôi khi dễ dàng vượt qua nó để xem sự khác biệt ở đâu. Đó là lý do tại sao tôi xây dựng cả hai và chuyển đổi cái nào có thể nhìn thấy.

cái nhìn mô tả hơn về sự khác biệt


Newb câu hỏi, nhưng làm thế nào để bạn làm bước 4, "tạo một lớp hiệu ứng trên đỉnh đó"? Không thể tìm thấy nó ở bất cứ đâu. Cũng 7 năm sau và tôi đang sử dụng phiên bản mới nhất cho họ cũng đã đổi tên?
whitneyland

14

Nếu bạn sử dụng Photoshop, đây là cách tôi sẽ làm:

Đặt hai jpeg trong cùng một tệp psd, trong hai lớp riêng biệt. Chúng nên chồng lên nhau chính xác, vì kích thước của chúng là như nhau. (cái nào đi đầu không quan trọng).

Đặt chế độ hòa trộn lớp thành "Khác biệt". Bạn sẽ thấy một kết quả chủ yếu là màu đen. Phụ thuộc vào sự khác biệt về chất lượng giữa hai lớp gốc mà bạn có thể thấy tiếng ồn nhiều hay ít.

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


Sự khác biệt một mình không thực sự giúp ích nhiều khi bạn bị bỏ lại một khoảng trống lớn màu đen như thế. :)
cabbey

@cabbey chắc chắn, so sánh 100% đến 95% rất có thể bạn sẽ có được một màu đen đặc. Nhưng đó là những gì câu hỏi của bạn đã hỏi phải không? Trong câu trả lời của chủ sở hữu, bạn đang thay đổi các giá trị từ bản gốc được so sánh, điều này khiến chúng không còn có cài đặt nén ban đầu.
Jin

Bạn nhận được màu đen hầu như chắc chắn về bất kỳ so sánh, bởi vì sự khác biệt là rất nhỏ. Lớp ngưỡng / đường cong sau khi chênh lệch không làm bất cứ điều gì đối với các cài đặt nén, nó chỉ hỗ trợ trực quan hóa các giới hạn dưới của món súp đen mà sự khác biệt được chuẩn bị. (Tôi không chắc chắn 100% ý của bạn là gì, vì vậy tôi có thể đi theo một hướng khác ở đó ....)
cabbey

@cabbey nếu bạn đang yêu cầu một thao tác thuần túy thông minh về sự khác biệt giữa 2 hình ảnh, thì chế độ hòa trộn "Khác biệt" sẽ mang lại cho bạn điều đó. Khi bạn điều chỉnh ngưỡng / đường cong, mặc dù kết quả rõ ràng hơn bằng mắt thường, nhưng đó không phải là một đại diện chính xác cho những gì đã thay đổi. Khi bạn làm điều đó, bạn không còn so sánh 100% với 95%.
Jin

Chắc chắn là bạn Mức độ nén đã dừng lại ở vấn đề photoshop thứ hai đã tải hình ảnh từ đĩa vào bộ đệm bên trong của nó, bây giờ nó là một mảng pixel không nén trong bộ nhớ ... nếu những pixel đó ở đó vì hình ảnh có một đốm vuông ở đó hoặc vì chúng là một tạo tác của mức nén không liên quan.
cabbey

13

Tất cả các gói xử lý hình ảnh nên làm điều này dễ dàng. Tôi sẽ chỉ cho bạn cách làm điều đó trong Mathematica, nếu bạn có quyền truy cập vào hệ thống này. Mathematica là một ngôn ngữ lập trình, nhưng thực sự dễ dàng thực hiện các loại thao tác này, vì vậy nếu bạn có quyền truy cập vào nó (ví dụ như thông qua giấy phép trang web của trường đại học), tôi khuyên bạn nên thử!

Đầu tiên, nhập hình ảnh:

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

Giải nén nó bằng nén JPEG

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

Đồ họa toán học

Bây giờ lấy sự khác biệt của các giá trị pixel, trước tiên chuyển đổi chúng thành số dấu phẩy động để đảm bảo rằng các giá trị âm được giữ nguyên.

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

Đồ họa toán học

Không nhìn thấy nhiều trên hình ảnh khác biệt (sự khác biệt là rất nhỏ) và các giá trị âm được cắt thành màu đen. Vì vậy, hãy bán lại tất cả các giá trị để điền vào toàn bộ phạm vi động (mức tối thiểu sẽ được chia tỷ lệ thành 0, tối đa thành 1):

ImageAdjust[diff]

Đồ họa toán học

ImageDifferencecho sự khác biệt tuyệt đối của hai hình ảnh và không tạo ra số âm. Đây là thao tác bạn có nhiều khả năng tìm thấy trong các gói xử lý hình ảnh, đặc biệt là các gói GUI (Photoshop, GIMP).

ImageDifference[img, img2]

Đồ họa toán học

Chúng ta cũng có thể lấy một kênh RGB duy nhất, ví dụ như kênh màu đỏ và hình dung sự khác biệt tích cực và tiêu cực bằng cách sử dụng màu sắc 'đối lập':

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

Đồ họa toán học

Đây là điều tương tự, với sự khác biệt được khuếch đại 5 lần. Các đồ tạo tác JPEG dễ nhận biết hơn bây giờ.

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

Đồ họa toán học

Ưu điểm của việc sử dụng ngôn ngữ lập trình là chúng ta có thể dễ dàng tự động hóa ngôn ngữ này và xem sự khác biệt thay đổi như thế nào đối với "mức nén" giữa 0,1 và 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]

Đồ họa toán học


Nó luôn luôn tốt để xem một tùy chọn kịch bản / tự động! :)
jrista

5

Bạn có thể sử dụng các công cụ dòng lệnh của Imagemagick.

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

sẽ cung cấp giá trị tuyệt đối của sự khác biệt cho mỗi kênh RGB.



0
  1. Mở một trong những hình ảnh trong GIMP hoặc Photoshop.
  2. Thêm hình ảnh thứ hai dưới dạng một lớp mới trên đầu trang đầu tiên.
  3. Đặt chế độ hòa trộn của lớp trên cùng thành "Sự khác biệt"

Trong hình ảnh thu được, các phần màu đen hiển thị trong đó các hình ảnh gốc giống hệt nhau và bất cứ thứ gì nhẹ hơn đều cho thấy sự khác biệt.


Sự khác biệt một mình không thực sự giúp ích nhiều khi bạn bị bỏ lại một khoảng trống lớn màu đen như thế. :)
cabbey

Bạn luôn có thể điều chỉnh các mức trên hình ảnh kết quả. Bất cứ khi nào tôi sử dụng kỹ thuật này, tôi đã có những bức ảnh đủ khác nhau để có thể thấy những thay đổi :)
Dan
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.