Разложение дерева квадрантов в MATLAB: ввод функции qtdecomp

Есть ли у кого-нибудь опыт определения входной функции в качестве порогового критерия для функции qtdecomp в MATLAB? Я пробовал следующее, но это не сработало:

MyFunc = @(A,threshold) std2(A)>threshold;
S = qtdecomp(Image,MyFunc,threshold); 

Каким-то образом при некоторых пороговых значениях на новые части делится только самая левая четверть дерева квадрантов. Может быть, это ошибка в самом коде qtdecomp или что-то не так с вводом моей функции?

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

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


person S.C. Graaf    schedule 31.10.2016    source источник
comment
Нам действительно нужно увидеть образец изображения. Это ожидаемое поведение для некоторых изображений. Вы пробовали qtdecomp без пользовательской функции?   -  person beaker    schedule 02.11.2016


Ответы (1)


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

function v = Std2Func(A, threshold)
   s = size(A,3);
   v = zeros(1,s);

   for k = 1:s
      v(k) = std2(A(:,:,k))>threshold;
   end   
end

Это перебирает k плоскостей входного массива, применяя std2 к каждой 2d-плоскости и помещая результаты в выходной вектор. Затем вы просто вызываете qtdecomp, используя дескриптор новой функции:

S = qtdecomp(Image,@Std2Func,threshold);
person beaker    schedule 01.11.2016