Matlab: замените значения в одной матрице другой матрицей в соответствии с их ссылочными местоположениями

У меня есть два изображения geotiff (с надписью «A» и «B»), импортированные в Matlab как матрицы с Geotiffread. У одного разные значения, а у второго только 0 и 255с. Что я хотел бы сделать, так это заменить все 255 значениями внутри другого изображения (или матрицы) в соответствии с их позициями. А и В различаются по размеру, но имеют одинаковые проекции.

Я пробовал это:

A (A== 255)= B;

вывод - ошибка:

??? In an assignment  A(:) = B, the number of elements in A and B must be the same.

В противном случае я также попытался с логическим подходом:

if A== 255
    A= B;
end

и ничего не происходит.

Есть ли способ заменить значения A значениями B в соответствии с конкретным значением и положением в указанном пространстве?


person umbe1987    schedule 08.01.2014    source источник
comment
Попробуйте A(A==255) = B(A==255). Ошибка говорит вам, что когда вы пытаетесь присвоить значения элементам массива, вы не можете присвоить ему больше или меньше значений, чем вы пытаетесь присвоить. Кроме того, в отношении оператора if: я считаю, что if A==255 означает то же, что и if all(A==255), например, если какие-либо элементы A не являются 255, возвращается false. Вы можете проверить это в командной строке.   -  person darthbith    schedule 08.01.2014


Ответы (3)


Мне кажется, что вы пытаетесь замаскировать изображение бинарной маской. Ты можешь это сделать:

BW = im2bw(B,0.5);
A=A.*BW;

Надеюсь, поможет

person Cape Code    schedule 08.01.2014
comment
Я вообще не думаю, что это маскировка. Также ваше решение будет работать только в том случае, если A и B имеют одинаковый размер, что, очевидно, из вопроса, это не так. - person MZimmerman6; 08.01.2014
comment
Я не мог использовать функцию im2bw, как вы сказали, потому что аргумент уровня работает только с положительными числами от 0 до 1, но я преобразовал свои 255 в 1, и вторая строка вашего кода выполнила свою работу. Спасибо! - person umbe1987; 08.01.2014
comment
@ umbe1987 вы правы с уровнем, я отредактировал свой ответ. Спасибо, что указали на это. - person Cape Code; 08.01.2014

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

Выполняя A(A==255)=B, вы пытаетесь поместить всю матрицу B в подмножество A, равное 255.

Однако, если, как вы сказали, проекции одинаковы, вы можете просто сделать A(A==255) = B(A==255), исходя из предположения, что B больше или того же размера, что и A.

Некоторый пример кода для демонстрации концепции.

A = randi([0,10],10,10);
B = randi([0,4],15,15);

C = A % copy original A matrix for comparison later
A(A==5) = B(A==5); % replace values
C==A % compare original and new

В этом примере кода создаются две матрицы: A — 10x10, а B — 15x15, и заменяются все значения, равные 5 в A, соответствующими значениями в B. Это подтверждается выполнением C==A, которое показывает, где новая матрица и старая матрица меняется, доказывая, что замена действительно произошла.

person MZimmerman6    schedule 08.01.2014

Попробуйте A(A==255) = B(A==255). Ошибка говорит вам, что когда вы пытаетесь присвоить значения элементам массива, вы не можете присвоить ему больше или меньше значений, чем вы пытаетесь присвоить.

Кроме того, что касается оператора if: if A==255 означает то же, что и if all(A==255), например, если какие-либо элементы A не являются 255, возвращается false. Вы можете проверить это в командной строке.

Если вы действительно в отчаянии, вы можете использовать пару вложенных циклов for для достижения этого (при условии, что A и B имеют одинаковый размер и форму):

[a,b] = size(A);
for ii = 1:a
    for jj = 1:b
        if A(ii,jj) == 255
            A(ii,jj) = B(ii,jj);
        end
    end
end
person darthbith    schedule 08.01.2014
comment
Я попробовал Ваше предложение, но после этого A не изменилось (все 255-е не заменяются соответствующими значениями B, и они все еще остаются 255-ми). - person umbe1987; 08.01.2014
comment
ваше утверждение if statement верно. Он будет работать на векторе, используемом в if - person MZimmerman6; 08.01.2014
comment
Какой тип данных содержится в A? Когда я пытаюсь в командной строке: A = [255 0 0 255]; B = [100 0 0 123]; A(A==255) = B(A==255) я получаю ans = [100 0 0 123] что именно то, что я ожидаю - person darthbith; 08.01.2014
comment
A — это «одиночный» тип (он содержит только 0 и 255), а B — «unit8». - person umbe1987; 08.01.2014
comment
попробуйте привести A к uint8, что должно быть хорошо, так как это только от 0 до 255, а затем попробуйте, но это не должно иметь значения. - person MZimmerman6; 08.01.2014
comment
Я попробовал функцию uint8 на A, все еще получая те же результаты. Теперь я изменил размеры матриц, чтобы они были равны (теперь numel выводит тот же результат), но проблема не решена. - person umbe1987; 08.01.2014