Image Processing

di il
27 risposte

27 Risposte - Pagina 2

  • Re: Image Processing

    Mi dà errore lo stesso errore anche se scrivo:
    Im(X0:passo:577,:)
    Im(Y0:passo:821,:)

    Forse allora non ho capito...
  • Re: Image Processing

    Per le y devi fare il contrario:
    Im(:,a:p:b)=1
    Poi dipende da cosa hai messo come x0, perché così dovrebbe funzionare.
    Peró, se vuoi capire bene come funziona vai per gradi
    Ad esempio, dai un intervallo di valori che sai che è interno all'immagine.
    Im(10:10:100,:)=1
    Intanto deve funzionare questo, altrimenti non riesci a capire dov'è l'errore.
    Assicurati comunque che max(im(:)) sia minore di 1 altrimenti è normale che non vedi niente.
    Prova questo
    A=imread('cameraman.tif');
    A=im2double(A);
    A(10:10:100,:)=1;
    figure();imshow(A);
  • Re: Image Processing

    Si, l'ho appena fatto. ho fatto anche le righe grigie che bianche faceva impazzire.
    Le x per lui sono le righe, le colonne sono le y, quindi ragione con gli assi invertiti (ho ragiono male io, bho?)

    la parte finale del codice è:
    
    figure (3)
    
    Im(1:passo:Y0, :)=0.5;
    Im(:, X0:passo:821)=0.5;
    
    imshow(Im)
    
    impixelinfo
    
  • Re: Image Processing

    Il problema è che a parte qualche programmino in C che faceva somme ricorsive non avevo mai programmato fino a un paio di settimane fa. Ora con questo lavoro di tesi c'è un bel pò di simulazioni da fare e di image processing.

    Ora provo a metterci due assi (che mi piacciono tanto e quindi poi li raddoppio)

    Grazie per la pasienza e la disponibilità
  • Re: Image Processing

    Tranquillo, vedrai che ci prenderai subito la mano. Una volta che hai capito come matlab ragiona, è tutto molto semplice.
    Nell'istruzione
    Im(1, :)=0.5;
    stai dicendo a matlab che deve prendere in considerazione la prima riga e tutte le colonne (i due punti indicano "tutto"). Quindi in questo caso tutta la prima riga diventerà grigia.
    Nel primo argomento si riferisce quindi al numero di righe. Volendo per non confonderti puoi anche scrivere così
    Im(1:passo:end, :)=0.5;
    Matlab capisce così che deve arrivare fino all'ultima riga dell'immagine.
    In questo caso è importante definire solo il punto di partenza perchè quello di arriva se lo calcola di conseguenza. Ad esempio se hai una matrice 10x10 e vuoi disegnare le righe ogni 3, a partire dalla seconda, scrivi:
    Im(2:3:10, :)=0.5;
    (o anche
     Im(2:3:end, :)=0.5;
    o anche
    Im(2:3:size(Im,1),:);
    )
    per lui 2:3:10 è semplicemente un vettore, equivale a questo [2 5 8]. Quindi l'ultimo valore non c'è bisogno di fissarlo perchè se lo calcola da solo.
    Il primo valore invece te lo devi calcolare esattamente a partire dal centro.
  • Re: Image Processing

    La spiegazione che mi hai scritto è molto utile, grazie.
    L'ho inserita come commento all'inizio dello script, così è a portata di mano.

    Il risultato te lo allego.
    Ho fatto in bianco la riga e la colonna che passano per l'origine e la griglia si estende solo nella parte attiva del rivelatore e nella porzione che ci interessa.
    Il risultato non è un'opera d'arte ma almeno consente di trarre qualche conclusione.
    Allegati:
    9724_923f4dac5f63f1a696c276be4dfd085c.jpg
    9724_923f4dac5f63f1a696c276be4dfd085c.jpg
  • Re: Image Processing

    Bene, ovviamente puoi anche fare in modo che le righe con continuino al di fuori della griglia...
    Im(x_min:passo:end,inizio_griglia:fine_griglia) =0.5;
    come vedi il riferimento delle colonne è molto simile a quello delle righe, infatti è sottointeso un passo uguale a 1. Equivale a scrivere
    inizio_griglia:1:fine_griglia
    .
    Se poi proprio ti vuoi divertire (se così si può dire) puoi anche provare a fare in modo che la griglia venga tonda.
  • Re: Image Processing

    E vabbè, provo a divertirmi...

    intanto ho rifinito la griglia quadrata come hai detto tu:
    Im(Y0-200:passo:Y0-passo, X0:X0+200)=0.5;
    Im(Y0-200:Y0, X0+passo:passo:X0+200)=0.5;
  • Re: Image Processing

    Ho notato che se metto, al posto di 200 la quantità (2*distance) la griglia non viene bene, nel senso che la prima riga sopra quella passante per l'origine dista più di "passo", poi le altre sono ok.
    200 è il numero di pixel in 2cm e (2*distance) dovrebbe essere più o meno la stessa cosa perchèquando inizializzo distance prendo un centimetro sulla griglia di riferimento ed è circe 98-100 pixel
  • Re: Image Processing

    Non ho capito bene, se è solo una riga ad essere spostata (che mi sembra un pò strano).

    Il problema è che stai definendo il punto di partenza delle righe a partire dalle coordinate del centro, sottraendo semplicemente un valore. Dovresti invece calcolarlo esattamente. Ad esempio, se i quadratini della griglia sono di 12px, 200/12 non è un numero intero, quindi la griglia non passerà per il punto centrale. Se invece fai il calcolo esatto, cercando il numero per cui la griglia parta da circa 200 passando per il centro, dovrai farla partire da 192 (o da 208). Forse se ti fai un disegno su carta risulta un pò più chiaro.
  • Re: Image Processing

    Sembra che lo spazio tra asse bianco e prima linea giriga è di 12-13 pixel (uso impixelinfo) mentre dalle altre in poi e di dieci...
    Comunque è la prima che è più distante.

    Comunque ho capito il problema, in parole semplici dovrebbe essere dovuto al fatto che lui comincia a "plottare" (diciamo così) le righe dall'alto a salti di un certo numero (eventualemente arrotondato) di pixel e poi si ferma quando arriva a Y0-passo e può succedere che l'ultima riga è più distante da quella di riferimento se ci sono numeri non interi nel mezzo.
    (i 2-3 pixel di scarto sono quello che perde con gli arrotondamenti... + o -)

    sulle colonne destra suppongo che scachi per lo stesso motivo, ma la distanza è uniforme perchè comincia a contare dalla prima colonna bianca
    Allegati:
    9724_aa9950ba067a426d74afe61d246a8590.jpg
    9724_aa9950ba067a426d74afe61d246a8590.jpg
  • Re: Image Processing

    Non vedendo il codice non capisco bene se stai partendo dal centro della griglia o dagli assi bianchi. Se stessi partendo dagli assi, mi sembra strano che le righe ti vengano più distanti.
    Comunque, è normale che ci siano approssimazioni dovute alla risoluzione dell'immagine che non è altissima.
    Se vuoi fare il cerchio devi fare un'immagine a parte, sfondo nero e cerchio bianco.
    Devi iniziare disegnando il bordo del cerchio su immagine nera (con la formula del cerchio dati centro e raggio). L'immagine nera come avrai capito è una matrice di tutti zeri della dimensione della tua immagine di partenza, che dovrai sostituire con 1 in corrispondenza del bordo del cerchio.
    Fatto questo usi la funzione imfill(im,'holes') per riempire il buco all'interno della circonferenza (questa si chiama maschera).
    E a questo punto ti basterà moltiplicare l'immagine bianca e nera per l'immagine con la griglia, così, tutto quello che nella maschera è nero rimane nero (moltiplichi per 0), tutto quello che nella maschera è bianco rimane come nell'immagine originale (moltiplichi per 1).
    E' un semplice esercizio di image processing ma da le sue soddisfazioni (sempre se così si può dire...).
  • Re: Image Processing

    Avevo letto ieri sera una procedura simile a quella che mi hai descritto.
    Ho intenzione di provarci questo fine settimana che sono più libero, ovviamente ti terrò informato.
Devi accedere o registrarti per scrivere nel forum
27 risposte