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