前言
1.在处理摄像头时,或者在图像中物体轮廓提取时,常常会碰到一些背景偏暗的图像,为了更好的得到效果,那么图像增强会是一个不错的选择。
2.我这里使用的库OpenCV版本是3.30,关于opencv学习,有兴趣的看我之前发的博客,可以加之前博客后面给的兴趣群。
代码演示
1.代码
/*多尺度视网膜增强*/
//第一个参数输入的原始图像
//第二参数输出的图像
//第三个参数
void multiScaleRetinex(const Mat &src, Mat &dst)
{
//增强尺度
int gain = 128;
int offset = 128;
Mat dst_log, dst_f, res_f;
vector<double> sigemas;
vector<double> weights;
for (int i = 0; i < 3; i++)
{
weights.push_back(1.f / 3);
}
sigemas.push_back(30);
sigemas.push_back(150);
sigemas.push_back(300);
//转换数据
src.convertTo(dst_f, CV_32FC3);
//对数变换
log(dst_f, dst_log);
//根据给定的权重归一化
double weight = 0;
size_t num = weights.size();
for (size_t i = 0; i < num; i++)
{
weight += weights[i];
}
if (weight != 1.0f)
{
dst_log *= weight;
}
//过滤
for (size_t i = 0; i < num; i++)
{
Mat blur = dst_f.clone();
gaussianFilter(blur, sigemas[i]);
log(blur, res_f);
//计算加权差
res_f *= weights[i];
dst_log -= res_f;
}
dst = (dst_log * gain) + offset;
dst.convertTo(dst, CV_8UC3);
}
//高斯滤波
void gaussianFilter(Mat &img, double sigma)
{
int filter_size;
//不能大于300,大于300强行改成300
if (sigma > 300)
{
sigma = 300;
}
//获取滤波器的大小,转为奇数
filter_size = (int)floor(sigma * 6) / 2;
filter_size = filter_size * 2 + 1;
//如果小于3则返回
if (filter_size < 3)
{
return;
}
//高斯模数
GaussianBlur(img, img, cv::Size(filter_size, filter_size), 0);
}
2.运行效果