OpenCV学习笔记(一)对比度拉伸

    分段线性是线性变换的分段形式,分段线性中的各个函数是任意设定的。分段线性能够实现对图像某些区域的特定分析,常用于图像增强中。最简单的就是对比度拉伸。

    对比度拉伸技术是通过扩展图像灰度级动态范围来实现的,它可以扩展对应的全部灰度范围。提高图像的对比度可以增强图像各个区域的对比效果,对图像感兴趣的部分进行增强,而对图像不感兴趣的部分进行抑制,对比度拉伸是重要的技术之一。

    分段的灰度拉伸技术可以同时结合直方图处理技术,更加灵活的控制输出图像的直方图分布,对感兴趣的区域进行调整,增强画面的品质。对于图像较暗的区域,采用k>0,进行灰度拉伸扩展;对于图像较亮的区域,采用k<0,进行灰度拉伸压缩。

    具体的实现效果:

#include 
#include 
#include 
#include 
using namespace cv;
using namespace std;
Mat contrastStretch(Mat srcImage)
{
	Mat resultImage = srcImage.clone();//"=";"clone()";"copyTo"三种拷贝方式,前者是浅拷贝,后两者是深拷贝。
	int nRows = resultImage.rows;
	int nCols = resultImage.cols;
	//判断图像的连续性
	if (resultImage.isContinuous())
	{
		nCols = nCols*nRows;
		nRows = 1;
	}
	//图像指针操作
	uchar *pDataMat;
	int pixMax = 0, pixMin = 255;
	//计算图像的最大最小值
	for (int j = 0; j < nRows; j++)
	{
		pDataMat = resultImage.ptr(j);//ptr<>()得到的是一行指针
		for (int i = 0; i < nCols; i++)
		{
			if (pDataMat[i] > pixMax)
				pixMax = pDataMat[i];
			if (pDataMat[i] < pixMin)
				pixMin = pDataMat[i];
		}
	}
	//对比度拉伸映射
	for (int j = 0; j < nRows; j++)
	{
		pDataMat = resultImage.ptr(j);
		for (int i = 0; i < nCols; i++)
		{
			pDataMat[i] = (pDataMat[i] - pixMin) * 255 / (pixMax - pixMin);
		}
	}
	return resultImage;
}
int main()
{
	Mat srcImage = imread("D:\\1.jpg");
	if (!srcImage.data)
		return -1;
	Mat srcGray;
	cvtColor(srcImage, srcGray, CV_RGB2GRAY);
	imshow("srcGray", srcGray);
	Mat resultImage = contrastStretch(srcGray);
	imshow("resultImage", resultImage);
	waitKey(0);
	return 0;
}
OpenCV学习笔记(一)对比度拉伸_第1张图片 OpenCV学习笔记(一)对比度拉伸_第2张图片

你可能感兴趣的:(OpenCV)