Làm cách nào để đo độ giống nhau giữa hai hình ảnh? [đóng cửa]


94

Tôi muốn so sánh ảnh chụp màn hình của một ứng dụng (có thể là một trang Web) với ảnh chụp màn hình đã chụp trước đó để xác định xem ứng dụng có tự hiển thị chính xác hay không. Tôi không muốn so sánh đối sánh chính xác, bởi vì khía cạnh có thể hơi khác (trong trường hợp ứng dụng Web, tùy thuộc vào trình duyệt, một số phần tử có thể ở một vị trí hơi khác). Nó sẽ đưa ra một thước đo về mức độ giống nhau của các ảnh chụp màn hình.

Có thư viện / công cụ nào đã làm được điều đó không? Bạn sẽ thực hiện nó như thế nào?


1
Có một số câu trả lời hay cho câu hỏi tương tự khác này: stackoverflow.com/questions/75891/…
blak

1
Và nhiều hơn nữa tại đây: stackoverflow.com/questions/189943/…
Anoyz,

1
Đã đến lúc cập nhật câu trả lời dựa trên những tiến bộ gần đây trong Học máy và cụ thể hơn là "Học sâu".
jldupont

Phòng thí nghiệm của tôi cần thiết để giải quyết vấn đề này quá, và sử dụng các công việc được nêu ở đây: douglasduhaime.com/posts/...
duhaime

Câu trả lời:


73

Điều này hoàn toàn phụ thuộc vào mức độ thông minh mà bạn muốn thuật toán trở nên.

Ví dụ, đây là một số vấn đề:

  • hình ảnh đã cắt so với hình ảnh chưa được cắt xén
  • hình ảnh có thêm văn bản so với hình ảnh khác không có
  • hình ảnh phản chiếu

Thuật toán dễ nhất và đơn giản nhất mà tôi đã thấy cho điều này chỉ là thực hiện các bước sau cho mỗi hình ảnh:

  1. chia tỷ lệ thành một thứ gì đó nhỏ, như 64x64 hoặc 32x32, bỏ qua tỷ lệ khung hình, sử dụng thuật toán chia tỷ lệ kết hợp thay vì pixel gần nhất
  2. chia tỷ lệ các dải màu sao cho màu tối nhất là màu đen và màu sáng nhất là màu trắng
  3. xoay và lật hình ảnh sao cho màu sắc nhất ở trên cùng bên trái, sau đó trên cùng bên phải tối hơn tiếp theo, dưới cùng bên trái tối hơn tiếp theo (tất nhiên là càng xa càng tốt)

Chỉnh sửa A kết hợp thuật toán chia tỷ lệ là một trong đó khi mở rộng quy mô 10 pixel xuống ai sẽ làm điều đó bằng cách sử dụng chức năng mà mất màu sắc của tất cả những người 10 pixel và kết hợp chúng thành một. Có thể được thực hiện với các thuật toán như giá trị trung bình, giá trị trung bình hoặc các thuật toán phức tạp hơn như đường xoắn nhị phân.

Sau đó, tính toán khoảng cách trung bình từng pixel giữa hai hình ảnh.

Để tìm kiếm một kết quả phù hợp có thể có trong cơ sở dữ liệu, hãy lưu trữ màu pixel dưới dạng các cột riêng lẻ trong cơ sở dữ liệu, lập chỉ mục một loạt chúng (nhưng không phải tất cả, trừ khi bạn sử dụng một hình ảnh rất nhỏ) và thực hiện truy vấn sử dụng một phạm vi cho mỗi giá trị pixel, tức là. mọi hình ảnh mà pixel trong hình ảnh nhỏ nằm trong khoảng từ -5 đến +5 của hình ảnh bạn muốn tra cứu.

Điều này rất dễ thực hiện và chạy khá nhanh, nhưng tất nhiên sẽ không xử lý được hầu hết các khác biệt nâng cao. Đối với điều đó, bạn cần các thuật toán nâng cao hơn nhiều.


14
"Thuật toán mở rộng kết hợp" là gì?
Gregg Lind

32

Cách 'cổ điển' để đo điều này là chia hình ảnh thành một số phần chính tắc (ví dụ như lưới 10x10) và sau đó tính toán biểu đồ giá trị RGB bên trong mỗi ô và so sánh các biểu đồ tương ứng. Loại thuật toán này được ưa thích vì tính đơn giản của nó và nó luôn bất biến đối với việc mở rộng quy mô và (nhỏ!).


6
Điều này không tương tự như thực hiện một biểu đồ đơn lẻ cho toàn bộ hình ảnh, nhưng có thêm nhược điểm là không thể phản chiếu và xoay?
dodgy_coder

2 biểu đồ từ 2 nửa hình ảnh sẽ có độ chính xác khớp tốt hơn so với 1 biểu đồ của tổng thể. Mặc dù nó có những nhược điểm mà bạn đã đề cập, nhưng nó phụ thuộc vào vấn đề bạn đang giải quyết.
brm tâm lý 22/10/12

25

Sử dụng biểu đồ màu chuẩn hóa. (Đọc phần về các ứng dụng tại đây ), chúng thường được sử dụng trong các hệ thống truy xuất / đối sánh hình ảnh và là một cách khớp ảnh tiêu chuẩn rất đáng tin cậy, tương đối nhanh và rất dễ thực hiện.

Về cơ bản, một biểu đồ màu sẽ ghi lại sự phân bố màu sắc của hình ảnh. Sau đó, điều này có thể được so sánh với một hình ảnh khác để xem liệu sự phân bố màu sắc có khớp hay không.

Loại đối sánh này khá dễ thay đổi tỷ lệ (khi biểu đồ được chuẩn hóa) và xoay / dịch chuyển / chuyển động, v.v.

Tránh so sánh từng pixel vì nếu hình ảnh được xoay / dịch chuyển một chút, nó có thể dẫn đến sự khác biệt lớn được báo cáo.

Các biểu đồ sẽ đơn giản để tự tạo (giả sử bạn có thể truy cập vào các giá trị pixel), nhưng nếu bạn không cảm thấy thích nó, thư viện OpenCV là một nguồn tài nguyên tuyệt vời để thực hiện loại nội dung này. Đây là bản trình bày powerpoint hướng dẫn bạn cách tạo biểu đồ bằng OpenCV.


14

Các thuật toán mã hóa video như MPEG không tính toán sự khác biệt giữa từng khung hình của video để chúng chỉ có thể mã hóa delta? Bạn có thể xem xét cách các thuật toán mã hóa video tính toán những khác biệt về khung hình đó.

Nhìn vào ứng dụng tìm kiếm hình ảnh mã nguồn mở này http://www.semanticmetadata.net/lire/ . Nó mô tả một số thuật toán tương tự hình ảnh, ba trong số đó là từ tiêu chuẩn MPEG-7: ScalableColor, ColorLayout, EdgeHistogram và Auto Color Correlogram.


1
Điều này sẽ không trả lời câu hỏi ở đây. Câu hỏi không phải là về so sánh pixel trên mỗi pixel.
Kousha

@Kousha Đúng, nhưng vẫn là một hướng suy nghĩ thú vị.
ý nghĩa-vấn đề

13

Bạn có thể sử dụng một cách tiếp cận toán học thuần túy O(n^2), nhưng nó sẽ hữu ích chỉ khi bạn chắc chắn rằng không có phần bù hoặc thứ gì đó tương tự. (Mặc dù nếu bạn có một vài đối tượng có màu đồng nhất thì nó vẫn hoạt động khá tốt.)

Dù sao đi nữa, ý tưởng là tính toán tích điểm chuẩn hóa của hai ma trận. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

Công thức này thực sự là "cosin" của góc giữa các ma trận (wierd). Sự giống nhau càng lớn (giả sử Pij=Qij), C sẽ là 1, và nếu chúng hoàn toàn khác nhau, giả sử cho mọi i,j Qij = 1(tránh chia 0) Pij = 255, sau đó đối với kích thước nxn, nsẽ càng lớn , chúng ta sẽ càng gần 0 được. (Theo tính toán sơ bộ C=1/n^2:).


8

Bạn sẽ cần nhận dạng mẫu cho điều đó. Để xác định sự khác biệt nhỏ giữa hai hình ảnh, lưới Hopfield hoạt động khá tốt và khá dễ thực hiện. Tuy nhiên, tôi không biết bất kỳ triển khai có sẵn nào.


7

Một giải pháp ruby ​​có thể được tìm thấy ở đây

Từ readme:

Phashion là một trình bao bọc Ruby xung quanh thư viện pHash, "hàm băm nhận thức", phát hiện các tệp đa phương tiện trùng lặp và gần trùng lặp


5

Cách đo độ tương đồng giữa hai hình ảnh hoàn toàn phụ thuộc vào những gì bạn muốn đo, ví dụ: độ tương phản, độ sáng, phương thức, độ nhiễu ... và sau đó chọn thước đo độ tương đồng phù hợp nhất dành cho bạn. Bạn có thể chọn từ MAD (chênh lệch tuyệt đối trung bình), MSD (chênh lệch bình phương trung bình) tốt để đo độ sáng ... cũng có sẵn CR (hệ số tương quan) rất tốt trong việc thể hiện tương quan giữa hai hình ảnh. Bạn cũng có thể chọn từ các biện pháp tương tự dựa trên biểu đồ như SDH (độ lệch chuẩn của biểu đồ hình ảnh khác biệt) hoặc các biện pháp tương tự đa phương thức như MI (thông tin lẫn nhau) hoặc NMI (thông tin lẫn nhau được chuẩn hóa).

Bởi vì các biện pháp tương tự này tốn nhiều thời gian, nên thu nhỏ hình ảnh trước khi áp dụng các biện pháp này trên chúng.


4

Tôi tự hỏi (và tôi thực sự chỉ đang ném ý tưởng ra khỏi đó để bị bắn rơi) nếu điều gì đó có thể được bắt nguồn bằng cách trừ một hình ảnh khỏi hình ảnh kia, rồi nén hình ảnh kết quả dưới dạng jpeg gif và lấy kích thước tệp là một thước đo của sự giống nhau.

Nếu bạn có hai hình ảnh giống nhau, bạn sẽ nhận được một hộp màu trắng, sẽ nén rất tốt. Các hình ảnh càng khác nhau, nó sẽ càng phức tạp để thể hiện, và do đó, ít nén hơn.

Có lẽ không phải là một bài kiểm tra lý tưởng và có thể chậm hơn nhiều so với mức cần thiết, nhưng nó có thể hoạt động như một quá trình triển khai nhanh chóng và bẩn thỉu.


Hãy suy nghĩ về việc xoay 90 độ; hình ảnh vẫn tương tự.
ý nghĩa-vấn đề

3

Bạn có thể xem mã của công cụ nguồn mở findimagedupes , mặc dù nó dường như được viết bằng perl, vì vậy tôi không thể nói nó sẽ dễ dàng phân tích như thế nào ...

Đọc trang findimagedupes mà tôi thích, tôi thấy rằng có một C ++ triển khai cùng một thuật toán . Có lẽ điều này sẽ dễ hiểu hơn.

Và có vẻ như bạn cũng có thể sử dụng gqview .


2

Vâng, không phải để trả lời câu hỏi của bạn trực tiếp, nhưng tôi đã thấy điều này xảy ra. Microsoft gần đây đã tung ra một công cụ có tên là PhotoSynth có chức năng tương tự để xác định các khu vực chồng chéo trong một số lượng lớn các bức ảnh (có thể có các tỷ lệ khung hình khác nhau).

Tôi tự hỏi liệu họ có bất kỳ thư viện hoặc đoạn mã nào có sẵn trên blog của họ không.


1
Công nghệ này. đã bị ngưng.
Joseph Rosson

2

để mở rộng thêm về lưu ý của Vaibhav, hugin là một 'autostitcher' mã nguồn mở nên có một số thông tin chi tiết về vấn đề.


2

Có phần mềm để truy xuất hình ảnh dựa trên nội dung, phần mềm này thực hiện (một phần) những gì bạn cần. Tất cả các tài liệu tham khảo và giải thích được liên kết từ trang web của dự án và cũng có một cuốn sách văn bản ngắn (Kindle): LIRE


1

Bạn có thể sử dụng Siamese Network để xem hai hình ảnh giống nhau hay không giống nhau theo hướng dẫn này . Hướng dẫn này tập hợp các hình ảnh tương tự trong khi bạn có thể sử dụng L2khoảng cách để đo mức độ giống nhau của hai hình ảnh.


0

Nếu đây là điều bạn sẽ làm thường xuyên và không cần tự động hóa, bạn có thể làm điều đó trong trình chỉnh sửa hình ảnh hỗ trợ các lớp, chẳng hạn như Photoshop hoặc Paint Shop Pro (có thể là GIMP hoặc Paint.Net, nhưng tôi ' m không chắc chắn về những). Mở cả hai ảnh chụp màn hình và đặt một ảnh dưới dạng một lớp lên trên ảnh kia. Thay đổi chế độ hòa trộn của lớp thành Difference và mọi thứ giống nhau giữa hai lớp sẽ trở thành màu đen. Bạn có thể di chuyển lớp trên cùng xung quanh để giảm thiểu bất kỳ sự khác biệt nào về căn chỉnh.


Một công cụ mà làm kiểu này diffing rất đơn giản là kaleidoscopeapp.com
Michael Osofsky

0

Beyond Compareso sánh từng pixel cho hình ảnh, ví dụ:

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


@xilpex, OP hỏi: Có thư viện / công cụ nào làm được điều đó không? Câu trả lời của tôi bao gồm một liên kết đến một thư viện / công cụ như vậy.
emallove

-1

Một phương pháp thực sự ở mức cơ sở để sử dụng có thể xem xét từng màu pixel và so sánh nó với màu pixel tương ứng trên hình ảnh thứ hai - nhưng đó có lẽ là một giải pháp rất chậm.

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.