Как разбить изображение на 64 блока в Matlab

Я хочу вычислить дескриптор цветового макета (CLD) для каждого изображения. Этот алгоритм включает четыре этапа. На первом этапе я должен разбить каждое изображение на 64 блока i(8×8)n, чтобы вычислить один репрезентативный цвет из каждого блока. Я пытаюсь разбить изображение на 64 блока с помощью (цикла For), но получаю 64 образ. Я хочу получить изображение с блоком (8 × 8), чтобы завершить алгоритм, применив преобразование DCT, а затем зигзагообразное сканирование.


person zenab    schedule 06.03.2011    source источник
comment
Решение довольно простое. Если вы сможете показать мне, что вам небезразлична любая помощь, начав принимать ответы, я поделюсь с вами своим решением.   -  person Jonas    schedule 06.03.2011
comment
пожалуйста, вы можете объяснить, что вы имеете в виду? Я задаю вопрос, и мне нужно решение, если у вас есть .. Есть ли проблема с моим вопросом?   -  person zenab    schedule 06.03.2011
comment
@zenab, ты уже задал 10 вопросов. люди потратили время и усилия, чтобы ответить на ваши вопросы, но вы не признаете их помощь, помечая ответы как принятые. это просто дает вам репутацию халявщика, который использует stackoverflow в качестве ресурса для решения домашних заданий.   -  person    schedule 06.03.2011
comment
это неправда. Я всегда пишу обычно для любого подходящего ответа, и я не нахлебник, используя stackowerflow в качестве ресурса для решения домашних заданий.   -  person zenab    schedule 06.03.2011
comment
Я считаю, что лучше помогать друг другу как можно больше и не нужно использовать плохое слово в адрес других.   -  person zenab    schedule 06.03.2011
comment
за каждую вещь я благодарю вас и нет проблем, если вы не хотели мне помочь   -  person zenab    schedule 06.03.2011
comment
Зенаб, я просто объясняю, что имел в виду Джонас. под номером голосования каждого ответа и стрелками вверх-вниз есть галочка (галочка). если вам понравился ответ или он помог вам сделать то, что вы хотели, просто нажмите на него. это все, о чем Джонас просил тебя. Я не виню вас ... если вы новичок в stackoverflow, не всегда понятно, что вы должны это делать, и я тоже не сделал это в первый раз. в любом случае, я ответил на ваш вопрос ниже.   -  person    schedule 06.03.2011


Ответы (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. обычно в этом приложении вы используете некоторые перекрытия.

person Community    schedule 06.03.2011
comment
Теперь я отмечаю галочкой, прежде чем применить ваш ответ ... когда я получу результат, я сообщу вам ... Я хотел бы сообщить вам, что мне не нужно наложение вычислений CLD. Мне нужно именно эти 64 блока... еще раз спасибо, и я приношу извинения за недоразумение большое спасибо. - person zenab; 06.03.2011
comment
Я применяю вашу кодировку, но получаю блок 1875... Пожалуйста, я пытаюсь применить метод CLD, как описано на веб-сайте Википедии... Я имею в виду, что хочу разделить каждое изображение (с размером 200×200) на 64 блока в этом случае, когда каждый блок становится размером (25 × 25), чтобы получить блок (8 × 8). Надеюсь, я ясно объясню свою проблему. - person zenab; 06.03.2011
comment
ах, я вижу... вам нужно разбить изображение на 64 блока. каждый блок 25x25, верно? в этом случае установите block_size=25 и slide_len=25. - person ; 06.03.2011
comment
o'b: Вы можете добиться того же, не используя циклы for. См. ответ @Jonas. - person abcd; 13.05.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.

person Jonas    schedule 06.03.2011
comment
Большое вам спасибо .. просто я хотел бы упомянуть, что blocproc пишется как blkproc .. Я применяю ваш код и получаю то, что хочу .. еще раз спасибо - person zenab; 07.03.2011
comment
Извините, я забыл спросить вас... когда я использовал функцию blkproc, я должен преобразовать изображение в уровень серого с помощью функции rgb2gray. Это запись или нет? потому что, когда я не преобразовал в уровень серого, я получаю следующую ошибку: несоответствие размера назначения с подпиской. Ошибка в ==> blkproc на 89 aa(border(1)+(1:ma),border(2)+(1:na)) = a; Я хочу вычислить дескриптор цветового макета (CLD). Повлияет ли какое-либо влияние на мой результат, если я перейду к уровню серого? - person zenab; 07.03.2011
comment
@zenab: Хорошая мысль о blkproc: в последние годы имя этой функции изменилось. В то время как текущая версия (blockproc) может обрабатывать входные 3D-массивы, похоже, что старая версия (blkproc) не может. Так как rgb2gray даст вам (примерно) яркость изображения, вы, скорее всего, потеряете некоторую информацию, необходимую для CLD. - person Jonas; 07.03.2011
comment
спасибо за эту информацию... я постараюсь использовать новую версию, потому что сейчас я использую R2008a.. - person zenab; 07.03.2011
comment
Привет, Джонас, я хотел бы сообщить вам, что я пытался использовать версию Matlab 2009 ... но эта версия также использует blkproc, не могли бы вы сказать мне, какая версия Matlab использует функцию blockproc вместо blkproc? - person zenab; 13.03.2011
comment
@zenab: blockproc вышел в 2009b. - person Jonas; 13.03.2011