OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法

所谓图像增强就是把对比度低,看不清楚的图片处理成为对比度高,比较清楚的图片。

下面有三种增强方式,其中log和gamma变换是要自己实现的,效果的好与坏是需要自己调整参数的!!!!


1、均衡直方图

OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第1张图片

上图中图像灰度集中在100-200的区域内,显得灰蒙蒙的,在在经过均衡直方图的处理后,图像灰度均匀分布在0-255的区域内,变得清晰很多。均衡直方图在opencv种直接有接口,效果如下:

equalizeHist(input, output);

 OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第2张图片OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第3张图片

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变换

OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第4张图片

输入值为r,v和c都是参数,可以看出随着v值的增大,低灰度的地方被扩展,细节突出,高灰度的部分被压缩,细节被隐藏。应用在rgb图像中,需要将3通道图像分开,分别变换然后再融合起来。

OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第5张图片OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第6张图片

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变换

OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第7张图片

gamma变换和log变换很像,c和gamma为参数,r为输入值,gamma值很小的时候和log变换基本相同,gamma值很大的时候就和log变换效果相反了。

OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第8张图片OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法_第9张图片

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);
}

 

你可能感兴趣的:(OpenCV)