So sánh hình ảnh - thuật toán nhanh


393

Tôi đang tìm cách tạo một bảng hình ảnh cơ bản và sau đó so sánh bất kỳ hình ảnh mới nào với hình ảnh đó để xác định xem hình ảnh mới có phải là một bản sao chính xác (hoặc đóng) của cơ sở không.

Ví dụ: nếu bạn muốn giảm dung lượng lưu trữ của cùng một hình ảnh 100 lần, bạn có thể lưu trữ một bản sao của nó và cung cấp các liên kết tham chiếu đến nó. Khi một hình ảnh mới được nhập vào, bạn muốn so sánh với một hình ảnh hiện có để đảm bảo đó không phải là một ... ý tưởng trùng lặp?

Một ý tưởng của tôi là giảm xuống một hình thu nhỏ và sau đó chọn ngẫu nhiên các vị trí 100 pixel và so sánh.

Câu trả lời:


459

Dưới đây là ba cách tiếp cận để giải quyết vấn đề này (và có nhiều cách khác).

  • Đầu tiên là một cách tiếp cận tiêu chuẩn trong tầm nhìn máy tính, khớp điểm chính. Điều này có thể yêu cầu một số kiến ​​thức nền tảng để thực hiện và có thể chậm.

  • Phương pháp thứ hai chỉ sử dụng xử lý hình ảnh cơ bản và có khả năng nhanh hơn phương pháp thứ nhất và rất dễ thực hiện. Tuy nhiên, những gì nó đạt được trong sự dễ hiểu, nó thiếu tính mạnh mẽ - kết hợp thất bại trên các hình ảnh được thu nhỏ, xoay hoặc bị đổi màu.

  • Phương pháp thứ ba vừa nhanh vừa mạnh, nhưng có khả năng khó thực hiện nhất.

Kết hợp quan điểm

Tốt hơn là chọn 100 điểm ngẫu nhiên là chọn 100 điểm quan trọng . Một số phần của hình ảnh có nhiều thông tin hơn các phần khác (đặc biệt là ở các cạnh và góc) và đây là những phần bạn sẽ muốn sử dụng để khớp hình ảnh thông minh. Google " trích xuất điểm chính " và " khớp điểm chính " và bạn sẽ tìm thấy khá nhiều bài báo học thuật về chủ đề này. Ngày nay, các điểm chính của SIFT được cho là phổ biến nhất, vì chúng có thể khớp với hình ảnh dưới các tỷ lệ, góc quay và ánh sáng khác nhau. Một số triển khai SIFT có thể được tìm thấy ở đây .

Một nhược điểm của khớp điểm chính là thời gian chạy của một triển khai ngây thơ: O (n ^ 2m), trong đó n là số lượng điểm chính trong mỗi hình ảnh và m là số lượng hình ảnh trong cơ sở dữ liệu. Một số thuật toán thông minh có thể tìm thấy kết quả khớp gần nhất nhanh hơn, như phân vùng không gian nhị phân hoặc nhị phân.


Giải pháp thay thế: Phương pháp biểu đồ

Một giải pháp khác ít mạnh mẽ hơn nhưng có khả năng nhanh hơn là xây dựng biểu đồ đặc trưng cho từng hình ảnh và chọn hình ảnh có biểu đồ gần nhất với biểu đồ của hình ảnh đầu vào. Tôi đã thực hiện điều này như một sinh viên đại học, và chúng tôi đã sử dụng 3 biểu đồ màu (đỏ, xanh lá cây và xanh dương), và hai biểu đồ kết cấu, hướng và tỷ lệ. Tôi sẽ cung cấp các chi tiết bên dưới, nhưng tôi cần lưu ý rằng điều này chỉ hoạt động tốt để phù hợp với hình ảnh RẤT tương tự như hình ảnh cơ sở dữ liệu. Hình ảnh được thu nhỏ lại, xoay hoặc đổi màu có thể thất bại với phương pháp này, nhưng những thay đổi nhỏ như cắt xén sẽ không phá vỡ thuật toán

Việc tính toán biểu đồ màu rất đơn giản - chỉ cần chọn phạm vi cho các nhóm biểu đồ của bạn và đối với từng phạm vi, hãy kiểm tra số lượng pixel có màu trong phạm vi đó. Ví dụ, hãy xem xét biểu đồ "xanh" và giả sử chúng tôi chọn 4 nhóm cho biểu đồ của chúng tôi: 0-63, 64-127, 128-191 và 192-255. Sau đó, với mỗi pixel, chúng tôi xem xét giá trị màu xanh lá cây và thêm một kiểm đếm vào nhóm thích hợp. Khi chúng tôi thực hiện kiểm đếm, chúng tôi chia tổng số xô cho tổng số pixel trong toàn bộ hình ảnh để có được biểu đồ chuẩn hóa cho kênh màu xanh lá cây.

Đối với biểu đồ hướng kết cấu, chúng tôi bắt đầu bằng cách thực hiện phát hiện cạnh trên hình ảnh. Mỗi điểm cạnh có một vectơ bình thường chỉ theo hướng vuông góc với cạnh. Chúng tôi đã định lượng góc của vectơ bình thường thành một trong 6 xô giữa 0 và PI (vì các cạnh có đối xứng 180 độ, chúng tôi đã chuyển đổi các góc giữa -PI và 0 thành từ 0 đến PI). Sau khi kiểm tra số lượng các điểm cạnh theo mỗi hướng, chúng ta có một biểu đồ không chuẩn hóa đại diện cho hướng kết cấu, chúng ta đã chuẩn hóa bằng cách chia mỗi nhóm cho tổng số điểm cạnh trong ảnh.

Để tính toán biểu đồ tỷ lệ kết cấu, với mỗi điểm cạnh, chúng tôi đã đo khoảng cách đến điểm cạnh gần nhất tiếp theo với cùng một hướng. Ví dụ: nếu điểm cạnh A có hướng 45 độ, thuật toán sẽ đi theo hướng đó cho đến khi tìm thấy điểm cạnh khác với hướng 45 độ (hoặc trong độ lệch hợp lý). Sau khi tính toán khoảng cách này cho từng điểm cạnh, chúng ta đổ các giá trị đó vào biểu đồ và chuẩn hóa nó bằng cách chia cho tổng số điểm cạnh.

Bây giờ bạn có 5 biểu đồ cho mỗi hình ảnh. Để so sánh hai hình ảnh, bạn lấy giá trị tuyệt đối của chênh lệch giữa mỗi nhóm biểu đồ, sau đó tính tổng các giá trị này. Ví dụ, để so sánh ảnh A và B, chúng tôi sẽ tính toán

|A.green_histogram.bucket_1 - B.green_histogram.bucket_1| 

cho mỗi nhóm trong biểu đồ màu xanh lá cây và lặp lại cho các biểu đồ khác, sau đó tổng hợp tất cả các kết quả. Kết quả càng nhỏ, trận đấu càng tốt. Lặp lại cho tất cả các hình ảnh trong cơ sở dữ liệu và trận đấu có kết quả nhỏ nhất sẽ thắng. Bạn có thể muốn có một ngưỡng, trên đó thuật toán kết luận rằng không tìm thấy kết quả khớp nào.


Lựa chọn thứ ba - Điểm then chốt + Cây quyết định

Cách tiếp cận thứ ba có lẽ nhanh hơn nhiều so với hai cách khác là sử dụng rừng texton ngữ nghĩa (PDF). Điều này liên quan đến việc trích xuất các điểm chính đơn giản và sử dụng cây quyết định bộ sưu tập để phân loại hình ảnh. Điều này nhanh hơn so với khớp điểm Sift đơn giản, vì nó tránh được quá trình khớp chính xác tốn kém và các điểm khóa đơn giản hơn nhiều so với SIFT, vì vậy việc trích xuất điểm khóa nhanh hơn nhiều. Tuy nhiên, nó bảo tồn tính bất biến của phương thức SIFT đối với xoay, tỷ lệ và ánh sáng, một tính năng quan trọng mà phương pháp biểu đồ thiếu.

Cập nhật :

Sai lầm của tôi - bài báo Semantic Texton Forests không đặc biệt về việc khớp hình ảnh, mà là ghi nhãn theo vùng. Bài báo gốc phù hợp là bài này: Nhận dạng điểm chính bằng cách sử dụng cây ngẫu nhiên . Ngoài ra, các bài viết dưới đây tiếp tục phát triển các ý tưởng và đại diện cho trạng thái của nghệ thuật (c. 2010):


Cách tiếp cận Histogram dường như có ý nghĩa nhất. Tôi giả sử bạn có thể xoay hình ảnh để thực hiện điều này trên tất cả các mặt chỉ trong trường hợp hình ảnh được so sánh được quay (xử lý hình ảnh tương tự như 4) - cảm ơn
cỏ

4
@meade Đúng vậy. Một điều khác cần xem xét: tùy thuộc vào vấn đề của bạn, bạn có thể không cần sử dụng tất cả 5 biểu đồ trong thuật toán của mình. Loại bỏ biểu đồ hướng kết cấu sẽ cho phép bạn khớp các phiên bản xoay của hình ảnh. Loại bỏ biểu đồ tỷ lệ kết cấu sẽ cho phép bạn khớp các phiên bản được thu nhỏ lại của hình ảnh. Bạn sẽ mất một số khả năng để so sánh sự giống nhau, nhưng điều này có thể không phải là một vấn đề, tùy thuộc vào tình huống của bạn. Ngoài ra, vì thông tin kết cấu máy tính là phần tốn kém nhất của thuật toán, điều này cũng sẽ làm cho thuật toán của bạn trở nên nhanh chóng.
Kyle Simek

@redmoskito: Tôi có một câu hỏi. Làm thế nào để bạn có được giá trị số của biểu đồ màu xanh lá cây chẳng hạn? Vì vậy, bạn có thể trừ nó với biểu đồ hình ảnh khác? Giả sử chúng ta có một biểu đồ màu xanh lá cây với 3 pixel thuộc nhóm 0-63 và 5 pixel thuộc 64-127. Đó là giá trị nào?
năng động

3
@Ikaso nếu nó chính xác là cùng một hình ảnh, có lẽ bạn không muốn sử dụng bất cứ thứ gì như vậy và xem xét sử dụng so sánh CRC hoặc MD5 đơn giản. Nếu điều này là không đủ, giống như có các pixel đơn khác nhau hoặc siêu dữ liệu đã thay đổi, phương pháp biểu đồ cũng là đủ. nếu hình ảnh của bạn giống nhau nhưng được xoay hoặc thu nhỏ, một phương pháp dựa trên biểu đồ có thể là hiệu quả nhưng có thể sẽ thất bại. nếu hình ảnh của bạn thay đổi màu sắc, bạn cần sử dụng thuật toán dựa trên điểm quan tâm.
reox

5
Tôi muốn thêm rằng ngày nay, nhiều lựa chọn thay thế nhanh chóng cho SIFT tồn tại, chẳng hạn như trình phát hiện FAST và mô tả nhị phân (BRIEF, BRISK, ORB, FREAK, BinBoost) để đặt tên cho một số. Hướng dẫn về mô tả nhị phân có thể được tìm thấy ở đây: gilscvblog.wordpress.com/2013/08/26/ mẹo
GilLevi

85

Phương pháp tốt nhất mà tôi biết là sử dụng Perceptionual Hash. Dường như có một triển khai mã nguồn mở tốt của hàm băm như vậy có sẵn tại:

http://phash.org/

Ý tưởng chính là mỗi hình ảnh được giảm xuống một mã băm nhỏ hoặc 'dấu vân tay' bằng cách xác định các tính năng nổi bật trong tệp hình ảnh gốc và băm một biểu diễn nhỏ gọn của các tính năng đó (thay vì băm trực tiếp dữ liệu hình ảnh). Điều này có nghĩa là tỷ lệ dương tính giả giảm đi rất nhiều so với cách tiếp cận đơn giản như giảm hình ảnh xuống hình ảnh kích thước vân tay nhỏ và so sánh dấu vân tay.

phash cung cấp một số loại băm và có thể được sử dụng cho hình ảnh, âm thanh hoặc video.


Ai thú vị trong phương pháp này có thể tìm thấy nhận thức Hash khách quan-C bằng cách liên kết github.com/ameingast/cocoaimagehashing
Alexey Voitenko

@AlexeyVoitenko Điều này có tương thích với các giá trị băm do phash.org tạo ra trong cấu hình mặc định của nó không?
Michael

1
Theo kinh nghiệm của tôi, phash hoạt động tốt để tìm các kích thước khác nhau của cùng một hình ảnh, nhưng không phải cho các hình ảnh tương tự. Ví dụ, hai bức ảnh khác nhau của cùng một đối tượng có thể có các giá trị băm rất khác nhau.
Rena

39

Bài đăng này là điểm khởi đầu của giải pháp của tôi, rất nhiều ý tưởng hay ở đây vì vậy tôi mặc dù tôi sẽ chia sẻ kết quả của mình. Cái nhìn sâu sắc chính là tôi đã tìm ra cách khắc phục sự chậm chạp của việc khớp hình ảnh dựa trên điểm chính bằng cách khai thác tốc độ của phash.

Đối với giải pháp chung, tốt nhất là sử dụng một số chiến lược. Mỗi thuật toán phù hợp nhất cho các loại biến đổi hình ảnh nhất định và bạn có thể tận dụng lợi thế đó.

Ở đầu, các thuật toán nhanh nhất; ở phía dưới chậm nhất (mặc dù chính xác hơn). Bạn có thể bỏ qua những cái chậm nếu một trận đấu hay được tìm thấy ở cấp độ nhanh hơn.

  • dựa trên tệp băm (md5, sha1, v.v.) để sao chép chính xác
  • băm nhận thức (phash) cho hình ảnh thay đổi kích thước
  • dựa trên tính năng (SIFT) cho hình ảnh được sửa đổi

Tôi đang có kết quả rất tốt với phash. Độ chính xác là tốt cho hình ảnh thay đổi kích thước. Nó không tốt cho (nhận thức) hình ảnh được sửa đổi (cắt, xoay, nhân đôi, v.v.). Để đối phó với tốc độ băm, chúng ta phải sử dụng bộ đệm / cơ sở dữ liệu đĩa để duy trì băm cho haystack.

Điều thực sự thú vị về phash là một khi bạn xây dựng cơ sở dữ liệu băm của mình (với tôi là khoảng 1000 hình ảnh / giây), các tìm kiếm có thể rất, rất nhanh, đặc biệt là khi bạn có thể giữ toàn bộ cơ sở dữ liệu băm trong bộ nhớ. Điều này khá thực tế vì một hàm băm chỉ có 8 byte.

Ví dụ: nếu bạn có 1 triệu hình ảnh, nó sẽ yêu cầu một mảng gồm 1 triệu giá trị băm 64 bit (8 MB). Trên một số CPU, điều này phù hợp với bộ đệm L2 / L3! Trong sử dụng thực tế tôi đã thấy một corei7 so sánh ở mức hơn 1 Giga-hamm / giây, đó chỉ là một câu hỏi về băng thông bộ nhớ cho CPU. Cơ sở dữ liệu hình ảnh 1 tỷ là thực tế trên CPU 64 bit (cần RAM 8GB) và các tìm kiếm sẽ không vượt quá 1 giây!

Đối với các hình ảnh được sửa đổi / cắt xén, có vẻ như một tính năng phát hiện điểm / biến đổi điểm bất biến như SIFT là hướng đi. SIFT sẽ tạo ra các điểm chính tốt sẽ phát hiện cắt / xoay / gương, v.v. Tuy nhiên, so sánh mô tả rất chậm so với khoảng cách hãm được sử dụng bởi phash. Đây là một hạn chế lớn. Có rất nhiều so sánh để làm, vì có mô tả IxJxK tối đa so sánh để tra cứu một hình ảnh (I = num haystack hình ảnh, J = điểm chính trên mỗi hình ảnh haystack, K = điểm chính trên mỗi hình ảnh kim).

Để giải quyết vấn đề tốc độ, tôi đã thử sử dụng phash xung quanh từng điểm chính được tìm thấy, sử dụng kích thước / bán kính tính năng để xác định hình chữ nhật phụ. Mẹo để làm cho điều này hoạt động tốt, là tăng / thu nhỏ bán kính để tạo các mức độ trực tràng khác nhau (trên hình ảnh kim). Thông thường, cấp độ đầu tiên (không được tính) sẽ phù hợp tuy nhiên thường phải mất thêm một vài lần nữa. Tôi không chắc chắn 100% lý do tại sao điều này hoạt động, nhưng tôi có thể tưởng tượng nó cho phép các tính năng quá nhỏ để phash hoạt động (phash chia tỷ lệ hình ảnh xuống còn 32x32).

Một vấn đề khác là SIFT sẽ không phân phối các điểm chính một cách tối ưu. Nếu có một phần của hình ảnh có nhiều cạnh, các điểm chính sẽ co cụm ở đó và bạn sẽ không nhận được bất kỳ phần nào trong khu vực khác. Tôi đang sử dụng GridAdaptedFeatureDetector trong OpenCV để cải thiện việc phân phối. Không chắc chắn kích thước lưới nào là tốt nhất, tôi đang sử dụng một lưới nhỏ (1x3 hoặc 3x1 tùy theo hướng hình ảnh).

Bạn có thể muốn chia tỷ lệ tất cả các hình ảnh haystack (và kim) thành kích thước nhỏ hơn trước khi phát hiện tính năng (Tôi sử dụng 210px dọc theo kích thước tối đa). Điều này sẽ làm giảm nhiễu trong hình ảnh (luôn là vấn đề đối với thuật toán thị giác máy tính), cũng sẽ tập trung máy dò vào các tính năng nổi bật hơn.

Đối với hình ảnh của mọi người, bạn có thể thử phát hiện khuôn mặt và sử dụng nó để xác định kích thước hình ảnh theo tỷ lệ và kích thước lưới (ví dụ: khuôn mặt lớn nhất được chia tỷ lệ là 100px). Trình phát hiện tính năng chiếm nhiều cấp độ tỷ lệ (sử dụng kim tự tháp) nhưng có giới hạn đối với số lượng cấp độ sẽ sử dụng (tất nhiên điều này có thể điều chỉnh được).

Trình phát hiện keypoint có thể hoạt động tốt nhất khi nó trả về ít hơn số lượng tính năng bạn muốn. Ví dụ: nếu bạn yêu cầu 400 và nhận lại 300, điều đó thật tốt. Nếu bạn nhận được 400 trở lại mỗi lần, có lẽ một số tính năng tốt đã bị bỏ qua.

Hình ảnh kim có thể có ít điểm chính hơn hình ảnh haystack và vẫn nhận được kết quả tốt. Thêm nhiều hơn không nhất thiết giúp bạn có được lợi nhuận khổng lồ, ví dụ với J = 400 và K = 40 tỷ lệ trúng của tôi là khoảng 92%. Với J = 400 và K = 400, tỷ lệ trúng chỉ tăng lên 96%.

Chúng ta có thể tận dụng tốc độ cực cao của chức năng hamming để giải quyết tỷ lệ, xoay, phản chiếu, v.v ... Có thể sử dụng kỹ thuật nhiều đường chuyền. Trên mỗi lần lặp, chuyển đổi các hình chữ nhật phụ, băm lại và chạy lại chức năng tìm kiếm.


8

Như cartman đã chỉ ra, bạn có thể sử dụng bất kỳ loại giá trị băm nào để tìm các bản sao chính xác.

Một điểm khởi đầu để tìm hình ảnh gần gũi có thể ở đây . Đây là một công cụ được các công ty CG sử dụng để kiểm tra xem các hình ảnh được tân trang có còn hiển thị về cơ bản cùng một cảnh không.


7

Tôi có một ý tưởng, có thể làm việc và nó rất có thể sẽ rất nhanh. Bạn có thể lấy mẫu phụ một hình ảnh để nói độ phân giải 80x60 hoặc có thể so sánh, và chuyển đổi nó sang thang màu xám (sau khi lấy mẫu con sẽ nhanh hơn). Xử lý cả hai hình ảnh bạn muốn so sánh. Sau đó chạy tổng bình phương của sự khác biệt bình phương giữa hai hình ảnh (hình ảnh truy vấn và mỗi hình từ db) hoặc thậm chí tốt hơn Tương quan chéo bình thường hóa tốt hơn, cho phản hồi gần hơn với 1, nếu cả hai hình ảnh đều giống nhau. Sau đó, nếu hình ảnh tương tự bạn có thể tiến hành các kỹ thuật phức tạp hơn để xác minh rằng đó là hình ảnh tương tự. Rõ ràng thuật toán này là tuyến tính về số lượng hình ảnh trong cơ sở dữ liệu của bạn, vì vậy mặc dù nó sẽ rất nhanh lên tới 10000 hình ảnh mỗi giây trên phần cứng hiện đại. Nếu bạn cần bất biến để xoay, thì độ dốc chiếm ưu thế có thể được tính cho hình ảnh nhỏ này, và sau đó toàn bộ hệ tọa độ có thể được xoay theo hướng chính tắc, tuy nhiên, điều này sẽ chậm hơn. Và không, không có bất biến để mở rộng quy mô ở đây.

Nếu bạn muốn một cái gì đó tổng quát hơn hoặc sử dụng cơ sở dữ liệu lớn (hàng triệu hình ảnh), thì bạn cần xem xét lý thuyết truy xuất hình ảnh (vô số bài báo xuất hiện trong 5 năm qua). Có một số gợi ý trong câu trả lời khác. Nhưng nó có thể là quá mức cần thiết, và phương pháp biểu đồ đề xuất sẽ thực hiện công việc. Mặc dù tôi sẽ nghĩ rằng sự kết hợp của nhiều cách tiếp cận nhanh khác nhau sẽ còn tốt hơn nữa.


7

Công ty tôi có khoảng 24 triệu hình ảnh đến từ các nhà sản xuất mỗi tháng. Tôi đang tìm kiếm một giải pháp nhanh chóng để đảm bảo rằng những hình ảnh chúng tôi tải lên danh mục của chúng tôi là mới hình ảnh .

Tôi muốn nói rằng tôi đã tìm kiếm trên internet rất xa để cố gắng tìm một giải pháp lý tưởng. Tôi thậm chí đã phát triển thuật toán phát hiện cạnh của riêng tôi.
Tôi đã đánh giá tốc độ và độ chính xác của nhiều mô hình. Hình ảnh của tôi, có nền trắng, hoạt động rất tốt với phashing. Giống như redcalx nói, tôi khuyên bạn nên dùng phash hoặc ahash. KHÔNG sử dụng Băm MD5 hoặc bất kỳ băm mật mã nào khác. Trừ khi, bạn chỉ muốn chính xác hình ảnh phù hợp. Bất kỳ thay đổi kích thước hoặc thao tác xảy ra giữa các hình ảnh sẽ mang lại một hàm băm khác nhau.

Đối với phash / ahash, hãy kiểm tra điều này: imagehash

Tôi muốn mở rộng bài đăng của * redcalx bằng cách đăng mã và độ chính xác của tôi.

Những gì tôi làm:

from PIL import Image
from PIL import ImageFilter
import imagehash

img1=Image.open(r"C:\yourlocation")
img2=Image.open(r"C:\yourlocation")
if img1.width<img2.width:
    img2=img2.resize((img1.width,img1.height))
else:
    img1=img1.resize((img2.width,img2.height))
img1=img1.filter(ImageFilter.BoxBlur(radius=3))
img2=img2.filter(ImageFilter.BoxBlur(radius=3))
phashvalue=imagehash.phash(img1)-imagehash.phash(img2)
ahashvalue=imagehash.average_hash(img1)-imagehash.average_hash(img2)
totalaccuracy=phashvalue+ahashvalue

Đây là một số kết quả của tôi:

item1  item2  totalsimilarity
desk1  desk1       3
desk1  phone1     22
chair1 desk1      17
phone1 chair1     34

Hi vọng điêu nay co ich!


6

Tôi tin rằng việc giảm kích thước của hình ảnh xuống kích thước gần như biểu tượng, giả sử 48x48, sau đó chuyển đổi sang thang độ xám, sau đó lấy sự khác biệt giữa các pixel hoặc Delta, sẽ hoạt động tốt. Vì chúng tôi đang so sánh sự thay đổi của màu pixel, thay vì màu pixel thực tế, sẽ không có vấn đề gì nếu hình ảnh sáng hơn hoặc tối hơn một chút. Những thay đổi lớn sẽ quan trọng vì các pixel quá sáng / tối sẽ bị mất. Bạn có thể áp dụng điều này trên một hàng hoặc bao nhiêu tùy thích để tăng độ chính xác. Nhiều nhất bạn sẽ có 47x47 = 2.209 phép trừ để tạo thành Khóa tương đương.


3

Chọn 100 điểm ngẫu nhiên có thể có nghĩa là các hình ảnh tương tự (hoặc đôi khi thậm chí không giống nhau) sẽ được đánh dấu là giống nhau, mà tôi cho rằng không phải là những gì bạn muốn. Băm MD5 sẽ không hoạt động nếu hình ảnh có các định dạng khác nhau (png, jpeg, v.v.), có kích thước khác nhau hoặc có siêu dữ liệu khác nhau. Giảm tất cả hình ảnh xuống kích thước nhỏ hơn là một cách tốt, thực hiện so sánh pixel cho pixel không mất quá lâu miễn là bạn đang sử dụng thư viện hình ảnh tốt / ngôn ngữ nhanh và kích thước đủ nhỏ.

Bạn có thể thử làm cho chúng nhỏ xíu, sau đó nếu chúng giống nhau thực hiện một so sánh khác trên kích thước lớn hơn - có thể là sự kết hợp tốt giữa tốc độ và độ chính xác ...


Nếu bạn đang tìm kiếm các bản sao chính xác nhưng với các định dạng / siêu dữ liệu khác nhau, bạn có thể thực hiện băm (ví dụ MD5) của các giá trị pixel thực tế. Imagemagick gọi đây là chữ ký (không liên quan đến ký mã hóa). Trước tiên, bạn cũng có thể giảm nó, ví dụ như cắt bớt 4 bit cho mỗi pixel để giảm tác động của các tạo phẩm JPEG hoặc chuyển đổi sang thang độ xám để phù hợp với hình ảnh hơi bị đổi màu.
Rena

2

Nếu bạn có số lượng lớn hình ảnh, hãy nhìn vào bộ lọc Bloom , sử dụng nhiều giá trị băm để có kết quả xác suất nhưng hiệu quả. Nếu số lượng hình ảnh không lớn, thì một hàm băm mật mã như md5 là đủ.


Vì vậy (cố gắng hiểu bộ lọc Bloom) - điều đó có nghĩa là bạn chọn các điểm pixel ngẫu nhiên trên ảnh cơ sở, lấy ngẫu nhiên một giá trị đỏ / lục / lam của pixel - sau đó so sánh với ảnh mới? và sau đó sử dụng mức xác suất (khớp 90%) để xác định hai hình ảnh giống nhau như thế nào?
cỏ

5
Đây không phải là kiểm tra tương tự, đó là kiểm tra tương đương. Nếu bạn cần sự tương đồng, thì băm không phải là phương pháp đúng. Ý tưởng đằng sau Bloom là sử dụng nhiều thuật toán băm để tăng khả năng nhận dạng duy nhất. Chọn các điểm ngẫu nhiên không phải là cách tiếp cận tốt nhất cho thuật toán băm vì nó sẽ mang lại kết quả khác nhau mỗi lần.
jdigital
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.