2012-04-25 3 views
1

Предположим, у меня есть матрица 10 x 10. То, что я делаю тогда, является итерацией по всей матрице с матрицей 3 x 3 (за исключением краев, чтобы сделать ее проще), и из этой матрицы 3 x 3 я получаю среднее/среднее значение этого 3 x 3 пространства. То, что я тогда хочу сделать, - это заменить исходные значения матриц такими новыми средними/средними значениями.Заменить значения матрицы средними значениями, извлеченными из меньшей матрицы в MATLAB

Может кто-нибудь, пожалуйста, объясните мне, как я могу это сделать? Некоторые примеры кода будут оценены.

ответ

4

То, что вы пытаетесь сделать, называется convolution. В MATLAB вы можете сделать следующее (прочитайте больше о свертке и о том, как это делается в MATLAB).

conv2(myMatrix , ones(3)/9 , 'same'); 

Немного расшифровки в порядке. myMatrix - это матрица, над которой вы работаете (10x10 вы упомянули). Команда ones(3)/9 создает так называемую маски из ядра фильтра, который

 
1/9 1/9 1/9 
1/9 1/9 1/9 
1/9 1/9 1/9 

Когда вы берете эту маску и переместить его вокруг, умножая записи маски в значение по значению с элементами 3x3 из изображение, а затем добавьте результаты (точка продукта, по существу), вы получите среднее значение из 9 значений, которые оказались под этой маской. Итак, как только вы поместили эту маску на каждый 3x3 сегмент вашей матрицы (изображение, я полагаю) и заменили значение в середине на среднее, вы получите результат этой команды. Вы можете экспериментировать с ним дальше. Флаг 'same' просто означает, что матрица, которую вы возвращаете, имеет тот же размер, что и исходный. Это важно, потому что, как вы сами поняли, существует множество способов борьбы с ребрами.

1

Для этого вам необходимо сохранить оригинал в целости и сохранности, пока не получите все средства. Это означает, что если вы реализуете это с помощью цикла, вам нужно сохранить средние значения в разных матрицах. Чтобы получить границы тоже, самый простой способ - скопировать исходную матрицу в новую матрицу, хотя для копирования нужно только границы.

Эта average3x3 функция копирует входные Matrix к AveragedMatrix, а затем проходит через все элементы, которые не являются на любой границе, вычисляет среднее значение 3x3 пространства и сохраняет его в соответствующем элементе AveragedMatrix.

function [AveragedMatrix] = average3x3(Matrix) 

AveragedMatrix = Matrix; 

if ((size(Matrix, 1) < 3) || (size(Matrix, 2) < 3)) 
    fprintf('Matrix is too small, minimum matrix size is 3x3.\n'); 
    return 
end 

for RowIndex = 2:(size(Matrix, 1)-1) 
    Rows = RowIndex-1:RowIndex+1; 

    for ColIndex = 2:(size(Matrix, 2)-1) 
     Columns = ColIndex-1:ColIndex+1; 
     AveragedMatrix(RowIndex,ColIndex) = mean(mean(Matrix(Rows,Columns))); 
    end 
end 

return 

Чтобы использовать эту функцию, вы можете попробовать:

A = randi(10,10); 

AveragedA = average3x3(A); 
+0

Tank вы очень много! Части кода помогли мне разобраться, и это было именно то, что я искал :) – dtd