Come trovare la correlazione di un'immagine?
-
02-10-2019 - |
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
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:
-
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 inx
sottoinsieme, quindi i pixel orizzontalmente adiacenti saranno quelli nella seconda colonna diA
, e questi saranno messi iny
sottoinsieme. Posso anche aggiungere i pixel della seconda colonna allax
sottoinsieme, ei pixel orizzontali adiacenti nella terza colonna veniva poi collocata nely
sottoinsieme. Ripetendo questo per tutte le colonneA
, possiamo vedere che i pixel nelle colonne da 1 a 255 saranno inx
sottoinsieme, ei pixel nelle colonne da 2 a 256 sarà iny
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
ey
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. -
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
ey
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 perD(x)
, e COV percov(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.