c++图像处理之对比度拉伸变换

对比度拉伸变换  对图像进行对比度拉伸变换,压缩动态范围,将我们所关注的边界特征信息详细化,从而使得输出图像亮区域更亮,暗区域更暗,提高了图像的对比度。

opencv中的  LUT函数(look up table)为查表函数,

void LUT(InputArray src, InputArray lut, OutputArray dst);

InputArray src:输入图像

OutputArray dst:输出图像

InputArray lut:查找表

#include
#include
#include
#include
using namespace std;
using namespace cv;

void contrastStretch(Mat &img)
{
	if (img.empty())
	{
		cerr << "image empty" << endl;
		return;
	}
	// 计算图像的最大最小值
	double pixMin, pixMax;
	minMaxLoc(img, &pixMin, &pixMax);

	//create lut table
	Mat lookut(1, 256, CV_8U);
	for (int i = 0; i < 256; i++)
	{
		if (i < pixMin)
			lookut.at(i) = 0;
		else if (i > pixMax)
			lookut.at(i) = 255;
		else 
			lookut.at(i) = static_cast(255.0*(i - pixMin) / (pixMax - pixMin) + 0.5);
	}
	LUT(img, lookut, img); //(look up table)即为查表函数
}

int main()
{
	Mat srcImage = imread(img_name,1);
	if (!srcImage.data)
		return 0;
	Mat resultImage;

	vector channel;
	split(srcImage, channel);
	contrastStretch(channel[0]);
	contrastStretch(channel[1]);
	contrastStretch(channel[2]);
	merge(channel, resultImage);//合并3个通道

	imshow("srcImage", srcImage);
	imshow("resultImage", resultImage);
	waitKey(0);

	return 0;
}

结果如下,图像变得更加对比清晰

 

你可能感兴趣的:(c++)