Imadd MatLab

di il
6 risposte

Imadd MatLab

Ciao ragazzi, sono Simona e ho un problema credo semplice che non riesco però a risolvere..
Carico due immagini, stesse dimensioni, a colori e vorrei unirle con imadd.. ma mi dà errore.. provo a convertirle in double, uint, tutto ma dà sempre lo stesso errore. Potreste dirmi dove sbaglio per favore??
inserisco il codice:

>> I=imread('noi.jpg');
>> J=imread('img.jpg');
>> K=imadd(J,I);
Error using imadd (line 69)
X and Y must have the same size and
class or Y must be a scalar double.
 
>> imfinfo('noi.jpg')
ans = 

            Filename: [1x31 char]
         FileModDate: [1x20 char]
            FileSize: 29678
              Format: 'jpg'
       FormatVersion: ''
               Width: 233
              Height: 223
            BitDepth: 24
           ColorType: 'truecolor'
     FormatSignature: ''
     NumberOfSamples: 3
        CodingMethod: 'Huffman'
       CodingProcess: 'Sequential'
             Comment: {}
                Make: 'WIKO'
               Model: 'RIDGE 4G'
    YCbCrPositioning: 'Centered'
       DigitalCamera: [1x1 struct]
             GPSInfo: [1x1 struct]
         UnknownTags: [2x1 struct]
         
   >> imfinfo('img.jpg')

ans = 

           Filename: [1x31 char]
        FileModDate: [1x20 char]
           FileSize: 18092
             Format: 'jpg'
      FormatVersion: ''
              Width: 223
             Height: 223
           BitDepth: 24
          ColorType: 'truecolor'
    FormatSignature: ''
    NumberOfSamples: 3
       CodingMethod: 'Huffman'
      CodingProcess: 'Sequential'
            Comment: {}
E se cambio in double la stessa cosa:

>> I=im2double(I);
>> J=im2double(J);
>> K=imadd(I,J);
Error using imadd (line 69)
X and Y must have the same size and
class or Y must be a scalar double.

6 Risposte

  • Re: Imadd MatLab

    La funzione imadd non fa altro che sommare la matrici ottenute con imread
    Z = imadd(X,Y) adds each element in array X with the corresponding element in array Y and returns the sum in the corresponding element of the output array Z. X and Y are real, nonsparse numeric arrays with the same size and class, or Y is a scalar double. Z has the same size and class as X, unless X is logical, in which case Z is double.

    If X and Y are integer arrays, elements in the output that exceed the range of the integer type are truncated, and fractional values are rounded.
    .

    Dovresti verificare le dimensioni ed il tipo delle due matrici che ottieni con
    I=imread('noi.jpg');
    J=imread('img.jpg');
    semplicemente con il comando.
    whos I J
    Nella prova che ho fatto (ho usato una immagine e la sua "copia" - copy ...) ottengo
    
    >> whos I J
      Name        Size                Bytes  Class    Attributes
    
      I         344x369x3            380808  uint8              
      J         344x369x3            380808  uint8              
    
    "leggendo (imread)" direttamente le immagini.

    E
    
    >> whos I J
      Name        Size                 Bytes  Class     Attributes
    
      I         344x369x3            3046464  double              
      J         344x369x3            3046464  double              
    
    dopo aver convertito le matrici in "double" (im2double").

    Come vedi, le dimensioni delle due matrici sono uguali così come il "tipo".
  • Re: Imadd MatLab

    Ah cavolo.. Mi dice che i Bytes sono diversi 155877 una, e 149187 l'altra..
    Esiste qualcosa per portarli in uguali Bytes?
    Comunque grazie per l'aiuto. Gentilissimo..
  • Re: Imadd MatLab

    Dovresti pubblicare il risultato di
    
    whos I J
    
  • Re: Imadd MatLab

    Eccolo
    
     >> whos I J
      Name        Size                Bytes  Class    Attributes
    
      I         223x233x3            155877  uint8              
      J         223x223x3            149187  uint8    
    
  • Re: Imadd MatLab

    La prima matrice (i) ha 233 colonne mentre la seconda matrice (J) ha 223 colonne quindi la prima immagine è "un po' più grande" della seconda.

    Per usare imadd le due matrici (immagini) devono avere lo stesso numero di righe e colonne.

    Potresti provare a usare [imresize] per, per esempio, ridurre le dimensioni della prima matrice
    
    n=imresize(I,[size(J,1) size(J,2)]);
    
    ma la prima immagine potrebbe venire un po' distorta.

    Un'altra alternativa potrebbe essere semplicemente "tagliare" la prima immagine eliminando le colonne in eccesso:
    
    I_new=I(:,1:size(J,2),:)
    
    ma in questo caso dovresti stabilire quali colonne ... (nell'esempio di sopra, le ultime 10 che corrisponde a tagliare una "striscia" verticale alla destra dell'immagine).
  • Re: Imadd MatLab

    Oddio scusa.. Grazie mille.. Non mi ero accorta di quel 223 e 233 diversi..
    Grazie mille.
    Sei stato gentilissimo. Adesso sistemo tutto e dovrebbe funzionare..
Devi accedere o registrarti per scrivere nel forum
6 risposte