Domanda

C'è A immagine di dimensione fissa 256 * 256 * 3 (RGB). La formula matematica per covarianza tra due pixel adiacenti valori x,y in un'immagine è comunemente noto per essere:

cov(x,y) = 1/n summation from i = 1 to n of [E(x_i-E(x))(y_i-E(y))]

r_xy = cov(x,y) / (sqrt(D(x)*D(y)))

D(x) = 1/n summation  from i = 1 to n of square[(x_i - E(x))]

E(x) = 1/n summation from i = 1 to n of (x_i)

dove r_xy è i coefficienti di correlazione tra due orizzontalmente, verticalmente e diagonalmente pixel adiacenti di queste due immagini.

Q1:? Come fare il calcolo di cui sopra in MATLAB

Q2:? Come selezionare casualmente dire 5000 coppie di due pixel orizzontali adiacenti dalle immagini e quindi tracciare la distribuzione di questi due pixel orizzontali adiacenti

È stato utile?

Soluzione

Come è tipico con l'elaborazione di immagini per truecolor RGB immagini , ci sono un paio di questioni chiave al primo indirizzo. Ho accennato in questi mia risposta a < a href = "https://stackoverflow.com/questions/3690246/code-not-working-for-image-processing-in-matlab"> la tua altra domanda che coinvolge un algoritmo di elaborazione delle immagini diversa, ma portano ripetendo qui:

  • Per capire come affrontare la terza dimensione: immagine An RGB è in realtà un insieme di tre matrici 2-D (uno ciascuno per i componenti di rosso, verde e blu di colore dei pixel) concatenato lungo una terza dimensione. Quando si eseguono operazioni di pixel-saggio, si deve decidere se si sta per eseguire le operazioni di tre volte (vale a dire una volta per ogni piano di colore) o se si sta andando in qualche modo crollare i valori lungo la terza dimensione (cioè la conversione in un scala di grigi intensità dell'immagine con funzioni come RGB2GRAY ) per dare un set di dati di immagine 2-D di operare su .
  • Essere consapevoli di tipi di dati: I dati di immagine caricati in MATLAB è tipicamente nella forma di 8 bit senza segno intero , ma a volte può essere un unsigned interi a 16 bit o un tipo doppia precisione. Quando si tratta di tipi interi, conversione doppia precisione è solitamente desiderata prima eseguire determinate operazioni al fine di evitare taluni aspetti della aritmetica intera come arrotondamento e saturazione.

Bene, ora che tali formalità sono fuori strada, vedo il problema di cui sopra come composta da due fasi. In primo luogo, è necessario selezionare sottoinsiemi di pixel accoppiati dalla immagine, come ad esempio tutti i pixel in orizzontale-accoppiati. In secondo luogo, è necessario applicare le formule statistiche che avete sopra. Negli esempi che seguono, supporrò le operazioni vengono eseguite sul rosso (cioè prima) piano di colore del A matrice:

  1. sottoinsiemi Selezione di pixel accoppiati: inizio di Let con la serie di abbinamenti orizzontali uniche di pixel. Se seleziono i pixel nella prima colonna di A e metterli in x sottoinsieme, quindi i pixel orizzontalmente adiacenti saranno quelli nella seconda colonna di A, e questi saranno messi in y sottoinsieme. Posso anche aggiungere i pixel della seconda colonna alla x sottoinsieme, ei pixel orizzontali adiacenti nella terza colonna veniva poi collocata nel y sottoinsieme. Ripetendo questo per tutte le colonne A, possiamo vedere che i pixel nelle colonne da 1 a 255 saranno in x sottoinsieme, ei pixel nelle colonne da 2 a 256 sarà in y sottoinsieme. matrice indicizzazione sarebbe quindi simile a questa :

    x = A(:,1:end-1,1);  %# All rows and columns 1 through 255 from red plane
    y = A(:,2:end,1);    %# All rows and columns 2 through 256 from red plane
    

    Seguendo la logica simile come sopra, si può costruire l'intero set di coppie verticali uniche di pixel in questo modo:

    x = A(1:end-1,:,1);  %# Rows 1 through 255 and all columns from red plane
    y = A(2:end,:,1);    %# Rows 2 through 256 and all columns from red plane
    

    E similmente per l'insieme di accoppiamenti diagonali uniche di pixel, dove corre "diagonale" dall'alto verso sinistra a destra inferiore nella matrice:

    x = A(1:end-1,1:end-1,1);  %# All but the last row and column
    y = A(2:end,2:end,1);      %# All but the first row and column
    

    O per "anti-diagonali", dove corre "diagonali" dal basso a sinistra a in alto a destra nella matrice:

    x = A(2:end,1:end-1,1);  %# All but the first row and last column
    y = A(1:end-1,2:end,1);  %# All but the last row and first column
    

    Ora, è possibile scegliere uno di questi insiemi di dati x e y per eseguire i calcoli statistici che si desidera per il piano di colore rosso. È possibile ripetere quanto sopra sostituendo 2 o 3 per l'ultimo indice di ogni linea per ottenere il calcolo dei piani di colore verde e blu, rispettivamente.

  2. Esecuzione test statistici: Questa parte è semplice. C'è già una funzione incorporata CORRCOEF per calcolare il coefficiente di correlazione in MATLAB. Potrebbe essere necessario rimodellare i sottoinsiemi di valori dei pixel x e y in vettori colonna prima utilizzando single-colon indicizzazione :

    r_xy = corrcoef(x(:),y(:));
    

    Esistono anche funzioni per le altre formule così: MEDIA per E(x), VAR per D(x), e COV per cov(x,y)

Per quanto riguarda la seconda domanda, è possibile creare prima x e y come ho fatto sopra per tutte le coppie uniche di pixel orizzontali adiacenti, quindi creare un vettore con una permutazione casuale degli indici interi in x e y utilizzando la funzione < a href = "http://www.mathworks.com/help/techdoc/ref/randperm.html" rel = "nofollow noreferrer"> RANDPERM . Selezionando i primi 5000 voci di tali indici permutati a caso vi darà 5000 indici casuali in x e y:

randIndex = randperm(numel(x));  %# A random permutation of the integers
                                 %#   from 1 to numel(x)
randIndex = randIndex(1:5000);   %# Pick the first 5000 indices
xRand = x(randIndex);            %# 5000 random values from x
yRand = y(randIndex);            %# The corresponding 5000 values from y

Questo vi darà i vostri 5000 coppie di valori di pixel adiacenti in orizzontale, in x e y. Tuttavia, non è chiaro cosa si intende per "tracciare la distribuzione". Sto indovinando si sia finire con la funzione di HIST o forse la funzione di DIFFUSO per questo scopo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top