Я хочу вычислить дескриптор цветового макета (CLD) для каждого изображения. Этот алгоритм включает четыре этапа. На первом этапе я должен разбить каждое изображение на 64 блока i(8×8)n, чтобы вычислить один репрезентативный цвет из каждого блока. Я пытаюсь разбить изображение на 64 блока с помощью (цикла For), но получаю 64 образ. Я хочу получить изображение с блоком (8 × 8), чтобы завершить алгоритм, применив преобразование DCT, а затем зигзагообразное сканирование.
Как разбить изображение на 64 блока в Matlab
Ответы (2)
Вот некоторые фрагменты кода, которые я написал для точно такой же задачи (блоки 8x8, коэффициенты DCT и т.д.) некоторое время назад...
img=imread('filename')
[img_x,img_y]=size(img);
block_size=8;
slide_len=1;
for ix=block_size/2:slide_len:img_x-block_size/2
for jy=block_size/2:slide_len:img_y-block_size/2
current_block=img((ix-block_size/2+1):(ix+block_size/2),(jy-block_size/2+1):(jy+block_size/2));
dct_coeff=reshape(dct2(current_block),1,block_size^2);
<insert any other code you want to run here>
end
end
slide_len
устанавливает смещение между одним блоком и следующим. В этом случае он смещается на один пиксель каждый раз. однако, если вы хотите, чтобы блоки не перекрывались, вы должны установить его на 8. обычно в этом приложении вы используете некоторые перекрытия.
block_size=25
и slide_len=25
.
- person ; 06.03.2011
Один из способов разбить изображение на блоки, а затем выполнить над ним некоторую обработку, — использовать встроенную функцию BLOCKPROC (называемый blkproc
в старых версиях Matlab).
%# find block length in order to get 64 blocks
imageSize = size(img);
blockLen = round(imageSize(1:2)/8);
%# apply a function to each block
out = blocproc(img,blockLen,@myFunction)
myFunction
— это функция, которую вы хотели бы применить к каждому блоку. Вы можете определить его как подфункцию вашего кода, или как отдельный m-файл, или как анонимную функцию. Вывод будет объединен в массив 8x на 8x, где x — размер вывода вашей функции. myFunction
должен ожидать один входной аргумент blockStruct
, представляющий собой структуру с полями data
, содержащими значения пикселей блока, а также с полями border
, blockSize
, imageSize
и location
.
blkproc
: в последние годы имя этой функции изменилось. В то время как текущая версия (blockproc
) может обрабатывать входные 3D-массивы, похоже, что старая версия (blkproc
) не может. Так как rgb2gray
даст вам (примерно) яркость изображения, вы, скорее всего, потеряете некоторую информацию, необходимую для CLD.
- person Jonas; 07.03.2011
blockproc
вышел в 2009b.
- person Jonas; 13.03.2011