Funzione per traslare immagine con Matlab

soeca-votailprof
Ragazzi ho scritto il seguente codice in matlab per traslare un'immagine:
I=imread(uigetfile('*.jpg','Choose a file:'));
I=double(I);
[m,n]=size(I);
disp(size(I));
tx=input('scegli un valore di tx');
ty=input('scegli un valore di ty');
%figure,imshow(uint8(I));
T=[1 0 0;0 1 0;tx ty 1]; 

final=zeros(size(I));

for i=1:m
    for j=1:n
        translate=round([i j 1]*T);
        x=translate(1);
        y=translate(2);
        if x<=0
            x=1;
        end
        if x>m
            x=255;
        end
        if y<=0
            y=1;
        end
        if y>n
            y=255;
        end
        final(i,j)=I(x,y);
    end
end
figure,imshow(uint8(final));

Però ottengo come output un'immagine che è traslata ma i bordi è come se fossero "spalmati"!!
per intenderci ottengo QUESTO.....ma come mai??Grazie a tutti!Per qualunque chiarimento nel codice fatemelo sapere.

Risposte
apatriarca
Che cosa intendi esattamente con traslare un immagine? Ma il motivo per cui ottieni quell'effetto sono le seguenti righe:
if x<=0
    x=1;
end
if x>m
    x=255;
end
if y<=0
    y=1;
end
if y>n
    y=255;
end

Sono sbagliate per più di un motivo. Per prima cosa l'immagine potrebbe essere più piccola di 255x255. Immagino che i valori corretti avrebbero dovuto essere m ed n. Inoltre immagino che quello che volessi ottenere fosse:
x = mod(x, m);
y = mod(y, n);

soeca-votailprof
Per traslazione intendo spostare l'immagine dati due valori tx e ty....Per intenderci se all'inizio ho QUESTO dopo aver richiamato lo script e aver assegnato i valori x e y ottengo QUESTO!!Penso che tutto ciò che c'è oltre i bordi dell'immagine o dovrei metterlo a 0 (così da avere nero attorno alla foto) oppure non dovrei proprio considerarlo!!Boo non lo so è da pochissimo che faccio script matlab e il corso è cominciato da 2 settimane!!
Comunque ho commentato la parte di codice che mi hai detto che è errata inserendo ciò che mi hai consigliato ma ogni volta, qualunque sia il valore che inserisco ottengo sempre un errore!!
Per esempio impostando tx a 21 e ty a 20:
tx=21
ty=20

??? Attempted to access I(22,0); index must be a positive
integer or logical.

Error in ==> PWD at 31
        final(i,j)=I(x,y);

apatriarca
Ma tu stai cambiando gli indici, non i valori dell'immagine.. Dovresti allora scrivere qualcosa come:
if x <= 0 || x > m || y <= 0 || y > n
    final(i,j) = 0;
else
    final(i,j) = I(x, y);
end

soeca-votailprof
QUESTO è il risultato finale......come faccio a fare la stessa cosa nelle colonne a destra dell'immagine???

apatriarca
Mi copieresti gli indici in un'immagine per vedere come sono messi? È strano che quel codice non aggiusti gli indici. Inoltre, che dimensione hanno le immagini (nel senso il risultato di size(I) e size(final) alla fine del codice).

soeca-votailprof
Scusami se ieri non ho più risposto....comunque size(I) e size(final) hanno le stesse dimensioni proprio perché all'inizio del codice scrivo
 final=zeros(size(I)); 
Comunque entrambi hanno dimensione 512x512x3

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.