Это беспокоило меня в выходные: какой хороший способ решить те, где Уолдо? Загадки [ '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"]
(Уолдо у кассы):
image-processing
wolfram-mathematica
Арно Бузинг
источник
источник
Ответы:
Я нашел Уолдо!
Как я это сделал
Во-первых, я отфильтровываю все цвета, которые не красные
Затем я вычисляю соотношение этого изображения с простым черно-белым рисунком, чтобы найти красные и белые переходы в рубашке.
Я использую,
Binarize
чтобы выделить пиксели на изображении с достаточно высокой корреляцией и нарисовать белый круг вокруг них, чтобы подчеркнуть их, используяDilation
Пришлось немного поиграться с уровнем. Если уровень слишком высок, выявляется слишком много ложных срабатываний.
Наконец, я комбинирую этот результат с исходным изображением, чтобы получить результат выше
источник
WhereIsWaldo
функцию, поскольку это не общее решение. Сама Хайке указала, что нужно пройти уровни, чтобы получить позитив. Чтобы понять, что я имею в виду, попробуйте вашу упакованную функцию как есть."http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg"
С ней сложнее.Я думаю о «пуленепробиваемом способе сделать это» (подумайте, что ЦРУ находит Уолдо на любом спутниковом снимке в любое время, а не на одном изображении без конкурирующих элементов, таких как полосатые рубашки) ... Я бы тренировал машину Больцмана на многих снимках Уолдо - все варианты его сидения, стоя, окклюзии и т. д .; рубашка, шапка, фотоаппарат и все дела. Вам не нужен большой корпус Waldos (может быть, 3-5 будет достаточно), но чем больше, тем лучше.
Это назначит облака вероятностей различным элементам, встречающимся в любом правильном расположении, и затем установит (посредством сегментации), каков средний размер объекта, фрагментирует исходное изображение в ячейки объектов, которые больше всего напоминают отдельных людей (учитывая возможные окклюзии и изменения позы). ), но поскольку картины Уолдо обычно содержат ОДНО людей примерно одинакового масштаба, это должно быть очень простой задачей, а затем подавать эти сегменты предварительно обученной машины Больцмана. Это даст вам вероятность того, что каждый из них будет Уолдо. Возьмите тот, с наибольшей вероятностью.
Именно так сегодня работают OCR, устройства для считывания почтовых индексов и распознавания рукописного текста. По сути, вы знаете, что ответ есть, вы более или менее знаете, как он должен выглядеть, и все остальное может иметь общие элементы, но определенно «не это», так что вы не беспокоитесь о «не это», вы просто посмотрите на вероятность «это» среди всех возможных «это вы уже видели» (например, в ZIP-кодах вы тренируете BM всего 1 с, всего 2 с, только 3 с и т. д., затем кормите каждого введите цифру для каждой машины и выберите ту, которая наиболее надежна. Это работает намного лучше, чем функции обучения всех нейронных сетей.
источник
Я согласен с @GregoryKlopper, что правильным способом решения общей проблемы поиска Уолдо (или любого объекта интереса) в произвольном изображении было бы обучение контролируемого классификатора машинного обучения. Используя множество положительно и отрицательно помеченных примеров, алгоритм, такой как « Машина опорных векторов» , « Усиленный пень решений» или «Машина Больцмана», вероятно, может быть обучен для достижения высокой точности по этой проблеме. Mathematica даже включает эти алгоритмы в свою среду машинного обучения .
Две проблемы с обучением классификатора Уолдо будут:
Быстрый поиск картинок в Google дает хорошие данные - я собираюсь собрать несколько обучающих примеров и написать их прямо сейчас!
Тем не менее, даже подход машинного обучения (или подход, основанный на правилах, предложенный @iND) будет бороться за такой образ, как Земля Вальдос !
источник
Я не знаю Mathematica. , , очень плохо. Но мне нравится ответ выше, по большей части.
Еще есть главный недостаток, полагаясь на полосах только , чтобы подобрать ответ (я лично не имею проблемы с одной ручной настройкой). Существует пример (перечисленный Чемпион Бретт, здесь ) представлено , который показывает , что они, порой, разбивают рисунок рубашки. Так что это становится более сложной моделью.
Я хотел бы попробовать подход формы и цвета, а также пространственные отношения. Подобно распознаванию лиц, вы можете искать геометрические узоры в определенных соотношениях друг от друга. Предостережение заключается в том, что обычно одна или несколько из этих форм закрыты.
Получить баланс белого на изображении и красный красный баланс на изображении. Я считаю, что Уолдо всегда имеет одно и то же значение / оттенок, но изображение может быть отсканированным или плохой копии. Затем всегда обращайтесь к массиву цветов, которыми на самом деле является Уолдо: красный, белый, темно-коричневый, синий, персиковый, {цвет обуви}.
Есть рисунок рубашки, а также брюки, очки, волосы, лицо, обувь и шляпа, которые определяют Уолдо. Кроме того, по отношению к другим людям в изображении, Уолдо на худой стороне.
Итак, найдите случайных людей, чтобы получить рост людей на этой картинке. Измерьте среднюю высоту группы вещей в случайных точках на изображении (простой контур даст довольно много отдельных людей). Если каждая вещь не находится в пределах стандартного отклонения друг от друга, они пока игнорируются. Сравните среднее значение высоты с высотой изображения. Если соотношение слишком велико (например, 1: 2, 1: 4 или аналогично близко), попробуйте еще раз. Запустите его 10 (?) Раз, чтобы убедиться, что все сэмплы довольно близки друг к другу, исключая любое среднее значение, выходящее за пределы стандартного отклонения. Возможно в Mathematica?
Это твой размер Уолдо. Уолсо тощий, поэтому вы ищете что-то 5: 1 или 6: 1 (или что-то еще) ht: wd. Однако этого недостаточно. Если Уолдо частично скрыт, высота может измениться. Итак, вы ищете блок красно-белого цвета, который ~ 2: 1. Но должно быть больше показателей.
Любой из них может подать заявку. Это также негативные проверки против похожих людей на картинке - например, № 2 отрицает ношение красно-белого фартука (слишком близко к обуви), № 5 устраняет светлые волосы. Кроме того, форма является только одним показателем для каждого из этих испытаний. , , один только цвет в пределах указанного расстояния может дать хорошие результаты.
Это сузит области для обработки.
Хранение этих результатов даст набор областей, в которых должен быть Уолдо. Исключите все остальные области (например, для каждой области выберите круг, в два раза превышающий средний размер человека), а затем запустите процесс, который выложил @Heike, удалив все, кроме красного, и так далее.
Есть мысли о том, как это кодировать?
Редактировать:
Мысли о том, как закодировать это. , , исключите все области, кроме красного Уолдо, скелетируйте красные области и обрежьте их до одной точки. Сделайте то же самое для волос Waldo коричневого цвета, брюк Waldo синего цвета, цвета обуви Waldo. Для цвета кожи Уолдо исключите, затем найдите контур.
Затем исключите не красный, расширите (много) все красные области, затем скелетируйте и обрежьте. Эта часть даст список возможных центральных точек Уолдо. Это будет маркер для сравнения всех других цветовых срезов Уолдо.
Отсюда, используя скелетонизированные красные области (не расширенные), подсчитайте линии в каждой области. Если есть правильное число (четыре, верно?), Это, безусловно, возможная область. Если нет, я просто исключаю это (как центр Уолдо ... это все еще может быть его шляпа).
Затем проверьте, есть ли форма лица сверху, точка волос выше, брюки ниже, ботинки внизу и так далее.
Пока нет кода - все еще читаю документы.
источник
У меня есть быстрое решение для поиска Уолдо с использованием OpenCV.
Я использовал функцию сопоставления с шаблоном, доступную в OpenCV, чтобы найти Уолдо.
Для этого нужен шаблон. Поэтому я обрезал Уолдо из исходного изображения и использовал его в качестве шаблона.
Затем я вызвал
cv2.matchTemplate()
функцию вместе с нормализованным коэффициентом корреляции в качестве используемого метода. Он возвратил высокую вероятность в одной области, как показано белым цветом ниже (где-то в верхней левой области):Положение самой высокой вероятной области было найдено с помощью
cv2.minMaxLoc()
функции, которую я затем использовал, чтобы нарисовать прямоугольник, чтобы выделить Уолдо:источник