所谓图像增强就是把对比度低,看不清楚的图片处理成为对比度高,比较清楚的图片。
下面有三种增强方式,其中log和gamma变换是要自己实现的,效果的好与坏是需要自己调整参数的!!!!
1、均衡直方图
上图中图像灰度集中在100-200的区域内,显得灰蒙蒙的,在在经过均衡直方图的处理后,图像灰度均匀分布在0-255的区域内,变得清晰很多。均衡直方图在opencv种直接有接口,效果如下:
equalizeHist(input, output);
void equalHist(Mat& m_img)
{
Mat m_rgb[3];
split(m_img, m_rgb);
for (int i = 0; i < 3; i++)
{
equalizeHist(m_rgb[i], m_rgb[i]);
}
merge(m_rgb, 3, m_img);
}
2、log变换
输入值为r,v和c都是参数,可以看出随着v值的增大,低灰度的地方被扩展,细节突出,高灰度的部分被压缩,细节被隐藏。应用在rgb图像中,需要将3通道图像分开,分别变换然后再融合起来。
void logTrans(Mat& m_img, int n_v, int n_c)
{
Mat m_imgLog(m_img.size(), CV_32FC3);
for (int i = 0; i < m_img.rows; i++)
for (int j = 0; j < m_img.cols; j++)
{
m_imgLog.at(i, j)[0] = n_c * log(1 + n_v * m_img.at(i, j)[0]) / log(n_v + 1);
m_imgLog.at(i, j)[1] = n_c * log(1 + n_v * m_img.at(i, j)[1]) / log(n_v + 1);
m_imgLog.at(i, j)[2] = n_c * log(1 + n_v * m_img.at(i, j)[2]) / log(n_v + 1);
}
//归一化到0-255
normalize(m_imgLog, m_imgLog, 0, 255, CV_MINMAX);
//转换成8bit图像显示
convertScaleAbs(m_imgLog, m_img);
}
3、gamma变换
gamma变换和log变换很像,c和gamma为参数,r为输入值,gamma值很小的时候和log变换基本相同,gamma值很大的时候就和log变换效果相反了。
void gammaTrans(Mat& m_img, double gamma, int n_c)
{
Mat m_imgGamma(m_img.size(), CV_32FC3);
for (int i = 0; i < m_img.rows; i++)
for (int j = 0; j < m_img.cols; j++)
{
m_imgGamma.at(i, j)[0] = n_c * pow(m_img.at(i, j)[0], gamma);
m_imgGamma.at(i, j)[1] = n_c * pow(m_img.at(i, j)[1], gamma);
m_imgGamma.at(i, j)[2] = n_c * pow(m_img.at(i, j)[2], gamma);
}
normalize(m_imgGamma, m_imgGamma, 0, 255, CV_MINMAX);
convertScaleAbs(m_imgGamma, m_img);
}