MATLAB - Слияние подматриц - PullRequest
6 голосов
/ 08 июня 2011

Я работаю над проектом обработки изображений в MATLAB . Чтобы упростить предварительную обработку изображения, я разделил его на строки и столбцы, поэтому из исходного изображения (2D-матрица uint8) теперь у меня есть 3D-матрица, например, стек.

Image decomposition

После обработки каждого блока я хочу снова изменить изображение. Проблема в том, что число строк и столбцов является динамическим, поэтому я не могу использовать (или не знаю, как это использовать здесь) команду cat или синтаксис [firstsubmatrix secondsubmatrix].

Кстати, я делю разделение так:

numRows = 3
numCols = 3
blockHeight = originalHeight / numRows;
blockWidth = originalWidth / numCols;

blocks = uint8(zeros(numCols * numRows, blockHeight, blockWidth));

Так что для каждого блока я заполняю его содержимое, используя

y0 = (row - 1) * rowHeight + 1;
y1 = row * rowHeight;
x0 = (col - 1) * rowWidth + 1;
x1 = col * rowWidth;

blocks(numBlock, :, :) = originalImage(y0:y1, x0:x1);

Есть ли лучший способ сделать это, и любой способ объединения блоков?

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Если я правильно понимаю ваш вопрос, то я бы поступил так: предположим, что у нас есть некоторая матрица данных с измерениями m на n

[m n] = size(data);

rows_wanted = 10;
cols_wanted = 10;
submatrix_rows = rows_wanted*ones(1,m/rows_wanted);
submatrix_cols = cols_wanted*ones(1,n/cols_wanted);
data_cells = mat2cell(data,submatrix_rows,submatrix_cols);
for k1 = 1:submatrix_rows;
    for k2 = 1:submatrix_cols;
        proc_data_cells{k1,k2} = function_for_matrics(data_cells{k,l});
    end
end
proc_data_mtx = cell2mat(proc_data_cells);

, преобразующая ваши данные в ячейку, где каждый элементячейки является подматрицей, затем просмотрите каждый элемент, отформатируйте свою функцию и выведите ее в новую ячейку.Используйте cell2mat для вывода полностью сцепленной обработанной матрицы.

Если у вас есть доступ к панели инструментов обработки изображений, я бы также воспользовался функцией blkproc.

1 голос
/ 09 июня 2011

Что касается вашего конкретного вопроса о том, как вы можете конвертировать туда и обратно между 2-D и 3-D матрицами в соответствии с вашей диаграммой, я сначала предположу, что originalHeight и originalWidth могут бытьпоровну делится на numRows и numCols соответственно.Основываясь на решении, которое я дал для аналогичной проблемы , о которой ранее спрашивали, вот решение с использованием только перестановок и перестановок матриц:

%# Convert from 2-D to 3-D:
blocks = reshape(permute(reshape(originalImage,blockHeight,blockWidth,[]),...
                         [1 3 2]),blockHeight,blockWidth,[]);

%# Convert from 3-D to 2-D:
newImage = reshape(permute(reshape(blocks,blockHeight,[],blockWidth),...
                           [1 3 2]),originalHeight,originalWidth);

Примечаниечто блоки в трехмерной матрице сцеплены вдоль третьего измерения, поэтому blocks(:,:,i) является блоком i th из двумерной матрицы.Также обратите внимание, что эти решения будут извлекать и заполнять блоки в двумерной матрице построчно.Другими словами, если originalImage = [A1 A2; A3 A4];, то blocks(:,:,1) = A1;, blocks(:,:,2) = A2; и т. Д.

...