Как найти Waldo с Mathematica?



это беспокоило меня в выходные: что это хороший способ решить эти где Уолдо? ['Уолли' за пределами Северной Америки] головоломки, используя 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, где это 'works':



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


(Уолдо стоит у кассы):



Mathematica graphic

679   5  

5 ответов:

Я нашел Уолдо!

waldo had been found

как я это сделал

во-первых, я отфильтровываю все цвета, которые не являются красными

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

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

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

Это как OCR, читатели почтового индекса, и strokeless распознавание почерка работают сегодня. В основном вы знаете, что ответ есть, вы знаете более или менее, как он должен выглядеть, и все остальное может иметь общие элементы, но определенно "не это", поэтому вы не беспокоитесь о "не это", вы просто смотрите на вероятность "это" среди всех возможных " это "вы видели раньше" (в почтовых кодах, например, вы бы тренировали BM для только 1С, просто 2С, просто 3с и т. д., затем подавайте каждую цифру на каждую машину и выберите тот, который имеет наибольшую уверенность). Это работает намного лучше, чем одна нейронная сеть, изучающая особенности всех чисел.

Я согласен с @GregoryKlopper, что право способ решения общей проблемы нахождения Уолдо (или любого интересующего объекта) в произвольном изображении состоял бы в обучении контролируемого классификатора машинного обучения. Используя много положительных и отрицательных помеченных примеров, алгоритм, такой как Поддержка Векторной Машины,Форсированное Решение Пень или машина Больцмана может быть обучен для достижения высокой точности по этой проблеме. Mathematica даже включает в себя эти алгоритмы в своем Рамки Машинного Обучения.

две проблемы с обучением классификатора Уолдо были бы:

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

быстрый изображение в Google поиск появляется некоторые хорошие данные - я собираюсь пойти на сбор некоторых учебных примеров и кодирования это прямо сейчас!

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

Я не знаю Mathematica . . . очень плохо. Но мне нравится ответ выше, по большей части.

тем не менее есть большой недостаток в опоре на полосы только чтобы получить ответ (у меня лично нет проблем с один ручная регулировка). Есть пример (перечисленный Бреттом чемпионом,здесь) представленный, который показывает, что они, время от времени, разбивают рисунок рубашки. Тогда это становится более сложной моделью.

Я бы попробовал подход идентификатора формы и цветов, а также пространственных отношений. Подобно распознаванию лиц, вы можете искать геометрические узоры в определенных соотношениях друг от друга. Предостережение заключается в том, что обычно одна или несколько из этих форм закрываются.

получить баланс белого на изображении, и красный красный баланс от изображения. Я считаю, что Waldo всегда имеет одно и то же значение/оттенок, но изображение может быть от сканирования или плохой копии. Тогда всегда ссылайтесь на массив цветов это Уолдо на самом деле: красный, белый, темно-коричневый, синий, персиковый, {цвет обуви}.

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

Итак, найдите случайных людей, чтобы получить высоту людей на этом рисунке. Измерьте среднюю высоту кучки вещей в случайных точках изображения (простой контур произведет довольно много отдельных людей). Если каждая вещь не находится в пределах некоторого стандартного отклонения друг от друга, они пока игнорируются. Сравните среднее значение высоты с высотой изображения. Если соотношение слишком велико (например, 1:2, 1:4 или аналогично близко), повторите попытку. Запустить его 10(?) раз, чтобы убедиться, что образцы все довольно близко друг к другу, исключая любое среднее значение, которое находится за пределами некоторого стандартного отклонения. Возможно в системе Mathematica?

Это ваш размер Waldo. Уолсо тощий, так что вы ищете что-то 5:1 или 6:1 (или что-то еще) ht:wd. Однако, этого недостаточно. Если Уолдо частично скрыт, высота может измениться. Итак, вы ищете блок красно-белых, который ~2:1. Но показателей должно быть больше.

  1. у Уолдо есть очки. Найдите два круга 0,5: 1 над красно-белым.
  2. синие штаны. Любое количество синего цвета одинаковой ширины в пределах любого расстояния между концом красно-белого и расстоянием до его ног. Обратите внимание, что он носит рубашка короткая, так что ноги не слишком близко.
  3. шляпа. Красно-белые на любом расстоянии поднимаются в два раза выше макушки головы. Обратите внимание, что у него должны быть темные волосы ниже, и, вероятно, очки.
  4. длинные рукава. красно-белые под некоторым углом от основного красно-белого.
  5. темные волосы.
  6. цвет обуви. Я не знаю цвета.

любой из них может применяться. Это также отрицательные проверки против подобных людей в pic - например, #2 отрицает ношение красно-белого фартука (слишком близко к обуви), #5 устраняет светлые волосы. Кроме того, форма является только одним индикатором для каждого из этих тестов . . . один цвет в пределах указанного расстояния может дать хорошие результаты.

это сузит области для обработки.

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

есть мысли о том, как это закодировать?


Edit:

мысли о том, как этот код . . . исключить всех областях, но Вальдо красный, скелетируют красной зоны, и подрезать их до одной точки. Сделайте то же самое для волос Waldo коричневый, брюки Waldo синий, цвет обуви Waldo. Для Waldo цвет кожи, исключить, а затем найти контур.

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

отсюда, используя скелетированные красные области (а не расширенные), подсчитайте линии в каждой области. Если есть правильное число (четыре, верно?), это, безусловно, возможная область. Если нет, я думаю, просто исключите его (как центр Вальдо . . . это все еще может быть его шляпа).

затем проверьте, есть ли форма лица выше, точка волос выше, точка брюк ниже, точки обуви ниже и так далее.

пока нет кода -- все еще читаю документы.

у меня есть быстрое решение для поиска Waldo с помощью OpenCV.

я использовал согласование шаблона функция доступна в OpenCV, чтобы найти Waldo.

для этого нужен шаблон. Поэтому я вырезал Уолдо из исходного изображения и использовал его в качестве шаблона.

enter image description here

затем я позвонил

Comments

    Ничего не найдено.