Dấu vân tay hình ảnh để so sánh độ giống nhau của nhiều hình ảnh


94

Tôi cần tạo dấu vân tay của nhiều hình ảnh (khoảng 100.000 hiện có, 1000 hình mới mỗi ngày, RGB, JPEG, kích thước tối đa 800x800) để so sánh mọi hình ảnh với mọi hình ảnh khác rất nhanh. Tôi không thể sử dụng phương pháp so sánh nhị phân vì hình ảnh gần giống nhau cũng nên được nhận dạng.

Tốt nhất sẽ là một thư viện hiện có, nhưng một số gợi ý cho các thuật toán hiện có cũng sẽ giúp tôi rất nhiều.


1
Ngôn ngữ thư viện nên dành cho?
Ben S

Câu trả lời:


57

Các thuật toán băm hoặc tính toán CRC thông thường không hoạt động tốt với dữ liệu hình ảnh. Bản chất chiều của thông tin phải được tính đến.

Nếu bạn cần tính năng lấy dấu vân tay cực kỳ mạnh mẽ, để tính đến các phép biến đổi affine (chia tỷ lệ, xoay, dịch, lật), bạn có thể sử dụng phép biến đổi Radon trên nguồn hình ảnh để tạo ánh xạ quy chuẩn cho dữ liệu hình ảnh - lưu trữ dữ liệu này với mỗi hình ảnh và sau đó chỉ so sánh các dấu vân tay. Đây là một thuật toán phức tạp và không dành cho những người yếu tim.

Một số giải pháp đơn giản có thể thực hiện được:

  1. Tạo biểu đồ độ sáng cho hình ảnh dưới dạng dấu vân tay
  2. Tạo các phiên bản thu nhỏ của từng hình ảnh dưới dạng dấu vân tay
  3. Kết hợp kỹ thuật (1) và (2) thành một phương pháp kết hợp để cải thiện chất lượng so sánh

Biểu đồ độ sáng (đặc biệt là biểu đồ được tách thành các thành phần RGB) là một dấu vân tay hợp lý cho một hình ảnh - và có thể được triển khai khá hiệu quả. Trừ một biểu đồ này khỏi một biểu đồ khác sẽ tạo ra một biểu đồ mới mà bạn có thể xử lý để quyết định mức độ tương tự của hai hình ảnh. Biểu đồ, bởi vì chỉ đánh giá sự phân bố và xuất hiện của thông tin độ sáng / màu sắc xử lý các phép biến đổi affine khá tốt. Nếu bạn định lượng thông tin độ sáng của từng thành phần màu xuống giá trị 8-bit, thì 768 byte dung lượng lưu trữ là đủ cho dấu vân tay của một hình ảnh có kích thước gần như hợp lý. Biểu đồ độ sáng tạo ra âm tính giả khi thông tin màu trong hình ảnh được thao tác. Nếu bạn áp dụng các biến đổi như độ tương phản / độ sáng, posterize, chuyển màu, thay đổi thông tin độ sáng.

Sử dụng hình ảnh được chia tỷ lệ là một cách khác để giảm mật độ thông tin của hình ảnh đến mức dễ so sánh hơn. Giảm xuống dưới 10% kích thước hình ảnh gốc thường làm mất quá nhiều thông tin được sử dụng - vì vậy, hình ảnh 800x800 pixel có thể được thu nhỏ xuống 80x80 và vẫn cung cấp đủ thông tin để thực hiện lấy dấu vân tay tốt. Không giống như dữ liệu biểu đồ, bạn phải thực hiện chia tỷ lệ dị hướng của dữ liệu hình ảnh khi độ phân giải nguồn có tỷ lệ khung hình khác nhau. Nói cách khác, việc giảm hình ảnh 300x800 thành hình thu nhỏ 80x80 gây ra biến dạng hình ảnh, như vậy khi so sánh với hình ảnh 300x500 (rất giống) sẽ gây ra âm bản giả. Dấu vân tay hình thu nhỏ cũng thường tạo ra âm tính giả khi có các phép biến đổi affine. Nếu bạn lật hoặc xoay một hình ảnh,

Kết hợp cả hai kỹ thuật là một cách hợp lý để bảo vệ cược của bạn và giảm khả năng xảy ra của cả dương tính giả và âm tính giả.


Về CRC, đã đồng ý. Tuy nhiên, nếu ai muốn sử dụng nó, nó tốt hơn để sử dụng MD5 băm hơn CRC32
mloskot

5
Bạn sẽ không muốn sử dụng MD5 vì nó là một hàm băm mật mã một chiều. Bạn cần sử dụng một phương pháp băm sẽ tạo ra một kết quả tương tự cho một đầu vào tương tự để bạn có thể so sánh trực tiếp sự khác biệt giữa các hàm băm.
AJ Quick

34

Có một cách tiếp cận ít đặc biệt hơn nhiều so với các biến thể hình ảnh thu nhỏ đã được đề xuất ở đây mà vẫn giữ nguyên hương vị chung của chúng, nhưng đưa ra cơ sở toán học chặt chẽ hơn nhiều cho những gì đang diễn ra.

Chụp ảnh Haar wavelet . Về cơ bản, Haar wavelet là sự liên tiếp của sự khác biệt từ các hình ảnh có độ phân giải thấp hơn đến mỗi hình ảnh có độ phân giải cao hơn, nhưng có trọng số bởi độ sâu của bạn trong 'cây' mipmap. Tính toán rất đơn giản. Sau đó, một khi bạn đã có trọng số thích hợp của Wavelet Haar, hãy vứt bỏ tất cả trừ k hệ số lớn nhất (về giá trị tuyệt đối), chuẩn hóa vectơ và lưu nó.

Nếu bạn lấy tích số chấm của hai trong số các vectơ chuẩn hóa đó, nó sẽ cho bạn một số đo về độ tương tự với 1 là gần giống nhau. Tôi đã đăng thêm thông tin ở đây .


20

Bạn chắc chắn nên xem qua phash .

Để so sánh hình ảnh, có dự án php này : https://github.com/kennethrapp/phasher

Và bản sao javascript nhỏ của tôi : https://redaktor.me/phasher/demo_js/index.html

Thật không may, đây là dựa trên "bitcount" nhưng sẽ nhận dạng hình ảnh được xoay. Một cách tiếp cận khác trong javascript là xây dựng biểu đồ độ sáng từ hình ảnh nhờ sự trợ giúp của canvas. Bạn có thể hình dung một biểu đồ đa giác trên canvas và so sánh đa giác đó trong cơ sở dữ liệu của mình (ví dụ: mySQL spatial ...)


đây là vào npm? Tôi đang tìm cách so sánh độ giống nhau giữa hai hình ảnh bằng javascript
chovy

Hm, tôi nghĩ nó là "rẻ cho npm". Nó thực sự chỉ là một bản demo được viết nhanh từ đầu. Tuy nhiên, hãy thoải mái làm bất cứ điều gì bạn muốn với nguồn. Nếu tôi có thể làm cho nó tôi sẽ xem xét nó sau này và đẩy nó đến github github.com/redaktor ...
sebilasse

@SebastianLasse Tôi vừa kiểm tra cổng JS của bạn và nó thật tuyệt vời! Tôi chỉ ước rằng bạn có thể chuyển một URI hình ảnh vào Compare()hàm thay vì phải tải xuống hình ảnh trước. Ngoài ra, từ thử nghiệm của tôi, ngưỡng cho "một hình ảnh rất giống" phải> 90%, không phải> 98%.
thdoan

12

Cách đây khá lâu, tôi đã làm việc trên một hệ thống có một số đặc điểm tương tự và đây là thuật toán gần đúng mà chúng tôi đã tuân theo:

  1. Chia bức tranh thành các khu. Trong trường hợp của chúng tôi, chúng tôi đang xử lý video độ phân giải 4: 3, vì vậy chúng tôi sử dụng 12 vùng. Làm điều này sẽ loại bỏ độ phân giải của ảnh nguồn ra khỏi ảnh.
  2. Đối với mỗi vùng, hãy tính một màu tổng thể - trung bình của tất cả các pixel trong vùng
  3. Đối với toàn bộ hình ảnh, hãy tính màu tổng thể - trung bình của tất cả các vùng

Vì vậy, đối với mỗi hình ảnh, bạn đang lưu trữ n + 1các giá trị số nguyên, nsố vùng bạn đang theo dõi ở đâu.

Để so sánh, bạn cũng cần xem xét từng kênh màu riêng lẻ.

  1. Đối với hình ảnh tổng thể, hãy so sánh các kênh màu cho các màu tổng thể để xem liệu chúng có nằm trong một ngưỡng nhất định hay không - giả sử, 10%
  2. Nếu hình ảnh nằm trong ngưỡng, tiếp theo hãy so sánh từng vùng. Nếu tất cả các khu vực cũng nằm trong ngưỡng, hình ảnh phù hợp đủ mạnh để bạn có thể gắn cờ ít nhất để so sánh thêm.

Điều này cho phép bạn nhanh chóng loại bỏ các hình ảnh không phù hợp; bạn cũng có thể sử dụng nhiều vùng hơn và / hoặc áp dụng thuật toán đệ quy để có được độ tin cậy đối sánh cao hơn.


6

Tương tự như câu trả lời của Ic - bạn có thể thử so sánh các hình ảnh ở nhiều độ phân giải. Vì vậy, mỗi hình ảnh được lưu dưới dạng 1x1, 2x2, 4x4 .. 800x800. Nếu độ phân giải thấp nhất không khớp (tùy thuộc vào một ngưỡng), bạn có thể từ chối ngay lập tức. Nếu nó khớp, bạn có thể so sánh chúng ở độ phân giải cao hơn tiếp theo, v.v.

Ngoài ra - nếu các hình ảnh chia sẻ bất kỳ cấu trúc tương tự nào, chẳng hạn như hình ảnh y tế, bạn có thể trích xuất cấu trúc đó thành mô tả để so sánh dễ dàng / nhanh hơn.


Tôi nghĩ điều này ánh xạ đến một số loại tìm kiếm trên cây. Thật thú vị.
André Laszlo

3

Vì vậy, bạn muốn thực hiện "đối sánh vân tay" khác với "đối sánh hình ảnh". Phân tích dấu vân tay đã được nghiên cứu sâu sắc trong suốt 20 năm qua và một số thuật toán thú vị đã được phát triển để đảm bảo tỷ lệ phát hiện đúng (đối với các biện pháp FARFRR - Tỷ lệ chấp nhận saiTỷ lệ từ chối sai ).

Tôi đề nghị bạn nên xem xét kỹ hơn lớp kỹ thuật phát hiện LFA (Phân tích tính năng cục bộ) , chủ yếu được xây dựng dựa trên việc kiểm tra chi tiết. Các điểm nhỏ là đặc điểm cụ thể của bất kỳ dấu vân tay nào và được phân loại thành nhiều lớp. Ánh xạ hình ảnh raster vào một bản đồ chi tiết là những gì thực sự mà hầu hết các Cơ quan công quyền làm để điều tra tội phạm hoặc khủng bố.

Xem tại đây để tham khảo thêm


Bạn có biết cách tính Tỷ lệ chấp nhận Sai nếu bạn có phân phối điểm Gaussian cho một hệ thống sinh trắc học nhất định không?
GobiasKoffi

OP muốn "tạo dấu vân tay của nhiều hình ảnh". Không so sánh hình ảnh của dấu vân tay của con người.
Navin


3

Kể từ năm 2015 (trở lại tương lai ... đối với câu hỏi năm 2009 này, hiện được xếp hạng cao trong Google) độ tương tự hình ảnh có thể được tính toán bằng các kỹ thuật Deep Learning. Họ các thuật toán được gọi là Bộ mã hóa tự động có thể tạo ra một biểu diễn vectơ có thể tìm kiếm được cho sự giống nhau. Có một bản demo ở đây .


Có thể tạo hình ảnh dấu vân tay từ dữ liệu nhị phân không?
SwR

Chắc chắn, có ANN cho nhiệm vụ này, nhưng câu trả lời của bạn dường như không thực sự trả lời bất cứ điều gì. Câu hỏi là: Điều đó được thực hiện như thế nào? Trang được liên kết không tiết lộ bất kỳ thông tin nào và thuật ngữ "Bộ mã hóa tự động" cũng không giúp ích gì.
Simon Steinberger,

Câu hỏi ban đầu không nói "Điều đó được thực hiện như thế nào?", nhưng nó nói "một số gợi ý cho các thuật toán hiện có sẽ giúp tôi rất nhiều", đó là những gì tôi đã cung cấp.
Alex R

Bạn đã không liên kết một "gợi ý" cho một thuật toán, trên thực tế các trang liên kết nói, "nó hoạt động, nhưng không ai biết lý do tại sao Xin đừng mong đợi quá nhiều về kết quả." ...
odyth

Deeplearning4j.org/deepautoencoder#use-case này cung cấp thêm thông tin rõ ràng hơn về cách Bộ mã hóa tự động có thể được sử dụng để tạo dấu tay và sau đó cách bạn có thể sử dụng dấu tay đó để tìm điểm tương đồng trong các hình ảnh khác dựa trên mức độ giống nhau của các đỉnh.
odyth

2

Một cách bạn có thể làm là thay đổi kích thước hình ảnh và giảm độ phân giải xuống đáng kể (có thể là 200x200?), Lưu trữ phiên bản nhỏ hơn (trung bình pixel) để thực hiện so sánh. Sau đó, xác định ngưỡng dung sai và so sánh từng pixel. Nếu RGB của tất cả các pixel nằm trong dung sai, bạn đã có một kết quả phù hợp.

Lần chạy ban đầu của bạn là O (n ^ 2) nhưng nếu bạn lập danh mục tất cả các kết quả trùng khớp, thì mỗi hình ảnh mới chỉ là một thuật toán O (n) để so sánh (bạn chỉ phải so sánh nó với mỗi hình ảnh đã chèn trước đó). Tuy nhiên, cuối cùng nó sẽ bị phá vỡ khi danh sách các hình ảnh để so sánh ngày càng lớn hơn, nhưng tôi nghĩ bạn vẫn an toàn trong một thời gian.

Sau 400 ngày chạy, bạn sẽ có 500.000 hình ảnh, có nghĩa là (giảm thời gian thay đổi kích thước hình ảnh xuống) 200(H)*200(W)*500,000(images)*3(RGB)= 60.000.000.000 so sánh. Nếu mọi hình ảnh đều khớp chính xác, bạn sẽ bị tụt lại phía sau, nhưng có lẽ sẽ không đúng như vậy, đúng không? Hãy nhớ rằng bạn có thể giảm giá một hình ảnh dưới dạng đối sánh ngay khi một so sánh duy nhất nằm ngoài ngưỡng của bạn.


2

Bạn có thực sự muốn so sánh mọi hình ảnh với những hình ảnh khác không? Ứng dụng là gì? Có thể bạn chỉ cần một số loại lập chỉ mục và truy xuất hình ảnh dựa trên các bộ mô tả nhất định? Ví dụ, bạn có thể xem tiêu chuẩn MPEG-7 cho Giao diện mô tả nội dung đa phương tiện. Sau đó, bạn có thể so sánh các bộ mô tả hình ảnh khác nhau, sẽ không chính xác nhưng nhanh hơn nhiều.


có thể là một sự lựa chọn giữa đầy đủ và hạn chế
johnny

0

Có vẻ như các thuật toán băm hình ảnh chuyên biệt là một lĩnh vực đang được nghiên cứu tích cực nhưng có lẽ phép tính băm thông thường của các byte hình ảnh sẽ làm được điều này.

Bạn đang tìm kiếm những hình ảnh giống nhau về byte thay vì tìm kiếm những hình ảnh có nguồn gốc từ cùng một nguồn nhưng có thể có định dạng hoặc độ phân giải khác (điều này khiến tôi gặp phải vấn đề khá khó khăn).

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.