Phát hiện hình ảnh gần trùng lặp [đã đóng]


93

Cách nhanh chóng để sắp xếp một tập hợp các hình ảnh nhất định theo độ tương đồng của chúng với nhau.

Hiện tại, tôi có một hệ thống phân tích biểu đồ giữa hai hình ảnh, nhưng đây là một hoạt động rất tốn kém và có vẻ quá mức cần thiết.

Một cách tối ưu, tôi đang tìm kiếm một thuật toán sẽ cho điểm mỗi hình ảnh (ví dụ: điểm số nguyên, chẳng hạn như Trung bình RGB) và tôi có thể sắp xếp theo điểm đó. Điểm giống hệt nhau hoặc điểm số cạnh nhau có thể trùng lặp.

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994 

RGB Trung bình trên mỗi hình ảnh tệ, có điều gì đó tương tự không?


5
Một câu hỏi quan trọng, suy nghĩ về những gì bạn đã viết và về một số câu trả lời cho câu hỏi liên quan mà Naaff đã chỉ ra, bạn có thể muốn xác định rõ hơn "sự giống nhau" nghĩa là gì. Một hình ảnh giống hệt nhau, nhưng có độ lệch 5 pixel, có "tương tự" không? Rõ ràng là có ... nhưng đối với một thuật toán ... có lẽ là không, trừ khi bạn đã nghĩ ra nó và tính toán nó. Bạn có thể cung cấp thêm bất kỳ chi tiết? Các bản sao là chính xác hay chỉ "đóng"? Bạn đang nhìn vào các bản quét mà chúng có thể khác nhau bằng một thước đo góc nhỏ? Làm thế nào về cường độ? Có rất nhiều biến ở đây ...
Beska

Làm thế nào để 'các bản sao' khác nhau? Ví dụ: chúng có phải là những hình ảnh của cùng một vị trí với tư thế / dịch chuyển khác nhau không? Bạn dường như muốn thứ gì đó là O (nlog (n)) với số lượng hình ảnh. Có ai biết nếu điều này là có thể? Nó có vẻ như nó có thể ..
Justin Scheiner

@ The Unknown: Nếu bạn không hài lòng với bất kỳ câu trả lời nào hiện tại, bạn có thể hướng dẫn thêm cho chúng tôi không? Chúng tôi đã cố gắng hết sức để trả lời câu hỏi của bạn, nhưng nếu không có bất kỳ phản hồi nào, chúng tôi khó có thể nghĩ ra điều gì đó tốt hơn.
Naaff

Đây hiện là một trong những vấn đề lớn chưa được giải quyết trong Khoa học Máy tính. Chúc may mắn bạn thân.
john ktejik

Câu trả lời:


70

Đã có rất nhiều nghiên cứu về các biện pháp tìm kiếm ảnh và độ tương đồng. Đó không phải là một vấn đề dễ dàng. Nói chung, một cái intsẽ không đủ để xác định xem các hình ảnh có giống nhau hay không. Bạn sẽ có tỷ lệ dương tính giả cao.

Tuy nhiên, vì đã có rất nhiều nghiên cứu được thực hiện, bạn có thể xem qua một số trong số đó. Ví dụ, bài báo này (PDF) cung cấp một thuật toán lấy dấu vân tay hình ảnh nhỏ gọn, phù hợp để tìm các hình ảnh trùng lặp một cách nhanh chóng và không cần lưu trữ nhiều dữ liệu. Có vẻ như đây là cách tiếp cận phù hợp nếu bạn muốn một thứ gì đó mạnh mẽ.

Nếu bạn đang tìm kiếm thứ gì đó đơn giản hơn, nhưng chắc chắn hơn, câu hỏi SO này có một vài ý tưởng phù hợp.


2
giấy đó là của năm 2004, không chắc chắn nếu đây vẫn là câu trả lời tốt nhất?
Andrew

50

Tôi khuyên bạn nên xem xét chuyển từ chỉ sử dụng biểu đồ RGB.

Có thể thu được thông tin chi tiết tốt hơn về hình ảnh của bạn nếu bạn chụp một wavelet 2d của hình ảnh (nó dễ hơn rất nhiều so với âm thanh của nó, nó chỉ là rất nhiều giá trị trung bình và một số căn bậc hai được sử dụng để cân các hệ số của bạn) và chỉ giữ lại k lớn nhất các hệ số có trọng số trong wavelet dưới dạng một vectơ thưa thớt, chuẩn hóa nó và lưu lại để giảm kích thước của nó. Bạn nên chia tỷ lệ RG và B bằng cách sử dụng trọng lượng cảm nhận trước ít nhất hoặc tôi khuyên bạn nên chuyển sang YIQ (hoặc YCoCg, để tránh nhiễu lượng tử hóa) để bạn có thể lấy mẫu thông tin sắc độ với mức độ quan trọng giảm.

Bây giờ bạn có thể sử dụng tích số chấm của hai trong số các vectơ chuẩn hóa thưa thớt này làm thước đo độ giống nhau. Các cặp hình ảnh có sản phẩm chấm lớn nhất sẽ có cấu trúc rất giống nhau. Điều này có lợi ích là có khả năng chống thay đổi kích thước, thay đổi màu sắc và đánh dấu nước một chút, đồng thời thực sự dễ thực hiện và nhỏ gọn.

Bạn có thể đánh đổi khả năng lưu trữ và độ chính xác bằng cách tăng hoặc giảm k.

Việc sắp xếp theo một điểm số sẽ trở nên khó khăn đối với loại bài toán phân loại này. Nếu bạn nghĩ về nó, nó sẽ yêu cầu hình ảnh chỉ có thể 'thay đổi' dọc theo một trục, nhưng chúng không. Đây là lý do tại sao bạn cần một vector các đặc trưng. Trong trường hợp Haar wavelet, nó gần như là nơi xảy ra sự gián đoạn sắc nét nhất trong hình ảnh. Bạn có thể tính toán khoảng cách giữa các hình ảnh theo từng cặp, nhưng vì tất cả những gì bạn có là thước đo khoảng cách nên thứ tự tuyến tính không có cách nào để thể hiện một 'tam giác' gồm 3 hình ảnh đều cách xa nhau. (tức là nghĩ về một hình ảnh toàn màu xanh lá cây, một hình ảnh toàn màu đỏ và một hình ảnh toàn màu xanh lam.)

Điều đó có nghĩa là bất kỳ giải pháp thực sự nào cho vấn đề của bạn sẽ cần các phép toán O (n ^ 2) với số lượng hình ảnh bạn có. Trong khi nếu có thể tuyến tính hóa số đo, bạn có thể chỉ yêu cầu O (n log n) hoặc O (n) nếu số đo phù hợp với, chẳng hạn như sắp xếp cơ số. Điều đó nói rằng, bạn không cần phải chi tiêu O (n ^ 2) vì trong thực tế, bạn không cần phải sàng lọc toàn bộ tập hợp, bạn chỉ cần tìm những thứ gần hơn ngưỡng nào đó. Vì vậy, bằng cách áp dụng một trong số các kỹ thuật để phân vùng không gian vectơ thưa thớt của bạn, bạn có thể có được tiệm cận nhanh hơn nhiều cho vấn đề 'tìm ra tôi k trong số các hình ảnh giống nhau hơn một ngưỡng cho trước' hơn là so sánh một cách ngây thơ mọi hình ảnh với mọi hình ảnh, mang lại cho bạn những gì bạn có thể cần ... nếu không chính xác những gì bạn yêu cầu.

Trong mọi trường hợp, tôi đã sử dụng điều này một vài năm trước để tạo hiệu ứng tốt khi cố gắng giảm thiểu số lượng các kết cấu khác nhau mà tôi đang lưu trữ, nhưng cũng có rất nhiều nghiên cứu trong không gian này cho thấy hiệu quả của nó (và trong trường hợp này là so sánh nó sang một dạng phân loại biểu đồ phức tạp hơn):

http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf

Nếu bạn cần độ chính xác cao hơn trong việc phát hiện, các thuật toán minHash và tf-idf có thể được sử dụng với wavelet Haar (hoặc biểu đồ) để xử lý các chỉnh sửa mạnh mẽ hơn:

http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf

Cuối cùng, Stanford có một tìm kiếm hình ảnh dựa trên một biến thể kỳ lạ hơn của loại phương pháp này, dựa trên việc thực hiện nhiều tính năng hơn trong việc trích xuất các tính năng từ các wavelet để tìm các phần hình ảnh được xoay hoặc thu nhỏ, v.v., nhưng điều đó có thể vượt quá khối lượng công việc của bạn. muốn làm.

http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi


Có vẻ như bạn đang gián tiếp mô tả cây kd và những thứ tương tự để tìm kiếm không gian cho các ứng viên tiềm năng. Nó có thể đáng lưu ý điều này.
Boojum

1
Chà, lý do tôi không chỉ rõ các kỹ thuật ngoài kiểu ám chỉ mơ hồ là cây kd hoạt động tốt khi bạn có một số chiều tương đối nhỏ trong không gian của mình. Ở đây, bạn có thể có ~ 128 thứ nguyên trở lên được phổ biến thưa thớt. Vì chúng thưa thớt nên phần lớn các giá trị sẽ bằng 0, vì vậy việc đi vòng qua các kích thước để phân vùng theo kiểu kd thực sự gần như vô ích. Bằng cách tương tự, cây R bị phá vỡ, để lại nhiều khả năng là đặt cược tốt nhất của bạn: cây X. Thật không may, chúng cũng đang ở gần giới hạn hiệu suất của chúng khi đối mặt với nhiều kích thước đó.
Edward KMETT

"và chỉ giữ lại k hệ số có trọng số lớn nhất trong wavelet dưới dạng vectơ thưa thớt," - giữ lại trên mỗi hàng hay cho toàn bộ wavelet?
ivan.ukr

"Bạn nên bán lại RG và B bằng cách sử dụng trọng lượng cảm nhận trước ít nhất hoặc tôi khuyên bạn nên chuyển sang YIQ (hoặc YCoCg, để tránh nhiễu lượng tử hóa) để bạn có thể lấy mẫu thông tin sắc độ với mức độ quan trọng giảm." - và sau đó thì sao? Làm wavelet chỉ cho Y hay làm nó cho tất cả các kênh? Nếu làm cho tất cả các kênh - làm thế nào để đo mức độ giống nhau của hình ảnh với nhiều kênh? thêm các sản phẩm chấm của mỗi kênh và coi đây là biện pháp tương tự hay nên là một số phép cộng có trọng số?
ivan.ukr

15

Tôi đã triển khai một thuật toán rất đáng tin cậy cho điều này được gọi là Truy vấn hình ảnh đa phân giải nhanh . Mã (cổ, không thể nhầm lẫn) của tôi cho điều đó ở đây .

Những gì Truy vấn hình ảnh đa phân giải nhanh thực hiện là chia hình ảnh thành 3 phần dựa trên không gian màu YIQ (tốt hơn để so khớp sự khác biệt so với RGB). Sau đó, hình ảnh về cơ bản được nén bằng thuật toán wavelet cho đến khi chỉ có các đặc điểm nổi bật nhất từ ​​mỗi không gian màu. Những điểm này được lưu trữ trong một cấu trúc dữ liệu. Hình ảnh truy vấn trải qua cùng một quy trình và các tính năng nổi bật trong hình ảnh truy vấn được khớp với các tính năng trong cơ sở dữ liệu được lưu trữ. Càng nhiều trận đấu, các hình ảnh càng có nhiều khả năng giống nhau.

Thuật toán thường được sử dụng cho chức năng "truy vấn bằng phác thảo". Phần mềm của tôi chỉ cho phép nhập hình ảnh truy vấn qua URL nên không có giao diện người dùng. Tuy nhiên, tôi thấy nó hoạt động đặc biệt tốt để khớp các hình thu nhỏ với phiên bản lớn của hình ảnh đó.

Ấn tượng hơn nhiều so với phần mềm của tôi là truy xuất cho phép bạn thử thuật toán FMIQ sử dụng hình ảnh Flickr làm nguồn. Rất tuyệt! Hãy thử qua bản phác thảo hoặc sử dụng hình ảnh nguồn và bạn có thể thấy nó hoạt động tốt như thế nào.


Nó vẫn có thể nhận dạng hình ảnh xoay?
endolith

Tôi nghi ngờ nó sẽ hoạt động rất tốt cho điều đó. Bạn có thể muốn mã hóa các hình ảnh cho mỗi vòng quay để tối đa hóa các kết quả phù hợp.
Luke Francl,

Liên kết đến truy xuất dường như không hoạt động - nó có được lưu trữ ở đâu không?
mmigdol

10

Một bức tranh có nhiều tính năng, vì vậy, trừ khi bạn thu hẹp bản thân thành một, chẳng hạn như độ sáng trung bình, bạn đang xử lý một không gian vấn đề n chiều.

Nếu tôi yêu cầu bạn gán một số nguyên duy nhất cho các thành phố trên thế giới, để tôi có thể biết những thành phố nào gần nhau, kết quả sẽ không tuyệt vời. Ví dụ: bạn có thể chọn múi giờ làm số nguyên duy nhất của mình và nhận được kết quả tốt với các thành phố nhất định. Tuy nhiên, một thành phố gần cực bắc và một thành phố khác gần cực nam cũng có thể ở cùng một múi giờ, mặc dù chúng ở hai đầu đối diện của hành tinh. Nếu tôi cho phép bạn sử dụng hai số nguyên, bạn có thể nhận được kết quả rất tốt với kinh độ và vĩ độ. Vấn đề là giống nhau đối với sự giống nhau về hình ảnh.

Tất cả những gì đã nói, có những thuật toán cố gắng tập hợp các hình ảnh tương tự lại với nhau, đó chính là những gì bạn đang yêu cầu. Đây là những gì sẽ xảy ra khi bạn thực hiện nhận diện khuôn mặt với Picasa. Ngay cả trước khi bạn xác định bất kỳ khuôn mặt nào, nó sẽ nhóm các khuôn mặt tương tự lại với nhau để dễ dàng duyệt qua một tập hợp các khuôn mặt giống nhau và đặt tên cho hầu hết chúng.

Ngoài ra còn có một kỹ thuật được gọi là Phân tích thành phần nguyên tắc, cho phép bạn giảm dữ liệu n chiều xuống bất kỳ số thứ nguyên nào nhỏ hơn. Vì vậy, một bức tranh có n đặc điểm có thể được giảm xuống một đặc điểm. Tuy nhiên, đây vẫn không phải là cách tốt nhất để so sánh các hình ảnh.


1
Đó là một điểm tranh luận, nhưng bạn CÓ THỂ sử dụng một số nguyên duy nhất để đại diện cho sự kết hợp của bất kỳ số lượng đối tượng nào, ví dụ: nếu đối tượng địa lý x = 2 và đối tượng địa lý y = 3 và đối tượng địa lý z = 5 và đối tượng địa lý aa = 7, v.v., thì lũy thừa mà cơ số nguyên tố đó được nâng lên ở dạng thừa số của một số nguyên duy nhất sẽ là giá trị của đặc trưng cho hình ảnh cụ thể đó. Một lần nữa, một điểm tranh luận bởi vì kích thước của con số sẽ là vô lý. Mặc dù kích thước đó có thể được giảm hơn nữa ... chúng ta chỉ đang nói về dữ liệu có cấu trúc.
argyle

Thật. Nhưng điểm thực sự là sắp xếp các con số để các hình ảnh tương tự gần nhau về mặt số học. Bất chấp những gì tôi đã nói ở trên, điều này là có thể. Tóm lại, bạn có thể giải bài toán Nhân viên bán hàng đi du lịch để tìm đường dẫn tối thiểu (hoặc gần tối thiểu) qua các hình ảnh trong không gian n chiều (trong đó n là số lượng đối tượng bạn muốn sử dụng để so sánh các hình ảnh). Nhưng điều đó là tốn kém.
Neil

8

Có một thư viện C ("libphash" - http://phash.org/ ) sẽ tính toán "hàm băm cảm nhận" của một hình ảnh và cho phép bạn phát hiện các hình ảnh tương tự bằng cách so sánh các hàm băm (vì vậy bạn không phải so sánh từng hình ảnh trực tiếp với mọi hình ảnh khác) nhưng tiếc là nó có vẻ không chính xác lắm khi tôi thử.


5

Bạn phải quyết định thế nào là "tương tự". Tương phản? Huế?

Một bức tranh "tương tự" với cùng một bức tranh có bị lộn ngược không?

Tôi cá là bạn có thể tìm thấy rất nhiều "lệnh gọi gần" bằng cách chia hình ảnh thành các mảnh 4x4 và nhận màu trung bình cho mỗi ô lưới. Bạn sẽ có mười sáu điểm cho mỗi hình ảnh. Để đánh giá sự giống nhau, bạn chỉ cần tính tổng bình phương sự khác biệt giữa các hình ảnh.

Tôi không nghĩ rằng một hàm băm duy nhất có ý nghĩa, trừ khi nó chống lại một khái niệm duy nhất như màu sắc, độ sáng hoặc độ tương phản.

Đây là ý tưởng của bạn:

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994

Trước hết, tôi sẽ giả sử đây là các số thập phân là R * (2 ^ 16) + G * (2 ^ 8) + B, hoặc tương tự như vậy. Rõ ràng điều đó là không tốt bởi vì màu đỏ không có trọng số.

Di chuyển vào không gian HSV sẽ tốt hơn. Bạn có thể trải các bit của HSV ra trong băm, hoặc bạn có thể giải quyết H hoặc S hoặc V riêng lẻ, hoặc bạn có thể có ba băm cho mỗi hình ảnh.


Một điều nữa. Nếu bạn đặt trọng lượng R, G và B. Trọng lượng màu xanh lá cây cao nhất, sau đó đến màu đỏ, sau đó là màu xanh lam để phù hợp với độ nhạy thị giác của con người.


5

Trong thời đại của các dịch vụ web, bạn có thể thử http://tineye.com


3
Mã đằng sau tineye dường như là chính xác những gì người hỏi đang theo đuổi, nhưng tôi không nghĩ là một dịch vụ web, nó rất hữu ích, vì không có cách nào (hiển nhiên) để cung cấp cho nó hai hình ảnh và hỏi "những cái này có giống nhau không? " - hình ảnh thứ hai sẽ phải được trên một trang web, và lập chỉ mục của TinEye
DBR

1
Có thể là cung cấp API cho người dùng doanh nghiệp? Họ nên được liên hệ về điều đó.
zproxy

Có một API thương mại cung cấp chính xác services.tineye.com/MatchEngine .
Gajus


1

tôi giả định rằng phần mềm tìm kiếm hình ảnh trùng lặp khác thực hiện FFT trên hình ảnh và lưu trữ các giá trị của các tần số khác nhau dưới dạng vectơ:

Image1 = (u1, u2, u3, ..., un)
Image2 = (v1, v2, v3, ..., vn)

và sau đó, bạn có thể so sánh hai hình ảnh để xem bằng nhau bằng cách tính khoảng cách giữa các vectơ trọng lượng của hai hình ảnh:

distance = Sqrt(
     (u1-v1)^2 +
     (u2-v2)^2 +
     (u2-v3)^2 +
     ...
     (un-vn)^2);

2
Hầu hết các hình ảnh tự nhiên có nội dung tần suất rất giống nhau, vì vậy tôi nghi ngờ rằng đây sẽ là một số liệu rất tốt.
Hannes Ovrén

1

Một giải pháp là thực hiện so sánh RMS / RSS trên mọi cặp ảnh được yêu cầu để thực hiện sắp xếp bong bóng. Thứ hai, bạn có thể thực hiện FFT trên mỗi hình ảnh và thực hiện một số trung bình trục để lấy ra một số nguyên duy nhất cho mỗi hình ảnh mà bạn sẽ sử dụng làm chỉ mục để sắp xếp theo. Bạn có thể cân nhắc thực hiện bất kỳ phép so sánh nào trên phiên bản gốc đã thay đổi kích thước (25%, 10%) tùy thuộc vào mức độ chênh lệch nhỏ mà bạn chọn bỏ qua và mức độ tăng tốc bạn yêu cầu. Hãy cho tôi biết nếu những giải pháp này thú vị và chúng ta có thể thảo luận hoặc tôi có thể cung cấp mã mẫu.


FFT chỉ cung cấp cho bạn thông tin về màu sắc và không có thông tin về vị trí. Thay đổi kích thước bỏ qua tất cả các tính năng dưới một kích thước nhất định bất kể tác động đến hình ảnh kết quả. Hình ảnh màu xám và bàn cờ có thể giống hệt nhau theo thước đo đó. Phương pháp tiếp cận wavelet (Daubechies, Haar, v.v.) có lợi ích là cung cấp cả thông tin vị trí và màu sắc bằng cách đánh đổi tỷ lệ thông tin vị trí và màu sắc trong mỗi điểm dữ liệu.
Edward KMETT

2
Không, FFT của ảnh chứa tất cả thông tin không gian của ảnh gốc. Bạn có thể tạo lại bản gốc từ FFT. homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm Tuy nhiên, một biểu đồ, có thể là những gì bạn đang nghĩ đến, thì không.
Paul

1

Hầu hết các phương pháp tiếp cận hiện đại để phát hiện Phát hiện hình ảnh gần trùng lặp sử dụng tính năng phát hiện điểm thú vị và bộ mô tả mô tả khu vực xung quanh các điểm đó. Thường thì SIFT được sử dụng. Sau đó, bạn có thể phân tích các bộ mô tả và sử dụng các cụm làm từ vựng trực quan.

Vì vậy, nếu chúng ta thấy theo tỷ lệ giữa các từ trực quan phổ biến của hai hình ảnh với tất cả các từ trực quan của những hình ảnh này, bạn sẽ ước tính sự giống nhau giữa các hình ảnh. Có rất nhiều bài báo thú vị. Một trong số đó là Phát hiện hình ảnh gần trùng lặp: minHash và tf-idf Weighting


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.