Як знайти Waldo з Mathematica?


1542

Це клопіло мене у вихідні: Який хороший спосіб вирішити ті, де Вальдо? [ "Wally" поза межами Північної Америки] головоломки, використовуючи Mathematica (обробка зображень та інші функції)?

Ось що у мене є, функція, яка трохи зменшує візуальну складність, затемнюючи деякі не червоні кольори:

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}]
]

І приклад URL-адреси, де це "працює":

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

(Уолдо за касою):

Оригінальне зображення

Графіка Mathematica


31
@yoda - лівий верхній стіл, стіл з великою кількістю взуття, касовий апарат та Waldo біля кута столу.
Арноуд Бузінг

8
Як аспірант з комп’ютерного зору, я дуже спокусився зробити це, але я повинен чинити опір. Для чого це варто, я хотів би взяти гістограму орієнтованих градієнтів + ​​розсувне вікно SVM, як у цій дуже впливовій роботі (попередження: pdf).
диматура

54

2
Чи можемо ми змінити питання, щоб підтримувати й інші мови? Я думав про те, щоб це зробити з Матлабом
Андрієм Рубштейном

2
@ArnoudBuzing: У вашому запитанні ви можете знайти Вальдо, переглянувши виділення, у яких найбільше білого кольору. : /
Тамара Війсман

Відповіді:


1640

Я знайшов Вальдо!

Вальдо було знайдено

Як я це зробив

По-перше, я фільтрую всі кольори, які не є червоними

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

Далі я обчислюю співвідношення цього зображення з простим чорно-білим малюнком, щоб знайти червоні та білі переходи у сорочці.

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

Я використовую, Binarizeщоб виділити пікселі на зображенні з досить високою кореляцією та намалювати навколо них біле коло, щоб підкреслити їх за допомогоюDilation

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

Мені довелося трохи пограти з рівнем. Якщо рівень занадто високий, вибирається занадто багато помилкових позитивних результатів.

Нарешті я поєдную цей результат з оригінальним зображенням, щоб отримати результат вище

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

52
@MikeBantegui Хоча рішення Хейке чудове, я б не так швидко упакував його у WhereIsWaldoфункцію, оскільки це не загальне рішення. Сама Хейке зазначила, що перед тим, як отримати позитив, потрібно зіграти рівні. Щоб побачити, що я маю на увазі, спробуйте упаковану функцію, як увімкнено "http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg".
abcd

17
Це зображення складніше: Вальдо . Я думаю, що те, що мати щось, що може висвітлити потенційного Waldos, все ще корисно (для деякого визначення поняття «корисне».) (Це нагадує мені про деякі речі, які iPhoto іноді буде ідентифікувати як обличчя в нашій колекції фотографій ...)
Чемпіон Бретта

33
Перегляньте цю публікацію з Meta: meta.stackexchange.com/questions/116401/…
Білл

155
Ви, здається, неправильно зрозуміли правила Де Вальдо. Це явно обман.
Стефан Кендалл

91
Хоча це хороший хак, він просто не працює. Він вимагає ручної настройки та працює лише на одному зображенні. Я не розумію, чому це схвалено і навіть обрано як відповідь. Це відштовхує когось іншого навіть не намагатися відповісти кращими методами роботи.
sam hocevar

144

Я здогадуюсь про "куленепробивний спосіб зробити це" (подумайте, що ЦРУ знайде Уолдо в будь-якому супутниковому знімку будь-коли, а не лише одне зображення без конкуруючих елементів, як смугасті сорочки) ... Я б тренував машину Больцмана на багатьох зображеннях Вальдо - всі варіанти його сидячого, стоячого, оклюзійного тощо; сорочку, шапку, камеру та всі твори. Вам не потрібен великий корпус Вальдоса (можливо, 3-5 буде достатньо), але чим більше, тим краще.

Це присвоїть хмари ймовірностей різним елементам, що виникають у будь-якому правильному розташуванні, а потім встановить (за допомогою сегментації), що таке середній розмір об'єкта, фрагментує вихідне зображення на клітини об'єктів, які найбільше нагадують окремих людей (враховуючи можливі оклюзії та створюють зміни ), але оскільки фотографії Уолдо зазвичай містять багато людей приблизно однакового масштабу, це має бути дуже легким завданням, тоді годуйте ці сегменти заздалегідь підготовленої машини Больцмана. Це дасть вам ймовірність, що кожен з них буде Вальдо. Візьміть одну з найбільшою ймовірністю.

Ось як сьогодні працюють OCR, зчитувачі поштових індексів та безмозкове розпізнавання рукописного тексту. В основному ви знаєте, що відповідь є, ви знаєте більш-менш, як це має виглядати, і все інше, можливо, має спільні елементи, але, безумовно, "не це", так що ви не турбуєтесь з "не так", ви просто подивіться на ймовірність "це" серед усіх можливих "це", що ви бачили раніше "(наприклад, у поштових індексах, ви б тренували БМ всього лише за 1 секунду, всього за 2 секунди, лише за 3 секунди тощо), а потім годувати кожного цифру на кожній машині та виберіть ту, яка має найбільшу впевненість). Це працює набагато краще, ніж одна функція навчання нейронної мережі всіх чисел.


13
Чи недостатньо просто простих нейронних мереж для цього? Крім того, у статті вікіпедії стверджується, що машини Больцмана не практичні.
GClaramunt

2
Без спроб я не впевнений, але якщо досить великий і складний, нейронна мережа повинна бути достатньою для будь-якого. Особливо з рекурсіями. Машини Boltzmann ДУЖЕ ДУЖЕ добре розпізнають досить спрощений набір даних з великою кількістю шуму в морі даних на відміну від себе.
Григорій Клоппер

14
Поштові індекси читаються на машинах Boltzmann весь час, і точність доставки пошти пережила дах.
Григорій Клоппер

47

Я погоджуюся з @GregoryKlopper, що правильним способом вирішити загальну проблему пошуку Вальдо (або будь-якого об'єкта, що цікавить) у довільному зображенні було б підготовка керованого класифікатора машинного навчання. Використовуючи безліч позитивних і негативних прикладів, позначених таким чином, такий алгоритм, як « Машина підтримки підтримки» , « Підвищений рішень» або «Машина Больцмана», можливо, буде навчений для досягнення високої точності цієї проблеми. Математика навіть включає ці алгоритми до своєї структури машинного навчання .

Два виклики під час навчання класифікатора Уолдо будуть:

  1. Визначення правильного перетворення функції зображення. Ось тут відповідь @ Heike була б корисною: червоний фільтр і смугастий детектор візерунка (наприклад, розкладання вейвлет або DCT) були б хорошим способом перетворити необроблені пікселі у формат, з якого можна вивчити алгоритм класифікації. Також потрібна буде блокова декомпозиція, яка оцінює всі підрозділи зображення ... але це полегшується тим, що Уолдо а) завжди приблизно однакового розміру і б) завжди присутній рівно один раз у кожному зображенні.
  2. Отримання достатньої кількості навчальних прикладів. SVM найкраще працюють щонайменше з 100 прикладів кожного класу. Комерційні програми збільшення (наприклад, фокусування обличчя в цифрових камерах) проходять навчання на мільйонах позитивних і негативних прикладів.

Швидкий пошук зображень Google виявляє хороші дані - я зараз збираюся збирати деякі приклади навчання та кодувати це зараз!

Однак навіть підхід до машинного навчання (або підхід, заснований на правилах, запропонований @iND) боротиметься за образ, як Земля Вальдосів !


Система комп'ютерного зору на базі машинного навчання, яка намагається вирішити проблему "Де Вальдо" в реальному світі (тобто пошук конкретної людини у фотографіях натовпу на Flickr), була представлена ​​на конференції Computer Vision and Pattern Recognition минулого року. Вони трохи обманюють, додаючи інформацію про тривимірне місцезнаходження, використовуючи кілька фотографій однієї сцени.
Любар

41

Я не знаю Mathematica. . . занадто погано. Але мені подобається відповідь вище, здебільшого.

Ще є головний недолік, покладаючись на шпальтах тільки , щоб підібрати відповідь (я особисто не маю проблеми з однієї налаштуванням). Наведений приклад (перерахований Бретт Чемпіон, тут ), який показує, що вони часом порушують шаблон сорочки. Тож вона стає більш складною схемою.

Я б спробував підхід форми і кольорів, а також просторові відносини. Наче подібно до розпізнавання облич, ви могли шукати геометричні візерунки в певних співвідношеннях один від одного. Застереження полягає в тому, що зазвичай одна або декілька з цих фігур оклюдовані.

Отримайте баланс білого на зображенні, а червоний - червоний. Я вважаю, що Уолдо - це завжди однакове значення / відтінок, але зображення може бути зі сканування або з поганої копії. Тоді завжди посилайтеся на масив кольорів, якими насправді є Уолдо: червоний, білий, темно-коричневий, синій, персиковий, {колір взуття}.

Є візерунок сорочки, а також штани, окуляри, волосся, обличчя, взуття та шапка, які визначають Уолдо. Також, стосовно інших людей на зображенні, Уолдо стоїть на худій стороні.

Отже, знайдіть випадкових людей, щоб отримати висоту людей на цій фотографії. Виміряйте середню висоту купи речей у випадкових точках на зображенні (простий контур створить досить багато окремих людей). Якщо кожна річ не знаходиться в межах якогось стандартного відхилення один від одного, вони поки що ігноруються. Порівняйте середню висоту з висотою зображення. Якщо коефіцієнт занадто великий (наприклад, 1: 2, 1: 4 або аналогічно близький), спробуйте ще раз. Виконайте це 10 (?) Разів, щоб переконатися, що зразки розташовані досить близько один до одного, виключаючи будь-яке середнє значення, яке знаходиться поза деяким стандартним відхиленням. Можливо в Mathematica?

Це ваш розмір Вальдо. Уолсо худий, тому ви шукаєте щось 5: 1 або 6: 1 (або що завгодно) ht: wd. Однак цього недостатньо. Якщо Вальдо частково прихований, висота може змінитися. Отже, ви шукаєте блок червоно-білих, який ~ 2: 1. Але показників повинно бути більше.

  1. У Вальдо є окуляри. Шукайте два кола 0,5: 1 над червоно-білими.
  2. Сині штани. Будь-яка кількість синього на однаковій ширині на будь-якій відстані між кінцем червоно-білого та відстані до його ніг. Зауважте, що він носить сорочку коротку, тому ноги не надто близько.
  3. Капелюх. Червоно-білі на будь-якій відстані до двічі верхньої частини голови. Зверніть увагу, що воно повинно мати темне волосся внизу, і, ймовірно, окуляри.
  4. Довгі рукави. червоно-білий під деяким кутом від основного червоно-білого.
  5. Темне волосся.
  6. Колір взуття. Я не знаю кольору.

Будь-який із них міг подати заявку. Це також негативні перевірки щодо подібних людей на знімку - наприклад, №2 заперечує одяг червоно-білого фартуха (занадто близько до взуття), №5 усуває волосся світлого кольору. Також форма є лише одним показником для кожного з цих тестів. . . один колір лише на вказаній відстані може дати хороші результати.

Це звузить області для обробки.

Збереження цих результатів дозволить створити набір областей, у яких повинен бути Уолдо. Виключіть усі інші області (наприклад, для кожної області виберіть коло вдвічі більше, ніж середній розмір людини), а потім запустіть процес, який виклав @Heike, видаливши всі, крім червоного, тощо.

Будь-які думки, як це кодувати?


Редагувати:

Думки про те, як це кодувати. . . виключіть усі області, окрім Уолдо червоного, скелетонізуйте червоні ділянки та обріжте їх до однієї точки. Зробіть те ж саме для волосся Waldo коричневі, штани Waldo синій, колір взуття Waldo. Для кольору шкіри Вальдо виключіть, а потім знайдіть контур.

Далі, виключіть не червоні, розшийте (багато) всі червоні ділянки, а потім скелетонізуйте та обріжте. У цій частині подано список можливих балів у центрі Уолдо. Це буде маркером для порівняння всіх інших кольорових розділів Waldo.

Звідси, використовуючи скелетонізовані червоні ділянки (не розширені), підраховуйте лінії у кожній області. Якщо є правильне число (чотири, правда?), Це, безумовно, можлива область. Якщо ні, то, мабуть, просто виключаю це (як центр Вальдо ... це все-таки може бути його капелюх).

Потім перевірте, чи є форма обличчя вгорі, точка волосся вище, штани внизу, точки взуття внизу тощо.

Ще немає коду - досі читайте документи.


8
Можливо, ви можете показати доказ поняття в будь-якій системі / мові, якою ви знайомі. Це також дасть вам відчути, де можуть виникнути труднощі.
Szabolcs,

1
Ой, я просто насолоджуюся викликом, як зараз. Це дає мені щось робити між прогулянками по пляжу та одяганням на вечерю.
iND

1
Тому. . . чому низовини? Чим це відрізняється від інших спекулятивних відповідей? Це припущення, що це питання слід сприймати серйозніше? Або просто, що я повинен виглядати серйозніше у своєму розслідуванні? Чи мій підхід насправді невірний?
iND

3
Я вас не порушив, і я не вважаю, що підручні товари підходять для чесних спроб відповісти (якщо вони не дають дезінформації). Найбільш вірогідною причиною погіршення голосів є те, що ви, здавалося, не випробували підхід (досить складне звучання), а для пошуку хорошого рішення, ймовірно, знадобиться б багато практичних експериментів та виключення багатьох ідей. Інша спекулятивна відповідь пропонує загальний метод (як вихідний пункт), який використовувався в минулому для подібних проблем, і про нього є достатня кількість літератури. Просто намагаюся пояснити, що сталося.
Szabolcs

Дякую за пояснення. Я думаю, я не зосереджуюсь на історії ідей.
iND

2

У мене є швидке рішення для пошуку Вальдо за допомогою OpenCV.

Я використовував функцію відповідності шаблонів, доступну в OpenCV, щоб знайти Waldo.

Для цього потрібен шаблон. Тому я обрізав Вальдо з оригінального зображення і використав його як шаблон.

введіть тут опис зображення

Далі я назвав cv2.matchTemplate()функцію разом із нормованим коефіцієнтом кореляції як використаний метод. Він повернув високу ймовірність для одного регіону, як показано білим кольором внизу (десь у лівій верхній області):

введіть тут опис зображення

Положення найбільш високої ймовірної області було знайдено за допомогою cv2.minMaxLoc()функції, яку я потім використав для малювання прямокутника для виділення Уолдо:

введіть тут опис зображення


7
Ви намагаєтеся вирішити найвідоміші питання щодо обробки зображень SO? ;) Ваше рішення є приємним і простим, але a / працює лише для цього конкретного зображення і b / потребує точного зображення Waldo, яке ви хочете знайти заздалегідь, хоча я думаю, що питання полягав у тому, щоб знайти будь-якого Waldo у будь-якому "Де зображення Waldo" Ви б грали в звичайну гру: не знаючи, як він заздалегідь виглядає. Це питання все одно дуже цікаво
Солтій,

@Solitus ha саме !!! Я працював над цим зображенням зокрема. Робота над різними зображеннями буде проблемою, хоча !!
Jeru Luke
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.