Làm thế nào để tôi tìm thấy Waldo với Mathematica?


1542

Điều này đã làm tôi khó chịu vào cuối tuần: Cách tốt để giải quyết Waldo ở đâu? [ 'Wally' bên ngoài Bắc Mỹ], sử dụng Mathicala (xử lý hình ảnh và các chức năng khác)?

Đây là những gì tôi có cho đến nay, một chức năng làm giảm độ phức tạp thị giác một chút bằng cách làm mờ một số màu không đỏ:

whereIsWaldo[url_] := Module[{waldo, waldo2, waldoMask},
    waldo = Import[url];
    waldo2 = Image[ImageData[
        waldo] /. {{r_, g_, b_} /;
          Not[r > .7 && g < .3 && b < .3] :> {0, 0,
          0}, {r_, g_, b_} /; (r > .7 && g < .3 && b < .3) :> {1, 1,
          1}}];
    waldoMask = Closing[waldo2, 4];
    ImageCompose[waldo, {waldoMask, .5}]
]

Và một ví dụ về URL nơi 'hoạt động' này:

whereIsWaldo["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"]

(Waldo bằng máy tính tiền):

Ảnh gốc

Đồ họa toán học


31
@yoda - trên cùng bên trái, bàn có rất nhiều giày, máy tính tiền và Waldo gần góc bàn.
Arnoud Buzing

8
Là một nghiên cứu sinh về thị giác máy tính, tôi rất muốn đưa ra một phát bắn này ... nhưng tôi phải chống lại. Đối với những gì nó có giá trị tôi muốn đi cho Histogram của Oriented Gradient + trượt cửa sổ SVM, như trong này làm việc rất có ảnh hưởng (cảnh báo: pdf).
dimatura

54
" Wally đâu rồi ." >. <
Các cuộc đua nhẹ nhàng trong quỹ đạo

2
Chúng ta có thể thay đổi câu hỏi để hỗ trợ các ngôn ngữ khác không? Tôi đã nghĩ về việc thực hiện nó với Matlab
Andrey Rubshtein

2
@ArnoudBuzing: Trong câu hỏi của bạn, bạn có thể tìm thấy Waldo bằng cách xem lựa chọn có nhiều màu trắng nhất trong đó. : /
Tamara Wijsman

Câu trả lời:


1640

Tôi đã tìm thấy Waldo!

waldo đã được tìm thấy

Làm thế nào tôi đã làm điều đó

Đầu tiên, tôi đang lọc tất cả các màu không phải màu đỏ

waldo = Import["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"];
red = Fold[ImageSubtract, #[[1]], Rest[#]] &@ColorSeparate[waldo];

Tiếp theo, tôi đang tính toán mối tương quan của hình ảnh này với một mẫu đen trắng đơn giản để tìm ra các hiệu ứng chuyển màu đỏ và trắng trong áo.

corr = ImageCorrelate[red, 
   Image@Join[ConstantArray[1, {2, 4}], ConstantArray[0, {2, 4}]], 
   NormalizedSquaredEuclideanDistance];

Tôi sử dụng Binarizeđể chọn ra các pixel trong ảnh với độ tương quan đủ cao và vẽ vòng tròn trắng xung quanh chúng để nhấn mạnh chúng bằng cách sử dụngDilation

pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];

Tôi đã phải chơi xung quanh một chút với cấp độ. Nếu mức độ quá cao, quá nhiều dương tính giả được chọn ra.

Cuối cùng, tôi kết hợp kết quả này với ảnh gốc để có kết quả như trên

found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]

52
@MikeBantegui Mặc dù giải pháp của Heike rất tuyệt, tôi sẽ không nhanh chóng gói nó vào một WhereIsWaldochức năng, vì nó không phải là một giải pháp chung. Bản thân Heike đã chỉ ra rằng các cấp độ cần được chơi xung quanh trước khi bạn có thể có được sự tích cực. Để xem ý tôi là gì, hãy thử chức năng đóng gói của bạn như trên "http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg"Nó khó hơn với cái này.
abcd

17
Hình ảnh này phức tạp hơn: Waldo . Mặc dù tôi nghĩ rằng việc có thứ gì đó có thể làm nổi bật tiềm năng Waldos vẫn hữu ích (đối với một số định nghĩa về 'hữu ích'.) (Điều này nhắc nhở tôi về một số điều mà iPhoto đôi khi sẽ xác định là khuôn mặt trong bộ sưu tập ảnh của chúng tôi ...)
Nhà vô địch Brett

33
Vui lòng xem bài đăng Meta này: meta.stackexchange.com/questions/116401/ Kẻ
Bill the Lizard

155
Bạn dường như đã hiểu sai các quy tắc của Where's Waldo. Đây rõ ràng là gian lận.
Stefan Kendall

91
Mặc dù đây là một bản hack hay nhưng nó không hoạt động. Nó yêu cầu điều chỉnh thủ công và chỉ hoạt động trên một hình ảnh. Tôi không hiểu tại sao điều này được nâng cao và thậm chí được chọn làm câu trả lời. Nó không khuyến khích bất cứ ai khác thậm chí cố gắng trả lời bằng các phương pháp làm việc tốt hơn.
sam hocevar

144

Tôi đoán theo "cách chống đạn để làm điều này" (nghĩ rằng CIA tìm thấy Waldo trong bất kỳ hình ảnh vệ tinh nào, không chỉ là một hình ảnh mà không có các yếu tố cạnh tranh, như áo sọc) ... Tôi sẽ huấn luyện một máy Boltzmann trên nhiều hình ảnh của Waldo - tất cả các biến thể của anh ta ngồi, đứng, bị chặn, v.v.; áo, mũ, máy ảnh, và tất cả các công trình. Bạn không cần một khối lượng lớn Waldos (có thể 3-5 sẽ là đủ), nhưng càng nhiều càng tốt.

Điều này sẽ gán các đám mây xác suất cho các yếu tố khác nhau xảy ra trong bất kỳ sự sắp xếp chính xác nào, và sau đó thiết lập (thông qua phân đoạn) kích thước đối tượng trung bình là gì, phân chia hình ảnh nguồn vào các ô của các đối tượng giống với từng người nhất (xem xét các thay đổi có thể xảy ra và thay đổi ), nhưng vì các bức ảnh Waldo thường bao gồm RẤT NHIỀU người có cùng tỷ lệ, nên đây là một nhiệm vụ rất dễ dàng, sau đó cung cấp cho các phân đoạn này của máy Boltzmann được đào tạo trước. Nó sẽ cho bạn xác suất mỗi người là Waldo. Lấy một với xác suất cao nhất.

Đây là cách OCR, trình đọc mã ZIP và nhận dạng chữ viết tay hoàn hảo hoạt động ngày nay. Về cơ bản bạn biết câu trả lời là có, bạn biết ít nhiều nó sẽ trông như thế nào và mọi thứ khác có thể có các yếu tố chung, nhưng chắc chắn là "không phải vậy", vì vậy bạn đừng bận tâm với "không phải", bạn chỉ cần nhìn vào khả năng của "nó" trong số tất cả những gì có thể "nó" bạn đã thấy trước đây "(ví dụ, trong mã ZIP, bạn sẽ đào tạo BM chỉ trong 1 giây, chỉ 2 giây, chỉ 3 giây, v.v. chữ số cho mỗi máy và chọn một máy có độ tin cậy cao nhất). Điều này hoạt động tốt hơn nhiều so với một tính năng học tập mạng thần kinh duy nhất của tất cả các số.


13
Không chỉ mạng lưới thần kinh đơn giản là đủ cho điều đó? Bên cạnh đó, bài viết trên wikipedia cho rằng máy Boltzmann không thực tế.
GClaramunt

2
Không cần cố gắng Tôi không chắc chắn, nhưng nếu đủ lớn và đủ phức tạp, một mạng lưới thần kinh phải đủ cho BẤT CỨ LÚC NÀO. Đặc biệt là với tái phát. Các máy Boltzmann làm RẤT RẤT RẤT tốt để nhận ra một tập hợp dữ liệu khá đơn giản với lượng nhiễu lớn trong một biển dữ liệu không giống như chính nó.
Gregory Klopper

14
Mã ZIP được đọc với các máy Boltzmann mọi lúc và độ chính xác của việc gửi thư đã đi qua mái nhà.
Gregory Klopper

47

Tôi đồng ý với @GregoryKlopper rằng cách đúng để giải quyết vấn đề chung về tìm Waldo (hoặc bất kỳ đối tượng quan tâm nào) trong một hình ảnh tùy ý sẽ là đào tạo một bộ phân loại học máy có giám sát. Sử dụng nhiều ví dụ được dán nhãn tích cực và tiêu cực, một thuật toán như Support Vector Machine , Boosted Quyết định hoặc Boltzmann Machine có thể được đào tạo để đạt được độ chính xác cao cho vấn đề này. Mathematica thậm chí bao gồm các thuật toán này trong Khung học máy .

Hai thách thức với việc đào tạo bộ phân loại Waldo sẽ là:

  1. Xác định biến đổi tính năng hình ảnh phù hợp. Đây là nơi câu trả lời của @ Heike sẽ hữu ích: bộ lọc màu đỏ và bộ phát hiện mẫu bị tước (ví dụ: phân tách sóng con hoặc DCT) sẽ là một cách tốt để biến pixel thô thành định dạng mà thuật toán phân loại có thể học được. Việc phân tách dựa trên khối để đánh giá tất cả các phần phụ của hình ảnh cũng sẽ được yêu cầu ... nhưng điều này được thực hiện dễ dàng hơn bởi thực tế là Waldo là một) luôn có cùng kích thước và b) luôn xuất hiện chính xác một lần trong mỗi hình ảnh.
  2. Lấy đủ các ví dụ đào tạo. Các SVM hoạt động tốt nhất với ít nhất 100 ví dụ của mỗi lớp. Các ứng dụng thương mại về tăng cường (ví dụ: lấy nét khuôn mặt trong máy ảnh kỹ thuật số) được đào tạo trên hàng triệu ví dụ tích cực và tiêu cực.

Một tìm kiếm hình ảnh nhanh của Google cho thấy một số dữ liệu tốt - tôi sẽ bắt đầu thu thập một số ví dụ đào tạo và mã hóa nó ngay bây giờ!

Tuy nhiên, ngay cả một phương pháp học máy (hoặc phương pháp dựa trên quy tắc được đề xuất bởi @iND) sẽ đấu tranh cho một hình ảnh như Vùng đất Waldos !


Một hệ thống thị giác máy tính dựa trên máy học cố gắng giải quyết vấn đề "Waldo ở đâu" trong thế giới thực (nghĩa là tìm một người cụ thể trong ảnh đám đông trên Flickr) đã được trình bày tại hội nghị Computer Vision và nhận dạng mẫu vào năm ngoái. Mặc dù vậy, họ gian lận một chút bằng cách thêm một số thông tin vị trí 3D bằng cách sử dụng nhiều ảnh của cùng một cảnh.
Lubar

41

Tôi không biết Mathicala. . . quá tệ. Nhưng tôi thích câu trả lời ở trên, phần lớn.

Vẫn còn một lỗ hổng lớn trong dựa trên các sọc một mình để thu thập câu trả lời (cá nhân tôi không có một vấn đề với một điều chỉnh bằng tay). Có một ví dụ (được liệt kê bởi Brett Champion, ở đây ) được trình bày cho thấy rằng đôi khi họ phá vỡ mẫu áo. Vì vậy, sau đó nó trở thành một mô hình phức tạp hơn.

Tôi sẽ thử một cách tiếp cận về id hình dạng và màu sắc, cùng với các mối quan hệ không gian. Giống như nhận dạng khuôn mặt, bạn có thể tìm kiếm các mẫu hình học ở các tỷ lệ nhất định với nhau. Thông báo trước là thường có một hoặc nhiều hình dạng đó bị che khuất.

Lấy cân bằng trắng trên ảnh và đỏ cân bằng đỏ từ ảnh. Tôi tin rằng Waldo luôn có cùng giá trị / màu sắc, nhưng hình ảnh có thể là từ bản quét hoặc bản sao xấu. Sau đó, luôn luôn đề cập đến một loạt các màu mà Waldo thực sự là: đỏ, trắng, nâu sẫm, xanh dương, hồng đào, {màu giày}.

Có một mẫu áo sơ mi, và cả quần, kính, tóc, mặt, giày và mũ xác định Waldo. Ngoài ra, so với những người khác trong hình ảnh, Waldo là người gầy.

Vì vậy, tìm người ngẫu nhiên để có được chiều cao của người trong bức ảnh này. Đo chiều cao trung bình của một loạt các vật tại các điểm ngẫu nhiên trong ảnh (một phác thảo đơn giản sẽ tạo ra khá nhiều người riêng lẻ). Nếu mỗi thứ không nằm trong một số độ lệch chuẩn so với nhau, chúng sẽ bị bỏ qua ngay bây giờ. So sánh chiều cao trung bình với chiều cao của hình ảnh. Nếu tỷ lệ quá lớn (ví dụ: 1: 2, 1: 4 hoặc đóng tương tự), thì hãy thử lại. Chạy nó 10 (?) Lần để đảm bảo rằng các mẫu đều khá gần nhau, không bao gồm bất kỳ giá trị trung bình nào nằm ngoài một số độ lệch chuẩn. Có thể có trong Mathicala?

Đây là kích thước Waldo của bạn. Walso gầy, vì vậy bạn đang tìm kiếm thứ gì đó 5: 1 hoặc 6: 1 (hoặc bất cứ điều gì) ht: wd. Tuy nhiên, điều này là không đủ. Nếu Waldo bị ẩn một phần, chiều cao có thể thay đổi. Vì vậy, bạn đang tìm kiếm một khối màu đỏ-trắng ~ 2: 1. Nhưng phải có nhiều chỉ số hơn.

  1. Waldo có kính. Tìm kiếm hai vòng tròn 0,5: 1 phía trên màu đỏ-trắng.
  2. Quần dài màu xanh dương. Bất kỳ lượng màu xanh nào có cùng chiều rộng trong bất kỳ khoảng cách nào giữa điểm cuối của màu đỏ-trắng và khoảng cách đến chân anh ta. Lưu ý rằng anh ấy mặc áo sơ mi ngắn, vì vậy bàn chân không quá gần.
  3. Cái mũ. Đỏ trắng bất kỳ khoảng cách lên đến hai lần đỉnh đầu. Lưu ý rằng nó phải có mái tóc sẫm màu bên dưới, và có lẽ là kính.
  4. Áo dài tay. đỏ-trắng ở một số góc từ màu đỏ-trắng chính.
  5. Tóc đen.
  6. Màu giày. Tôi không biết màu sắc.

Bất kỳ trong số đó có thể áp dụng. Đây cũng là những kiểm tra tiêu cực đối với những người tương tự trong ảnh - ví dụ: # 2 phủ nhận việc đeo tạp dề trắng đỏ (quá gần giày), # 5 loại bỏ tóc sáng màu. Ngoài ra, hình dạng chỉ là một chỉ số cho mỗi thử nghiệm này. . . màu sắc một mình trong khoảng cách chỉ định có thể cho kết quả tốt.

Điều này sẽ thu hẹp các khu vực để xử lý.

Lưu trữ các kết quả này sẽ tạo ra một tập hợp các khu vực nên có Waldo trong đó. Loại trừ tất cả các khu vực khác (ví dụ: đối với từng khu vực, chọn một vòng tròn lớn gấp đôi kích thước người trung bình), sau đó chạy quy trình mà @Heike đặt ra với việc loại bỏ tất cả trừ màu đỏ, v.v.

Bất kỳ suy nghĩ về cách mã này?


Biên tập:

Suy nghĩ về cách mã này. . . loại trừ tất cả các khu vực trừ Waldo màu đỏ, khung xương các khu vực màu đỏ và cắt tỉa chúng xuống một điểm. Làm tương tự cho tóc Waldo màu nâu, quần Waldo màu xanh, màu giày Waldo. Đối với màu da Waldo, loại trừ, sau đó tìm phác thảo.

Tiếp theo, loại trừ không đỏ, giãn (rất nhiều) tất cả các khu vực màu đỏ, sau đó khung xương và cắt tỉa. Phần này sẽ đưa ra một danh sách các điểm trung tâm Waldo có thể. Đây sẽ là điểm đánh dấu để so sánh tất cả các phần màu Waldo khác.

Từ đây, sử dụng các vùng màu đỏ có khung (không phải vùng bị giãn), đếm các đường trong mỗi khu vực. Nếu có số chính xác (bốn, phải không?), Đây chắc chắn là một khu vực có thể. Nếu không, tôi đoán chỉ loại trừ nó (như là một trung tâm Waldo .. Nó vẫn có thể là mũ của anh ấy).

Sau đó kiểm tra xem có hình dạng khuôn mặt nào ở trên không, điểm tóc phía trên, điểm quần bên dưới, điểm giày bên dưới, v.v.

Chưa có mã nào - vẫn đang đọc tài liệu.


8
Có lẽ bạn có thể hiển thị một bằng chứng về khái niệm trong bất kỳ hệ thống / ngôn ngữ nào bạn quen thuộc. Điều này cũng sẽ mang lại cho bạn cảm giác về những khó khăn có thể xảy ra.
Szabolcs

1
Ồ, tôi chỉ đang tận hưởng thử thách khi nó đứng. Nó cho tôi một cái gì đó để làm giữa những lần đi dạo trên bãi biển và mặc quần áo cho bữa tối.
IND

1
Vì thế. . . Tại sao các downvote? Điều này khác với câu trả lời đầu cơ khác ở đây như thế nào? Đây có phải là một gợi ý rằng câu hỏi này nên được thực hiện nghiêm túc hơn? Hay chỉ là tôi nên có vẻ nghiêm trọng hơn trong cuộc điều tra của mình? Là cách tiếp cận của tôi thực sự sai?
IND

3
Tôi đã không đánh giá thấp bạn và tôi không nghĩ rằng downvote là phù hợp cho những nỗ lực trung thực để trả lời (trừ khi họ đưa ra thông tin sai lệch). Lý do có thể xảy ra nhất đối với các downvote là bạn dường như chưa thử phương pháp tiếp cận (nghe có vẻ khá phức tạp) và việc tìm ra một giải pháp tốt có thể sẽ có một lượng thử nghiệm thực tế và loại bỏ nhiều ý tưởng. Câu trả lời đầu cơ khác cho thấy một phương pháp chung (như một điểm khởi đầu) đã được sử dụng trong quá khứ cho các vấn đề tương tự, và có một lượng tài liệu tốt về nó. Chỉ cố gắng giải thích những gì đã xảy ra.
Szabolcs

Cảm ơn đã giải thích. Tôi đoán tôi không tập trung vào lịch sử của các ý tưởng.
IND

2

Tôi có một giải pháp nhanh chóng để tìm Waldo bằng OpenCV.

Tôi đã sử dụng chức năng khớp mẫu có sẵn trong OpenCV để tìm Waldo.

Để làm điều này một mẫu là cần thiết. Vì vậy, tôi đã cắt Waldo từ hình ảnh gốc và sử dụng nó làm mẫu.

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

Tiếp theo tôi gọi cv2.matchTemplate()hàm cùng với hệ số tương quan chuẩn hóa là phương thức được sử dụng. Nó trả về xác suất cao ở một vùng duy nhất như được hiển thị màu trắng bên dưới (ở đâu đó ở vùng trên cùng bên trái):

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

Vị trí của vùng có thể xảy ra cao nhất được tìm thấy bằng cách sử dụng cv2.minMaxLoc()hàm, sau đó tôi đã sử dụng để vẽ hình chữ nhật để làm nổi bật Waldo:

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


7
Đang cố gắng giải quyết các câu hỏi xử lý hình ảnh nổi tiếng nhất của SO? ;) Giải pháp của bạn rất hay và dễ dàng nhưng a / chỉ hoạt động cho hình ảnh cụ thể này và b / cần hình ảnh chính xác của Waldo mà bạn muốn tìm trước đó, trong khi tôi nghĩ rằng câu hỏi là tìm bất kỳ Waldo nào trong bất kỳ "hình ảnh Waldo nào" bạn sẽ chơi trò chơi bình thường: mà không biết anh ấy trông như thế nào trước đó. Câu hỏi này dù sao cũng rất nhiều niềm vui
Soltius

@Solitus ha chính xác !!! Tôi đã làm việc nó chỉ cho hình ảnh này nói riêng. Làm việc cho các hình ảnh khác nhau sẽ là một thách thức mặc dù !!
Jeru Luke
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.