Декомпозиция квадротре - это метод анализа, который включает разделение изображения на блоки, которые являются более однородными, чем само изображение. Эта техника раскрывает информацию о структуре изображения. Это также полезно в качестве первого шага в алгоритмах адаптивного сжатия.
Можно выполнить декомпозицию квадратного дерева с помощью qtdecomp функция. Эта функция работает, деля квадратное изображение на четыре равных по размеру квадратных блока, а затем тестируя каждый блок, чтобы увидеть, соответствует ли он какому-то критерию однородности (например, если все пиксели в блоке находятся в определенном динамическом диапазоне). Если блок удовлетворяет критерию, он не делится дальше. Если он не соответствует критерию, он снова подразделяется на четыре блока и критерий теста применяется к этим блокам. Этот процесс повторяется итеративно до тех пор, пока каждый блок не будет соответствовать критерию. Результат может иметь блоки нескольких различных размеров. Блоки могут иметь размер 1 на 1, если не указано иное.
qtdecomp возвращает декомпозицию квадранта в виде разреженной матрицы того же размера, что и I. Ненулевые элементы представляют верхние левые углы блоков. Значение каждого ненулевого элемента указывает размер блока.
В этом примере показано, как выполнить декомпозицию квадратного дерева для изображения в градациях серого 512 на 512.
Считывание изображения в градациях серого в рабочую область.
I = imread('liftingbody.png');Выполните декомпозицию quadtree, вызвав qtdecomp , указывая в качестве аргументов изображение и критерии теста, используемые для определения однородности каждого блока в разложении. Например, критерием может быть расчет порога, такой как max(block(:)) - min(block(:)) >= 0.27. Вы также можете поставлять qtdecomp с функцией (а не пороговым значением) для принятия решения о разделении блоков. Например, решение может основываться на расхождении блока.
S = qtdecomp(I,0.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, imshow(blocks,[])

