Декомпозиция Квадтри является методом анализа, который включает разделение изображения на блоки, которые более однородны, чем само изображение. Этот метод раскрывает информацию о структуре изображения. Это также полезно в качестве первого шага в алгоритмах адаптивного сжатия.
Вы можете выполнить декомпозиция quadtree, используя 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,[])