Ich versuche in OpenCV einen lokalen Normalisierungsalgorithmus zu implementieren, um den Unterschied der Beleuchtung in einem Bild zu reduzieren. Ich habe eine MATLAB function gefunden, und ich habe es in OpenCV implementiert. Das Ergebnis, das ich erhalte, unterscheidet sich jedoch von dem Ergebnis der MATLAB-Funktion.Lokale Normalisierung in OpenCV
Dies ist mein Code:
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;
}
Die Funktion NormInv
ist die C++ Implementierung von Euan Dean in this post gegeben.
Die folgende Abbildung zeigt das Ergebnis, das ich erhalte und das theoretische Ergebnis für die gleichen Werte von sigma1
und sigma2
(2,0 und 20,0 beziehungsweise)
habe ich versucht, verschiedene Werte für sigma1
mit und sigma2
, aber keiner von ihnen scheint zu funktionieren. Ich habe auch versucht, blur1=0
und blur2=0
in der Gaussian-Funktion zu tun, aber es funktioniert auch nicht.
Jede Hilfe wäre willkommen. Danke im Voraus.
Vielen Dank für Ihre Antwort, die mein Problem gelöst. Ich habe die Zeile floatGray = 255.0 * floatGray geändert und stattdessen cv :: normalize (floatGray, res, 0, 255, NORM_MINMAX, CV_8UC1) benutzt und jetzt funktioniert es. Ich dachte, dass die Multiplikation mit 255 das Bild normalisieren würde, aber ich lag falsch. Vielen Dank. – stfani