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