c++图像处理之对比度拉伸变换
对比度拉伸变换对图像进行对比度拉伸变换,压缩动态范围,将我们所关注的边界特征信息详细化,从而使得输出图像亮区域更亮,暗区域更暗,提高了图像的对比度。opencv中的 LUT函数(look up table)为查表函数,void LUT(InputArray src, InputArray lut, OutputArray dst);InputArray src:输入图像Out...
·
对比度拉伸变换 对图像进行对比度拉伸变换,压缩动态范围,将我们所关注的边界特征信息详细化,从而使得输出图像亮区域更亮,暗区域更暗,提高了图像的对比度。
opencv中的 LUT函数(look up table)为查表函数,
void LUT(InputArray src, InputArray lut, OutputArray dst);
InputArray src:输入图像
OutputArray dst:输出图像
InputArray lut:查找表
#include<opencv2/opencv.hpp>
#include<iostream>
#include<string>
#include<vector>
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<uchar>(i) = 0;
else if (i > pixMax)
lookut.at<uchar>(i) = 255;
else
lookut.at<uchar>(i) = static_cast<uchar>(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<Mat> 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;
}
结果如下,图像变得更加对比清晰

更多推荐


所有评论(0)