OpenCV直方图图像增强处理应用实践
1、处理方法1:基于直方图均衡化进行图片增强处理,使图像的灰度更加均衡,适用于对比度较低的图像增强。
主要步骤:
1)读取图像
2)将图像分割到3通道对象中
3)针对每个通道进行直方图均衡化
4)最后合并分割的3通道图像进行输出

2、处理方法1:使用直方图均衡化进行图片增强处理的完整代码:
//直方图均衡化处理
void testJunheng(Mat img)
{
imshow("原图", img);
Mat imgRGB[3];
split(img, imgRGB);
for (int i = 0; i < 3; i++)
{
//针对每个通道进行直方图均衡化
equalizeHist(imgRGB[i], imgRGB[i]);
}
//合并图像
merge(imgRGB, 3, img);
imshow("均衡化处理", img);
}


3、处理方法2:基于拉普拉斯算子的图像增强处理,使用与低对比度、地色度的图片处理,使用中心为5的8邻域拉普拉斯算子与图像卷积可以锐化增强图像的处理。

4、处理方法2:完整源代码如下:
//拉普拉斯算子图像锐化增强
void testLpulasi(Mat img)
{
imshow("原始图像", img);
Mat imgEnhance;
Mat kernel = (Mat_<float>(3,3)<<0,-1,0,0,5,0,0,-1,0);
filter2D(img, imgEnhance, CV_8UC3, kernel);
imshow("拉普拉斯算子图像增强", imgEnhance);
}


5、处理方法3:基于Log对数变换的图像增强,适用于显示图片低灰度部分更多的细节。
对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的内容,将其高灰度值部分压缩,减少高灰度部分的细节,从而达到增强图像滴灰度的图像处理。

6、处理方法3:基于对数log变换的图像增强,完整代码
//图像对数增强
void testLog(Mat img)
{
imshow("原始图像", img);
Mat imgLog(img.size(), CV_32FC3);
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
imgLog.at<Vec3f>(i, j)[0] = log(1 + img.at<Vec3b>(i, j)[0]);
imgLog.at<Vec3f>(i, j)[1] = log(1 + img.at<Vec3b>(i, j)[1]);
imgLog.at<Vec3f>(i, j)[2] = log(1 + img.at<Vec3b>(i, j)[2]);
}
}
//归一化
normalize(imgLog, imgLog, 0, 255, CV_MINMAX);
//转换为8 bit图像显示
convertScaleAbs(imgLog, imgLog);
imshow("Log对数增强效果", imgLog);
}

7、处理方法4:基于伽马变换的图像增强
伽马变换主要用于图像矫正,将灰度过高以及灰度过低的图像进行修正处理,增强对比度。
变换公式是对原图像的每个像素值做乘积运算。
//伽马图像增强
void gamaTest(Mat img)
{
imshow("原始图像", img);
Mat imgGamma(img.size(), CV_32FC3);
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
imgGamma.at<Vec3f>(i, j)[0] = (img.at<Vec3b>(i, j)[0])*(img.at<Vec3b>(i, j)[0])*(img.at<Vec3b>(i, j)[0]);
imgGamma.at<Vec3f>(i, j)[1] = (img.at<Vec3b>(i, j)[1])*(img.at<Vec3b>(i, j)[1])*(img.at<Vec3b>(i, j)[1]);
imgGamma.at<Vec3f>(i, j)[2] = (img.at<Vec3b>(i, j)[2])* (img.at<Vec3b>(i, j)[2])* (img.at<Vec3b>(i, j)[2]);
}
}
//归一化
normalize(imgGamma, imgGamma, 0, 255, CV_MINMAX);
//转换为8 bit图像显示
convertScaleAbs(imgGamma, imgGamma);
imshow("伽马增强效果", imgGamma);
}
