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

Имам две geotiff изображения (казващи "A" и "B"), импортирани в Matlab като матрици с Geotiffread. Единият има различни стойности, докато вторият има само 0 и 255s. Това, което бих искал да направя, е да заменя всички 255 със стойностите в другото изображение (или матрица), според техните позиции. A и B се различават по размер, но имат еднакви проекции.

Опитах това:

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, но преобразувах моите 255s в 1s и вторият ред от вашия код свърши работата. Благодаря ти! - person umbe1987; 08.01.2014
comment
@umbe1987 прав си за нивото, редактирах отговора си. Благодаря, че го посочи. - person Cape Code; 08.01.2014

Както darthbith постави в коментара си, трябва да се уверите, че броят на записите, които искате да замените, е същият като числовите стойности, които въвеждате.

Правейки 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 е тип "single" (съдържа само 0s и 255s), докато 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