Câu hỏi Làm thế nào để tìm Waldo với Mathematica?


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

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

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ề một URL nơi 'hoạt động' này:

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

(Waldo là do máy tính tiền):

Mathematica graphic


1511
2017-12-12 18:29


gốc


Bây giờ tôi cần chơi một trò chơi "Máy tính tiền ở đâu?" ... - abcd
@yoda - trên cùng bên trái, bàn với rất nhiều đôi giày, một máy tính tiền và Waldo gần góc bàn. - Arnoud Buzing
Đề xuất toán học đã bị đóng vì nhiều lý do khác nhau, tuy nhiên chúng cho phép chúng ta xem liệu chúng ta có thể làm cho nó hoạt động hay không bằng cách tạo ra một cái mới. Chúng tôi muốn sự giúp đỡ của bạn, nếu bạn muốn. - rcollyer
Là một sinh viên tiến sĩ về tầm nhìn máy tính, tôi rất muốn đưa ra một phát bắn ... nhưng tôi phải chống cự. Đối với những gì nó có giá trị tôi muốn đi cho Histogram của Gradented định hướng + cửa sổ trượt SVM, như trong điều này tác phẩm rất có ảnh hưởng (cảnh báo: pdf). - dimatura
"Ở đâu Wally. ">. < - Lightness Races in Orbit


Các câu trả lời:


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

waldo had been found

Tôi đã thực hiện nó như thế nào

Đầu tiên, tôi lọc ra 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 tính toán sự tương quan của hình ảnh này với một mẫu màu đen và trắng đơn giản để tìm các chuyển tiếp 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 các pixel trong hình ảnh có tương quan đủ cao và vẽ vòng tròn màu trắng xung quanh chúng để nhấn mạnh chúng bằng cách sử dụng Dilation

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

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

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

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

1624
2017-12-12 19:32



@MikeBantegui Trong khi giải pháp của Heike là tuyệt vời, tôi sẽ không quá nhanh để gói nó vào một WhereIsWaldo chứ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 phải được chơi xung quanh với trước khi bạn có thể nhận được một tích cực. Để xem ý tôi là gì, hãy thử chức năng đóng gói của bạn như đang bật "http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg" Nó khó hơn với cái này. - abcd
Hình ảnh này phức tạp hơn: Waldo. Mặc dù vậy, tôi nghĩ rằng có thứ gì đó có thể làm nổi bật tiềm năng của Waldos vẫn hữu ích (cho một số định nghĩa 'hữu ích'.) (Điều này nhắc tôi về một số thứ mà iPhoto đôi khi sẽ nhận diện như một bộ mặt trong bộ sưu tập ảnh của chúng tôi ...) - Brett Champion
Vui lòng xem bài đăng Meta này: meta.stackexchange.com/questions/116401/… - Bill the Lizard
Bạn dường như đã hiểu lầm các quy tắc của Waldo ở đâu. Đây là thông suốt gian lận. - Stefan Kendall
Trong khi đây là một hack tốt đẹp, nó chỉ 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 upvoted và thậm chí được chọn là một 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 với các phương pháp làm việc tốt hơn. - sam hocevar


Tôi đoán tại một "cách chống đạn để làm điều này" (nghĩ CIA tìm Waldo trong bất kỳ hình ảnh vệ tinh nào, không chỉ là một hình ảnh đơn lẻ mà không có các yếu tố cạnh tranh, như áo sơ mi sọc) ... Tôi sẽ đào tạo Máy Boltzmann trên nhiều hình ảnh của Waldo - tất cả các biến thể của anh ấy ngồi, đứng, bị che khuất, vv; áo sơ mi, mũ, máy ảnh và tất cả các công trình. Bạn không cần một kho chứa lớn của 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 phần tử khác nhau xảy ra trong bất kỳ 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 đoạn hình ảnh nguồn thành các ô của đối tượng giống với cá nhân nhất định. ), nhưng kể từ khi hình ảnh Waldo thường bao gồm rất nhiều người ở cùng một quy mô, điều này nên là một nhiệm vụ rất dễ dàng, sau đó ăn các phân đoạn của máy Boltzmann được đào tạo trước. Nó sẽ cho bạn xác suất của 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à công việc nhận dạng chữ viết tay không cần thiết hiện nay. Về cơ bản bạn biết câu trả lời là có, bạn biết nhiều hơn hoặc ít hơn những gì nó sẽ như thế nào, và mọi thứ khác có thể có các yếu tố phổ biến, nhưng chắc chắn là "không phải nó", vì vậy bạn không bận tâm với "không phải nó" s, bạn chỉ cần nhìn vào khả năng "nó" trong số tất cả có thể "nó" bạn đã thấy trước đây "(trong mã ZIP ví dụ, bạn sẽ đào tạo BM chỉ 1s, chỉ 2s, chỉ 3s, v.v., sau đó cho mỗi chữ số cho mỗi máy, và chọn một trong số đó có sự tự tin nhất) Điều này hoạt động tốt hơn rất 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ố.


140
2017-12-12 20:25



Không phải chỉ là mạng lưới thần kinh đơn giản đủ cho điều đó? Bên cạnh đó, bài viết wikipedia tuyên bố rằng các máy Boltzmann không thực tế. - GClaramunt
Nếu không 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ứ điều gì. Đặc biệt là với tiền tệ. Các máy Boltzmann làm RẤT RẤT rất tốt để nhận ra một bộ 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
Mã ZIP được đọc với 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


Tôi đồng ý với @GregoryKlopper rằng đúng cách để giải quyết vấn đề chung của việc tìm kiế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à huấn luyện một máy phân loại học được giám sát. Sử dụng nhiều ví dụ được gắn nhãn tích cực và tiêu cực, một thuật toán như Hỗ trợ máy Vector, Boosted Decision Stump hoặc Máy Boltzmann có thể được huấn luyện để đạt được độ chính xác cao về vấn đề này. Mathematica thậm chí còn bao gồm các thuật toán này Khung học máy.

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

  1. Xác định biến đổi tính năng hình ảnh đúng. Đây là nơi mà câu trả lời của @ Heike hữu ích: bộ lọc màu đỏ và trình dò ​​mẫu bị tước bỏ (ví dụ: phân tách wavelet hoặc DCT) sẽ là một cách tốt để biến các pixel thô thành định dạng mà thuật toán phân loại có thể học hỏi được. Một phân đoạn dựa trên khối đánh giá tất cả các phần 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à a) luôn có cùng kích thước và b) luôn hiển thị chính xác một lần trong mỗi hình ảnh.
  2. Lấy đủ các ví dụ đào tạo. SVM hoạt động tốt nhất với ít nhất 100 ví dụ về mỗi lớp. Các ứng dụng thương mại thúc đẩy (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 cách nhanh chóng Tìm kiếm hình ảnh của Google quay lên một số dữ liệu tốt - Tôi sẽ đi thu thập một số ví dụ đào tạo và viết mã này ngay bây giờ!

Tuy nhiên, ngay cả một cách tiếp cận 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 của Waldos!


46
2018-04-01 01:23



Một hệ thống thị giác máy tính dựa trên máy học tập cố gắng giải quyết vấn đề "Waldo ở đâu" trong thế giới thực (ví dụ, 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à Pattern Recognition năm ngoái. Họ lừa gạt 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
cs.washington.edu/homes/rahul/data/WheresWaldo.html - lubar
Upvote. Tôi nghĩ rằng wavelet quá khi tôi đọc này. - davec


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

Tuy nhiên có một lỗ hổng lớn trong việc dựa vào các sọc một mình để thu thập câu trả lời (cá nhân tôi không có vấn đề gì với một điều chỉnh thủ công). Có một ví dụ (được liệt kê bởi Brett Champion, đây) trình bày trong đó cho thấy rằng họ, đôi khi, phá vỡ các mẫu áo sơ mi. Vì vậy, 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 của 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 từ nhau. Thông báo trước là thường có một hoặc nhiều hình dạng đó bị tắc nghẽn.

Lấy số dư màu trắng trên hình ảnh và tô đỏ một số dư đỏ từ hình ả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 tham khảo một loạt các màu sắc mà Waldo thực sự là: đỏ, trắng, nâu đậm, xanh dương, đào, {màu giày}.

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

Vì vậy, hãy tìm những người ngẫu nhiên để có được chiều cao của những người trong pic này. Đo chiều cao trung bình của một loạt các điều tại các điểm ngẫu nhiên trong hình ảnh (một phác thảo đơn giản sẽ tạo ra một số ít người). Nếu mỗi thứ không nằm trong độ lệch chuẩn nào đó, chúng sẽ bị bỏ qua. So sánh mức trung bình của chiều cao 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 tương tự đóng), sau đó thử lại. Chạy 10 (?) Lần để đảm bảo rằng các mẫu đều gần nhau, không bao gồm bất kỳ giá trị trung bình nào nằm ngoài độ lệch chuẩn. Có thể trong Mathematica?

Đây là kích thước Waldo của bạn. Walso là gầy, vì vậy bạn đang tìm kiếm một cái 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 da trời. Bất kỳ lượng màu xanh nào có cùng độ rộng trong khoảng cách giữa phần cuối của màu đỏ-trắng và khoảng cách đến chân. Lưu ý rằng anh ấy mặc áo sơ mi của mình 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 nào lên đến hai lần đỉnh đầu. Lưu ý rằng nó phải có mái tóc đen bên dưới, và có lẽ là kính.
  4. Áo dài tay. màu đỏ-trắng ở một góc nào đó từ chính màu đỏ-trắng.
  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 pic - ví dụ: # 2 phủ nhận tạp dề màu đỏ-trắng (quá gần giày), # 5 loại bỏ tóc có màu sáng. Ngoài ra, hình dạng chỉ là một chỉ báo cho mỗi thử nghiệm này. . . màu sắc một mình trong khoảng cách quy đị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) và sau đó chạy quá trình @Heike đặt ra bằng cách xóa tất cả trừ màu đỏ, v.v.

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


Chỉnh sửa:

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

Tiếp theo, loại trừ không phải màu đỏ, làm giãn (rất nhiều) tất cả các vùng màu đỏ, sau đó sắp xếp và cắt tỉa. Phần này sẽ đưa ra một danh sách các điểm trung tâm có thể có của Waldo. Đâ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 khoanh vùng (không phải các vùng bị giãn nở), đếm các dòng trong từng khu vực. Nếu có số đúng (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ỉ cần loại trừ nó (như là một trung tâm Waldo ... nó vẫn có thể là mũ của mình).

Sau đó kiểm tra xem có hình dạng khuôn mặt ở 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ã - vẫn đọc tài liệu.


40
2018-01-10 09:36



Có lẽ bạn có thể cho thấy 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ẽ cho bạn cảm giác về những khó khăn có thể xảy ra. - Szabolcs
Ồ, tôi chỉ thích thử thách khi nó đứng. Nó mang lại cho tôi một cái gì đó để làm ở giữa đi bộ trên bãi biển và mặc quần áo cho bữa ăn tối. - iND
Vì thế. . . tại sao các downvotes? Đ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 có vẻ nghiêm túc hơn trong cuộc điều tra của tôi? Cách tiếp cận của tôi có thực sự sai không? - iND
Tôi đã không downvote bạn và tôi không nghĩ rằng downvotes là thích hợp cho những nỗ lực trung thực để trả lời (trừ khi họ cung cấp cho thông tin sai lạc). Lý do có thể xảy ra nhất cho các downvotes là bạn dường như không thử cách tiếp cận (nghe khá phức tạp), và tìm ra một giải pháp tốt có lẽ sẽ có một số lượng tốt thử nghiệm thực tế và loại bỏ nhiều ý tưởng. Câu trả lời đầu cơ khác gợi ý chung phương pháp (như là 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 số lượng tốt của văn học trên đó. Chỉ cần cố gắng giải thích những gì đã xảy ra. - Szabolcs
Cảm ơn lời 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


Tôi có một giải pháp nhanh chóng cho việc tìm kiếm Waldo bằng cách sử dụng OpenCV.

Tôi đã sử dụng đối sánh 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.

enter image description here

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

enter image description here

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() , sau đó tôi sử dụng để vẽ hình chữ nhật để làm nổi bật Waldo:

enter image description here


3
2018-04-11 11:11



Đ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 là tốt đẹp và dễ dàng nhưng 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 bạn muốn tìm trước, trong khi tôi nghĩ câu hỏi là tìm kiếm bất kỳ Waldo nào trong "Hình ảnh Waldo ở đâu" như bạn sẽ chơi trò chơi bình thường: không biết mình trông như thế nào trước đây. Câu hỏi này là rất nhiều niềm vui dù sao đi nữa - Soltius
@Solitus ha chính xác !!! Tôi chỉ làm việc cho hình ảnh này nói riêng. Làm việc nó cho những hình ảnh khác nhau sẽ là một thách thức mặc dù !! - Jeru Luke