Tôi đang cố gắng triển khai OpenCV một thuật toán chuẩn hóa cục bộ để giảm sự khác biệt của ánh sáng trong hình ảnh. Tôi đã tìm thấy một MATLAB function và tôi đã triển khai nó trong OpenCV. Tuy nhiên, kết quả mà tôi nhận được khác với kết quả được đưa ra bởi hàm MATLAB.Chuẩn hóa cục bộ trong OpenCV
Đây là mã của tôi:
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;
}
Chức năng NormInv
là ++ thực hiện C do Euan Dean trong this post.
Sau đây cho thấy kết quả mà tôi nhận được và kết quả lý thuyết, đối với cùng một giá trị của sigma1
và sigma2
(2,0 và 20,0, tương ứng)
Tôi đã cố gắng sử dụng các giá trị khác nhau cho sigma1
và sigma2
, nhưng không ai trong số họ có vẻ hoạt động. Tôi cũng đã thử làm blur1=0
và blur2=0
trong hàm Gaussian nhưng nó cũng không hoạt động.
Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn trước.
Cảm ơn bạn đã trả lời của bạn, đó là giải quyết vấn đề của tôi. Tôi thay đổi dòng floatGray = 255.0 * floatGray và sử dụng cv :: normalize (floatGray, res, 0, 255, NORM_MINMAX, CV_8UC1) thay vào đó và bây giờ nó hoạt động. Tôi nghĩ rằng nhân với 255 sẽ bình thường hóa hình ảnh, nhưng tôi đã sai. Cảm ơn. – stfani