Объединение двух фотографий в MATLAB, исключая черные пиксели ([0 0 0]) - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть две матрицы, назовем их photo1 и photo2, и я хочу объединить их в следующем смысле:

Когда photo2(i,j,:) отличается от [0 0 0], установите photo1(i,j,:)=photo2(i,j,:). * 1006.*

Очевидно, я могу написать это, используя циклы for.Но это слишком медленно.Я ищу решение, которое использует идею векторизации в MATLAB.

Я пытался

[row,column,channel] = find(photo2);
photo1(row,column,channel) = photo2(row,column,channel);

На основании документации MATLAB, но она не работает.Это дало «Индекс превышает размеры матрицы».ошибка и я не знаю почему.Некоторое время я возился с sub2ind и ind2sub, но я застрял.Я все еще новичок в MATLAB.В любом случае, любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вы можете использовать эти методы:

Метод1:

Мы можем изменить 3D-матрицу в 2D.Используя any, мы можем найти те пиксели, которые не содержат 0. Затем логическое индексирование используется для извлечения нужных элементов.

s = size(photo1);
photo1 = reshape(photo1,[],3);
photo2 = reshape(photo2,[],3);
idx = any(photo2,2);
photo1(idx,:)= photo2(idx,:);
photo1 = reshape(photo1 ,s);

Method2:

Здесь снова мы можем использовать any.idx это маска.Мы умножаем изображение на маску, чтобы сохранить те значения, которые находятся под маской, и установить другие пиксели на ноль.Из-за неявного расширения 1016 * маска применяется ко всем трем каналам.

idx = any(photo2,3);
photo1 = photo1 .* ~idx + photo2 .* idx;
0 голосов
/ 15 декабря 2018

Проблема в том, что [i,j,v] = find(x) ведет себя не так, как вы ожидаете, посмотрите документацию .Эта команда находит только 2d-индексы i,j ненулевых записей и значения v этих записей.Это то же самое, что если бы вы написали [i,j] = find(x(:,:)); v = x(i,j);.

. Чтобы это исправить, мы сначала определяем не черные записи по or -каналу по всем каналам, а затем конвертируем наши sub -индикаторы.для линейных индексов, используя sub2ind, и используйте их для перезаписи соответствующих пикселей.

photo1 = [];
photo1(:,:,1) = [1,1,1;0,0,0;1,1,1];
photo1(:,:,2) = [1,1,1;0,0,0;1,1,1];
photo1(:,:,3) = [1,1,1;0,0,0;1,1,1];

photo2 = [];
photo2(:,:,1) = [2,0,2;2,0,2;2,0,2];
photo2(:,:,2) = [2,0,2;2,0,2;2,0,2];
photo2(:,:,3) = [2,0,2;2,0,2;2,0,2];


[row,column] = find(photo2(:,:,1)|photo2(:,:,2)|photo2(:,:,3));
ind1 = sub2ind(size(photo1), [row;row;row], [column;column;column],[row*0+1;row*0+2;row*0+3]);
ind2 = sub2ind(size(photo2), [row;row;row], [column;column;column],[row*0+1;row*0+2;row*0+3]);

photo1(ind2) = photo2(ind1);

disp(photo1);

Попробуйте онлайн!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...