Sto cercando di implementare in OpenCV un algoritmo di normalizzazione locale per ridurre la differenza di illuminazione in un'immagine. Ho trovato uno MATLAB function e l'ho implementato in OpenCV. Tuttavia, il risultato che ottengo è diverso da quello fornito dalla funzione MATLAB.Normalizzazione locale in OpenCV
Questo è il mio codice:
Mat localNorm(Mat image, float sigma1, float sigma2)
{
Mat floatGray, blurred1, blurred2, temp1, temp2, res;
image.convertTo(floatGray, CV_32FC1);
floatGray = floatGray/255.0;
int blur1 = 2*ceil(-NormInv(0.05, 0, sigma1))+1;
cv::GaussianBlur(floatGray, blurred1, cv::Size(blur1,blur1), sigma1);
temp1 = floatGray-blurred1;
cv::pow(temp1, 2.0, temp2);
int blur2 = 2*ceil(-NormInv(0.05, 0, sigma2))+1;
cv::GaussianBlur(temp2, blurred2, cv::Size(blur2,blur2), sigma2);
cv::pow(blurred2, 0.5, temp2);
floatGray = temp1/temp2;
floatGray = 255.0*floatGray;
floatGray.convertTo(res, CV_8UC1);
return res;
}
La funzione NormInv
è l'implementazione C++ data dal Euan Dean in this post.
Il seguente mostra il risultato che sto ottenendo e il risultato teorico, per gli stessi valori di sigma1
e sigma2
(2,0 e 20,0, rispettivamente)
Ho provato con valori diversi per sigma1
e sigma2
, ma nessuno di loro sembra funzionare. Ho anche provato a fare blur1=0
e blur2=0
nella funzione gaussiana, ma non funziona neanche.
Qualsiasi aiuto sarebbe apprezzato. Grazie in anticipo.
Grazie per la risposta, che ha risolto il mio problema. Ho cambiato la riga floatGray = 255.0 * floatGray e usato cv :: normalize (floatGray, res, 0, 255, NORM_MINMAX, CV_8UC1) invece e ora funziona. Pensavo che moltiplicando per 255 si normalizzasse l'immagine, ma mi sbagliavo. Grazie. – stfani