объяснение сегментации изображения с использованием mean shift

<p>может кто-нибудь помочь мне понять, как на самом деле работает сегментация mean shift?</p><p>вот матрица 8х8, которую я только что составил</p><pre><code> 103 103 103 103 103 103 106 104 103 147 147 153 147 156 153 104 107 153 153 153 153 153 153 107 103 153 147 96 98 153 153 104 107 156 153 97 96 147 153 107 103 153 153 147 156 153 153 101 103 156 153 147 147 153 153 104 103 103 107 104 103 106 103 107 </code></pre><p>используя приведенную выше матрицу, можно ли объяснить, как сегментация по среднему сдвигу будет разделять 3 разных уровня чисел?</p>

<p><b>основы сначала:</b></p><p>сегментация по среднему сдвигу - это метод локальной гомогенизации, который очень полезен для демпфирования затенения или различий тональности в локализованных объектах. пример лучше многих слов:</p><p><img src="https://i.stack.imgur.com/jqyzf.png" alt="enter image description here"></p><p>действие: <strong> заменяет каждый пиксель средним числом пикселей в окрестности range-r, значение которого находится на расстоянии d. </strong></p><p>среднее смещение обычно занимает 3 входа:</p><ol> <li>функция расстояния для измерения расстояний между пикселями. обычно евклидово расстояние, но может использоваться любая другая четко определенная функция расстояния. <a href="http://en.wikipedia.org/wiki/taxicab\_geometry">манхэттенское расстояние</a> иногда является еще одним полезным выбором.</li> <li>радиус все пиксели в пределах этого радиуса (измеренные в соответствии с вышеуказанным расстоянием) будут учтены для расчета.</li> <li>разница в стоимости. из всех пикселей внутри радиуса r мы возьмем только те, чьи значения находятся в пределах этой разницы для расчета среднего</li> </ol><p>обратите внимание, что алгоритм не очень хорошо определен на границах, поэтому разные реализации приведут вас к разным результатам.</p><p>я не буду обсуждать здесь кровавые математические детали, поскольку их невозможно показать без правильной математической записи, недоступной в stackoverflow, а также потому, что их можно найти <a href="http://saravananthirumuruganathan.wordpress.com/2010/04/01/introduction-to-mean-shift-algorithm/">из хороших источников в других местах</a> .</p><p>давайте посмотрим на центр вашей матрицы:</p><pre><code>153 153 153 153 147 96 98 153 153 97 96 147 153 153 147 156 </code></pre><p>при разумном выборе радиуса и расстояния четыре центральных пикселя получат значение 97 (их среднее значение) и будут отличаться от соседних пикселей.</p><p>давайте посчитаем это в <a href="http://www.wolfram.com/mathematica/">mathematica</a> . вместо того, чтобы показывать реальные цифры, мы будем отображать цветовую кодировку, чтобы было легче понять, что происходит:</p><p>цветовая кодировка для вашей матрицы:</p><p> <a href="https://i.stack.imgur.com/rcdfa.png"><img src="https://i.stack.imgur.com/rcdfa.png" alt="enter image description here"></a> </p><p>затем мы берем разумное среднее смещение:</p><pre><code>meanshiftfilter[a, 3, 3] </code></pre><p>и мы получаем:</p><p> <a href="https://i.stack.imgur.com/ts9rg.png"><img src="https://i.stack.imgur.com/ts9rg.png" alt="enter image description here"></a> </p><p>где все центральные элементы равны (до 97, кстати).</p><p>вы можете повторить несколько раз с mean shift, пытаясь получить более однородную окраску. после нескольких итераций вы получите стабильную неизотропную конфигурацию:</p><p> <a href="https://i.stack.imgur.com/lagv7.png"><img src="https://i.stack.imgur.com/lagv7.png" alt="enter image description here"></a> </p><p>в это время должно быть ясно, что вы не можете выбрать, сколько "цветов" вы получите после применения mean shift. итак, давайте покажем, как это сделать, потому что это вторая часть вашего вопроса.</p><p>то, что вам нужно для того, чтобы заранее настроить количество выходных кластеров, это что-то вроде <a href="http://en.wikipedia.org/wiki/k-means\_clustering">kmeans clustering</a> .</p><p>это работает для вашей матрицы:</p><pre><code>b = clusteringcomponents[a, 3] {{1, 1, 1, 1, 1, 1, 1, 1}, {1, 2, 2, 3, 2, 3, 3, 1}, {1, 3, 3, 3, 3, 3, 3, 1}, {1, 3, 2, 1, 1, 3, 3, 1}, {1, 3, 3, 1, 1, 2, 3, 1}, {1, 3, 3, 2, 3, 3, 3, 1}, {1, 3, 3, 2, 2, 3, 3, 1}, {1, 1, 1, 1, 1, 1, 1, 1}} </code></pre><p>или же:</p><p> <a href="https://i.stack.imgur.com/is5d1.png"><img src="https://i.stack.imgur.com/is5d1.png" alt="enter image description here"></a> </p><p>что очень похоже на наш предыдущий результат, но, как вы можете видеть, теперь у нас есть только три уровня выхода.</p><p>нтн!</p>

<p>сегментация mean-shift работает примерно так:</p><p><strong> данные изображения преобразуются в пространство признаков </strong> <img src="https://i.stack.imgur.com/80uaa.jpg" alt="feature space"></p><p>в вашем случае все, что у вас есть, это значения интенсивности, поэтому пространство объектов будет только одномерным. (например, вы можете вычислить некоторые текстурные объекты, и тогда ваше пространство объектов будет двухмерным - и вы будете сегментироваться на основе интенсивности <em> и </em> текстуры)</p><p><strong> окна поиска распределены по пространству объектов </strong> <img src="https://i.stack.imgur.com/52hfx.jpg" alt="enter image description here"></p><p>количество окон, размер окна и начальное расположение для этого примера являются произвольными - что-то, что можно настроить в зависимости от конкретных приложений</p><p><em> итерации среднего сдвига: </em></p><p><strong> 1.) средние значения выборок данных в каждом окне вычисляются </strong> <img src="https://i.stack.imgur.com/jaoo5.jpg" alt="enter image description here"></p><p><strong> 2.) окна смещены на места, равные их ранее вычисленным средним </strong> <img src="https://i.stack.imgur.com/7nk75.jpg" alt="enter image description here"></p><p><strong> шаги 1.) и 2.) повторяются до конвергенции, то есть все окна располагаются в конечных точках </strong> <img src="https://i.stack.imgur.com/5127k.jpg" alt="enter image description here"></p><p><strong> окна, которые заканчиваются в тех же местах, объединяются </strong> <img src="https://i.stack.imgur.com/srya8.jpg" alt="enter image description here"></p><p><strong> данные сгруппированы в соответствии с обходами окна </strong> <img src="https://i.stack.imgur.com/a871k.jpg" alt="enter image description here"></p><p>... например все данные, пройденные окнами, которые оказались, скажем, в местоположении "2", будут образовывать кластер, связанный с этим местоположением.</p><p>таким образом, эта сегментация (по совпадению) даст три группы. просмотр этих групп в исходном формате изображения может выглядеть примерно так: <a href="https://i.stack.imgur.com/is5d1.png">последняя картинка в ответе велисария</a> . выбор разных размеров окна и начальных положений может привести к разным результатам.</p>