2008-12-03 60 views
38

Đôi khi hai tệp hình ảnh có thể khác nhau ở cấp tệp, nhưng một con người sẽ xem xét chúng giống hệt nhau. Cho rằng, bây giờ giả sử bạn có một cơ sở dữ liệu khổng lồ của hình ảnh, và bạn muốn biết nếu một con người sẽ nghĩ rằng một số hình ảnh X có mặt trong cơ sở dữ liệu hay không. Nếu tất cả các hình ảnh có một băm/vân tay cảm nhận, thì người ta có thể băm hình ảnh X và nó sẽ là một vấn đề đơn giản để xem nó có nằm trong cơ sở dữ liệu hay không.Phát hiện xem hai hình ảnh có giống hệt nhau không

Tôi biết có nghiên cứu xung quanh vấn đề này và một số thuật toán tồn tại, nhưng có công cụ nào, như công cụ dòng lệnh UNIX hoặc thư viện tôi có thể sử dụng để tính toán băm như vậy mà không thực hiện một số thuật toán không?

chỉnh sửa: Mã liên quan từ findimagedupes, sử dụng ImageMagick

try $image->Sample("160x160!"); 
try $image->Modulate(saturation=>-100); 
try $image->Blur(radius=>3,sigma=>99); 
try $image->Normalize(); 
try $image->Equalize(); 
try $image->Sample("16x16"); 
try $image->Threshold(); 
try $image->Set(magick=>'mono'); 
($blob) = $image->ImageToBlob(); 

chỉnh sửa: Cảnh báo! ImageMagick $ image object dường như chứa thông tin về thời gian tạo tập tin ảnh đã được đọc. Điều này có nghĩa là blob bạn nhận được sẽ khác ngay cả đối với cùng một hình ảnh, nếu nó được truy xuất vào một thời điểm khác. Để đảm bảo rằng dấu vân tay vẫn giữ nguyên, hãy sử dụng $ image-> getImageSignature() làm bước cuối cùng.

+1

Quy trình đó có vẻ cực kỳ chuyên sâu về xử lý. – endolith

+0

* Điều này có nghĩa là các đốm màu bạn nhận được sẽ khác nhau ngay cả đối với cùng một hình ảnh, nếu nó được truy xuất vào một thời điểm khác. * Điều này không đúng với chuỗi '" $ blob "' (nếu được đưa vào dấu ngoặc kép), sẽ chính xác là 32 byte nếu các pixel hình ảnh giống nhau. – pts

Trả lời

14

findimagedupes là khá tốt. Bạn có thể chạy "findimagedupes -v vân tay hình ảnh" để cho nó in "băm cảm nhận", ví dụ.

+0

Chính xác cùng một thuật toán được thực hiện bằng Python (với GraphicsMagick thực hiện việc nâng hạng nặng) tại đây: https://github.com/pts/pyfindimagedupes – pts

-2

Bạn có thể sử dụng diff để xem chúng có khác nhau không .. Tôi đoán nó sẽ loại bỏ rất nhiều so sánh vô ích. Sau đó, đối với thuật toán, tôi sẽ sử dụng một cách tiếp cận xác suất .. cơ hội mà họ trông giống nhau là gì .. Tôi dựa trên số lượng rgb trong mỗi pixel. Bạn cũng có thể tìm thấy một số chỉ số khác như độ sáng và những thứ tương tự.

1

Tôi không biết thuật toán đằng sau nó, nhưng Microsoft Live Image Search chỉ added khả năng này. Picasa cũng có khả năng xác định khuôn mặt trong hình ảnh và các nhóm trông giống như vậy. Hầu hết thời gian, đó là cùng một người.

Một số công nghệ học máy như máy vectơ hỗ trợ, mạng nơron, phân loại Bayes ngây thơ hoặc mạng Bayesian sẽ là tốt nhất ở loại sự cố này. Tôi đã viết một trong ba phần đầu tiên để phân loại các chữ số viết tay, về cơ bản là nhận dạng mẫu hình ảnh.

0

thay đổi kích thước hình ảnh thành pixel 1x1 ... nếu chúng chính xác, có xác suất nhỏ là cùng một hình ảnh ... hiện đổi kích thước hình ảnh thành hình ảnh 2x2 pixel, nếu tất cả 4 pixel chính xác, là xác suất lớn hơn, chúng chính xác ... rồi 3x3, nếu tất cả 9 pixel chính xác ... cơ hội tốt, v.v. thì 4x4, nếu tất cả 16 pixel chính xác, ... cơ hội tốt hơn.

vv ...

làm nó theo cách này, bạn có thể làm cho improvments hiệu quả ... nếu lưới 1x1 pixel được tắt theo rất nhiều, tại sao bận tâm kiểm tra lưới 2x2? v.v.

+0

Điều này sẽ không hoạt động trong trường hợp một hình ảnh đã được điều chỉnh một chút, sao cho nó hơi tối hơn hoặc bão hòa hơn, hoặc đã bị cắt một lượng nhỏ. Bạn cũng phải tính đến việc lấy lại mẫu là một việc tốn kém, đặc biệt là khi sử dụng phép nội suy bicubic trên hình ảnh lớn. –

+0

Chắc chắn bước đầu tiên là giảm hình ảnh gốc xuống kích thước tối thiểu. Không cần hình ảnh "cây trên đồi" là 10gb để phân biệt nó với hình ảnh "hoa trên gò đất". – willc2

-2

DPEG, "Trình quản lý phương tiện trùng lặp, nhưng mã của nó không mở. Đó là một công cụ rất cũ - Tôi nhớ sử dụng nó vào năm 2003.

+2

Tại sao hai nhược điểm? Người dùng đã yêu cầu một công cụ dòng lệnh, không phải là giải pháp lập trình. –

+0

@pts: liên kết không bị hỏng cho tôi; nó được chuyển hướng đến liên kết hiện tại. Tôi vẫn cập nhật câu trả lời. –

0

Nếu bạn có nhiều hình ảnh, biểu đồ màu có thể được sử dụng để có được gần giống hình ảnh trước khi thực hiện so sánh hình ảnh đầy đủ của từng hình ảnh với nhau. tức là O (n^2)).

4

Biểu đồ màu là tốt cho cùng một hình ảnh đã được thay đổi kích thước, được lấy lại mẫu, v.v.
Nếu bạn muốn kết hợp các bức ảnh của cùng một người khác nhau về cùng một mốc, điều đó phức tạp hơn - hãy xem xét các bộ phân loại haar. Opencv là một thư viện miễn phí tuyệt vời để xử lý ảnh.

5

Tương quan chéo hoặc tương quan pha sẽ cho bạn biết các hình ảnh có giống nhau hay không, ngay cả với nhiễu, suy giảm và lệch ngang hoặc dọc. Sử dụng các phương pháp dựa trên FFT sẽ làm cho nó nhanh hơn nhiều so với thuật toán được mô tả trong câu hỏi.

Thuật toán thông thường không hoạt động với hình ảnh không cùng quy mô hoặc xoay vòng. Bạn có thể xoay trước hoặc quy mô trước chúng, nhưng đó thực sự là bộ xử lý chuyên sâu. Rõ ràng bạn cũng có thể làm tương quan trong một không gian log-polar và nó sẽ là bất biến để xoay, dịch và quy mô, nhưng tôi không biết chi tiết đủ tốt để giải thích điều đó.

MATLAB dụ: Registering an Image Using Normalized Cross-Correlation

Wikipedia gọi đây là "phase correlation" và cũng mô tả making it scale- and rotation-invariant:

Phương pháp này có thể được mở rộng để xác định luân chuyển và chênh lệch rộng giữa hai hình ảnh bằng cách đầu tiên chuyển đổi các hình ảnh để đăng nhập tọa độ-cực. Do các thuộc tính của phép biến đổi Fourier, các tham số xoay và chia tỷ lệ có thể được xác định theo cách bất biến đối với bản dịch.

Các vấn đề liên quan