Я, наконец, получил решение этой проблемы, ниже я сделал это. Ответ @jnovacho очень полезен, и когда я это сделал, я понял, насколько это возможно для экспертов в области компьютерного зрения. Тем не менее, поскольку я сам видел необходимость опубликовать этот вопрос здесь, я подумал, что, возможно, должен дать более подробный ответ.
Во-первых, поскольку вопрос задает проблему плохо, я должен указать, что у меня есть набор серых цилиндров, освещенных из одного источника сверху.Цилиндры могут вращаться, меняться по размеру и перемещаться. Задача состоит в том, чтобы изучить вращение цилиндра, инвариантное к размеру и положению.
0) Образец цилиндра для рукоделия - это тот.
1) Набор двумерных Габоров используется для захвата градиента внутри цилиндра. Чтобы найти правильные параметры Габора, я менял ширину полосы и размер фильтра вручную, пока не было видно, что внутренний градиент обнаружен, а также ребра. На рисунке показан асимметричный Габор слева и две свертки этого точного фильтра с исходным изображением цилиндра. Поскольку свертки накладываются на изображение в градациях серого, видно, что разные ориентации фильтра дают ответы на разных участках цилиндра. Самые сильные ответы на краях, но есть более слабый ответ на внутреннее затенение цилиндра. Этот внутренний градиент - это функция, которую мне нужно извлечь.
2) Теперь, чтобы получить этот затеняющий градиент, я избавлюсь от краев, объединив ответы от 8 ориентаций Габора. В принципе, взятие максимума над всеми восемью свертками на каждом пикселе дает хорошую оценку ребер вокруг этого цилиндра. Однако ребра не совсем то, что нужно, поэтому из этого максимального изображения я создаю битовую маску, чтобы избавиться от них и получить только внутренний градиент. Короче говоря, я порою слабых ответов, чтобы получить только краевое изображение, применить утолщение и закрыть морфологические операции. Затем примените логический И к этому утолщенному краю, а максимальная свертка превращается в черно-белое и, наконец, разрушает его. Результатом является маска патча, приблизительно размер внутреннего градиента цилиндра. Теперь я просто применил эту битовую маску к оригиналу, чтобы получить ответы Gabor только на внутреннее затенение, без информации о краю. На изображении показано слева направо, максимальное вытягивание ответов фильтра, битмаска, построенная с помощью операции с морфологией изображения, описанной выше, и полученный внутренний градиент после применения битовой маски.
3) Теперь, как только градиент затенения находится там, он должен получить функцию, представляющую первоначальную ориентацию, устойчивую к положению и размеру. Кажется, этого достаточно, чтобы усреднить все ответы этого внутреннего градиента, сохраняя при этом первоначальную ориентацию Габора. Таким образом, с 8 ориентациями Габора вектор признаков будет 8-вектором средних ответов во всех точках выборки во внутренней области градиента, извлеченной на предыдущих этапах. Чтобы не учитывать каждое значение одного пикселя, я уменьшаю изображение, беря каждый пятый или пятый. Чтобы эмпирически видеть, что градиент выбран правильно, левое изображение представляет собой векторный график, где каждая стрелка ориентирована в направлении оригинального Габора, и она пропорциональна до тех пор, пока сильный ответ. Таким образом, точки на изображении и, что важно, ребра, показывают реакции с нулевой силой, в то время как стрелки фактически указывают направление градиента. Теперь я могу потенциально принять среднее значение для каждой ориентации для ненулевых значений, поэтому на правильном рисунке показаны гистограммы всех ненулевых ответов по 8 ориентациям для данного цилиндра, где каждая синяя линия является ответом на одном пикселе выборки. Я также приведу пример другого изображения цилиндра, где из открытой внутренней части цилиндра происходит некоторый шум, а площадь градиента, как правило, меньше.
4) Наконец, чтобы получить эту 8-векторную функцию с некоторой инвариантностью по положению и размеру (и, возможно, некоторой интенсивностью освещения), я усредняю для каждой ориентации сумму всех ненулевых ответов по всем не- -зеровые ответы. Эта функция проиллюстрирована красным цветом на той же гистограмме, что и выше, которая была нормализована и взята без отрицательных значений, поскольку они являются симметричными. Я бросил пару других цилиндрических ориентаций, чтобы показать определенную степень инвариантности. Конечная 8-векторная функция находится красным слева от цилиндра.
Наконец, это может быть дано регрессионной модели, которая изучает ориентацию. Однако одной очевидной проблемой является отклоненный градиент вогнутости, который указывает на ориентацию по 3-й оси (одна указана на зрителя, как показано на рисунке @jnovacho). К счастью, это может рассматриваться по-разному в рамках другой проблемы, для которой мне нужна эта функция.
Благодарим вас за полезный комментарий, @jnovacho, я не понимал, что должен делать оси отдельно. С осями Z это понятно, но для X, Y: можете ли вы подробно остановиться на «градиентном подходе» и/или указать на определенные методы? Также, если есть шанс, я все еще надеюсь не использовать отдельные алгоритмы для извлечения Z (как определено в ответе) и осей X, Y. Интересно, что произойдет, если я применяю различные дескрипторы изображений, которые вычисляют ориентацию градиента, например SIFT или SURF, а затем подают его в классификатор. Я еще не знаком с кем-то из них, поэтому это мышление может быть слишком наивным. –
или EDIT: на самом деле вы правы, с отдельными оттенками серого может быть возможно облегчить пороговые краевые детекторы. Это классная идея! Что усложняет мне кое-что, так это то, что раньше я не делал какой-либо вычислительной геометрии, поэтому вчера я провел целый день, чтобы нарисовать простой цилиндр. С другой стороны, мне не нужно точно/аналитически вычислять исходную позицию. Мне скорее нужно вычислить набор функций из затенения цилиндров, которые позволяют грубо классифицировать 3d-ориентацию. Создание набора данных - еще одна проблема, у меня только 1 образец: http://imm.io/1iyBI –