exponenta event banner

qtdecomp

Декомпозиция Quadtree

Описание

S = qtdecomp(I) выполняет декомпозицию квадратного дерева для изображения в оттенках серого I и возвращает структуру квадранта в разреженной матрице S. По умолчанию qtdecomp разделяет блок, если все элементы блока не равны.

пример

S = qtdecomp(I,threshold) разделяет блок, если максимальное значение элементов блока минус минимальное значение элементов блока больше, чем threshold.

S = qtdecomp(I,threshold,mindim) не будет производить блоки меньше, чем mindim, даже если результирующие блоки не удовлетворяют пороговому условию.

S = qtdecomp(I,threshold,[mindim maxdim]) не будет производить блоки меньше, чем mindim или больше, чем maxdim. Блоки крупнее maxdim разделяются, даже если они соответствуют пороговому условию.

S = qtdecomp(I,fun) использует функцию fun для определения необходимости разделения блока.

Примеры

свернуть все

Создайте небольшой образец матрицы.

I = uint8([1 1 1 1 2 3 6 6;...
             1 1 2 1 4 5 6 8;...
             1 1 1 1 7 7 7 7;... 
             1 1 1 1 6 6 5 5;... 
             20 22 20 22 1 2 3 4;... 
             20 22 22 20 5 4 7 8;... 
             20 22 20 20 9 12 40 12;...
             20 22 20 20 13 14 15 16]);

Выполните декомпозицию квадратного дерева и просмотрите результаты.

S = qtdecomp(I,.05);
disp(full(S));
     4     0     0     0     4     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     4     0     0     0     2     0     2     0
     0     0     0     0     0     0     0     0
     0     0     0     0     2     0     1     1
     0     0     0     0     0     0     1     1

Чтение изображения в рабочую область.

I = imread('liftingbody.png');

Выполните декомпозицию квадратного дерева и отобразите представление блока на рисунке.

S = qtdecomp(I,.27);
blocks = repmat(uint8(0),size(S));

for dim = [512 256 128 64 32 16 8 4 2 1];    
  numblocks = length(find(S==dim));    
  if (numblocks > 0)        
    values = repmat(uint8(1),[dim dim numblocks]);
    values(2:dim,2:dim,:) = 0;
    blocks = qtsetblk(blocks,S,dim,values);
  end
end

blocks(end,1:end) = 1;
blocks(1:end,end) = 1;

imshow(I)

Figure contains an axes. The axes contains an object of type image.

figure
imshow(blocks,[])

Figure contains an axes. The axes contains an object of type image.

Входные аргументы

свернуть все

Изображение в градациях серого, заданное как числовая матрица m-на-n. Если синтаксис включает дескриптор функции, fun, то изображение может быть любого класса, поддерживаемого функцией.

Типы данных: single | double | int16 | uint8 | uint16 | logical

Порог однородности блока, заданный как скаляр в диапазоне [0, 1].

  • Если I имеет класс uint8, то qtdecomp умножает значение threshold на 255 для определения фактического используемого порога.

  • Если I имеет класс uint8, то qtdecomp умножает значение threshold на 65535 для определения фактического используемого порога.

Минимальный размер блока, заданный как положительное целое число. mindim должен быть коэффициентом размера изображения.

Максимальный размер блока, заданный как положительное целое число. maxdim/mindim должна быть силой 2.

Дескриптор функции, указанный как дескриптор. Функция должна принимать в качестве входных все блоки m-by-m, сложенные в массив m-by-m-by-k, где k - количество блоков. Функция должна возвращать логический вектор k-element, значения которого равны 1 если соответствующий блок должен быть разделен, и 0 в противном случае. Например, если k (3является 0, то третий блок m-by-m не должен быть разделен.

Дополнительные сведения об дескрипторах функций см. в разделе Создание дескриптора функции.

Выходные аргументы

свернуть все

Структура Quadtree, возвращаемая в виде разреженной матрицы. Если S(k,m) ненулевое, то (k,m) - верхний левый угол блока в разложении, а размер блока задается как S(k,m).

Типы данных: double

Совет

  • qtdecomp подходит в первую очередь для квадратных изображений, размеры которых являются степенью 2, таких как 128 на 128 или 512 на 512. Эти изображения можно разделить до тех пор, пока блоки не станут такими маленькими, как 1 на 1. Если вы используете qtdecomp с изображением, размеры которого не являются степенью 2, в какой-то момент блоки не могут быть разделены дальше. Например, если изображение 96 на 96, его можно разделить на блоки размера 48 на 48, затем 24 на 24, 12 на 12, 6 на 6 и, наконец, 3 на 3. Дальнейшее разделение за пределами 3 на 3 невозможно. Чтобы обработать этот образ, необходимо задать mindim до 3 (или до 3-кратной степени 2); если используется синтаксис, включающий функцию, fun, функция должна вернуть 0 в момент, когда блок не может быть разделен дальше.

Алгоритмы

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

См. также

|

Представлен до R2006a