cv::Mat correctUnevenIllumination(const cv::Mat& gray)
{
CV_Assert(gray.type() == CV_8U);
// 1. 估计背景
cv::Mat background;
cv::GaussianBlur(
gray,
background,
cv::Size(0, 0),
30
);
// 2. 转 float
cv::Mat imgF, bgF;
gray.convertTo(imgF, CV_32F);
background.convertTo(bgF, CV_32F);
// 3. 除法校正
cv::Mat corrected;
corrected = imgF / (bgF + 1.0f);
// 4. 归一化
cv::normalize(
corrected,
corrected,
0,
255,
cv::NORM_MINMAX
);
// 5. 转回 8bit
cv::Mat result;
corrected.convertTo(result, CV_8U);
return result;
}


处理前后对比,效果可以