вычисление ковариаций пикселей в многоканальном маскированном изображении в маске - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть RGB-изображение, назовите его img, представленное в виде двойного массива с размером (100,200,3)

У меня есть двоичная маска (назовите ее mask), это логический массивс размером (100 200).

Я хочу знать среднее значение пикселя для маскированной области.Я также хочу знать полную (3x3) ковариационную матрицу для значений пикселей в регионе.

Теперь, если бы это было одноканальное (в отличие от 3-канального) изображение, я мог бы просто сделать:

mean(img(mask(:)))
std(img(mask(:)))

Прямое выполнение аналогичной операции в цикле для каждого канала, извлечение значений, создание большой матрицы 3xN (где N - это число «истин» в mask и, наконец,оперируя этой матрицей со средним и Ков. Любопытно, если есть способ сделать это без цикла. Я не вижу этого.

1 Ответ

2 голосов
/ 03 ноября 2011

Скопируйте свою маску в третье измерение и примените ее как обычно. Затем просто измените выходной вектор в матрицу со строкой для каждого пикселя в маске и столбцом для каждого цветового канала. Вот пример использования встроенного изображения:

% Load image
X = imread(('board.tif'));
X_size = size(X);

% Make mask
mask = zeros(X_size(1:2));
mask(250:251, 100:102) = 1;
mask = repmat(mask, [1 1 X_size(3)]);
mask = logical(mask);

% Apply mask to image
X_data = X(mask);
X_data = reshape(X_data, [length(X_data)/X_size(3) X_size(3)]);

% Compute stats
mean(X_data)
cov(double(X_data))

Теперь, просто чтобы проверить, проверяем ли мы первый пиксель внутри нашей маски на исходном изображении X

>> X(250, 100, :)

ans(:,:,1) =

  144


ans(:,:,2) =

  125


ans(:,:,3) =

  123

должно равняться первой строке в X_data:

>> X_data

X_data =

  144  125  123
  128  138  135
  180  186  184
   60   68   70
   38   42   26
   55   49   44
...