2. Is there any correlation method that can identify the similarity point by
point and by thus the results will have the "shape" of the original matrix?
Cominciamo con il secondo punto, perché è più chiaro, ciò che si vuole lì. Si desidera eseguire un confronto punto per punto di due immagini, ad esempio A
e B
. Questo si riduce alla misurazione della somiglianza di due scalari a
e b
. Supponiamo che questi scalari siano dell'intervallo [0, Q]
, dove Q
dipende dal formato dell'immagine (Q == 1
o Q == 255
sono comuni in Matlab).
Ora, la misura di distanza più semplice è la differenza d = |a - b|
. Potresti voler normalizzare questo valore a [0, 1]
e anche invertire i valori per misurare la differenza anziché distanza. In Matlab:
S = 1 - abs(A - B)/Q;
Hai parlato di ignorare gli zeri nelle immagini. Bene, devi definire, quale misura di similarità ti aspetti per uno zero. Una possibilità è quella di impostare la somiglianza a zero, ogni volta che un pixel è pari a zero:
S(A == 0 | B == 0) = 0;
Si potrebbe anche dire che la somiglianza non è definita e impostare la somiglianza con NaN
:
S(A == 0 | B == 0) = nan;
Naturalmente, puoi anche dire che la discrepanza tra 10 e 11 è peggiore della discrepanza tra 100 e 110. In questo caso, puoi prendere la distanza rispetto alla somma a + b
(nota come normalizzazione Bray Curtis o metrica euclidea normalizzata)
D = abs(A - B) ./ (A + B)
S = 1 - D/max(D(:));
Si verificano problemi, se entrambe le matrici hanno un pixel di valore zero nella stessa posizione. Anche in questo caso, esistono diverse possibilità: è possibile aumentare la somma con un piccolo valore positivo alpha
(ad esempio alpha = 1e-6
) che impedisce una divisione per zero: D = abs(A - B) ./ (alpha + A + B)
.
Un'altra opzione è quella di ignorare i valori infiniti in D
e aggiungere il 'zero elaborazione' qui, vale a dire
D = abs(A - B) ./ (A + B)
D(A == 0 | B == 0) = nan;
S = 1 - D/max(D(:));
Vedete, ci sono un sacco di possibilità.
1. I would like to create a correlation matrix [...]
Si dovrebbe sicuramente pensare di più a questo punto e trovare una descrizione migliore di quello che per calcolare. Se le tue matrici sono di dimensioni m x m
, hai le variabili m^2
. Da questo è possibile calcolare una matrice di correlazione m^2 x m^2
, che misura la correlazione di ogni pixel su ogni altro pixel. Questa matrice avrà anche i valori più grandi nella diagonale (queste sono le varianze). Tuttavia, non suggerirei di calcolare la matrice di correlazione se hai solo due realizzazioni.
Un'altra opzione è misurare la somiglianza di righe o colonne nelle due immagini. Quindi si finisce con un vettore 1 x m
di coefficienti di correlazione.
Tuttavia, non so come calcolare una matrice di correlazione della dimensione m x m
da due ingressi di dimensione m x m
, che ha i valori più grandi nella diagonale.
Non sono sicuro di seguirti. Cosa intendi per "_ignore any appearnaces of zeros_"? –
Se guarderai l'immagine qui sopra, oltre agli "zeri" nella parte in alto a sinistra dell'immagine, ci sono degli zeri sparsi, non voglio escluderli dai dati usati per la correlazione – jarhead
Quale dovrebbe essere la dimensione del risultato in 1.? Sto chiedendo perché una correlazione normalmente richiede due vettori e calcola un singolo scalare da esso. – Mehrwolf