Opencv学习笔记-线性变换

1.图像的线性变换是比较简单的一个变换,对图像进行公式dest(x,y) = a*src( x, y)+b 的操作就是线性变换的实际。其中公式中变换直线的斜率a也叫做增益系数,截距b也称为偏置系数。

2.对图像进行线性操作的效果主要有两点,一是可以提高对比度,二是可以提高亮度。在公式中体现在,a对应着对比度的变化,b对应着亮度的提高。这个与对比度的定义

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就可容易地显示生动、丰富的色彩,当对比率高达300:1时,便可支持各阶的颜色。)也相对应。

3.所以可以知道,a<0时,对比度减少,反之对比度增加。b>0时亮度增加,b<0时亮度减少。

实现的函数代码:

Mat test(Mat srcImage, float a, int b)
{

	Mat result = Mat::zeros(srcImage.size(), srcImage.type());//创建一个完全相同规格的图片
	/*遍历每个像素点,进行线性操作*/
	for (int i = 0; i < srcImage.rows; i++)
	{
		for (int j = 0; j < srcImage.cols; j++)
		{
			for (int c = 0; c  < 3; c ++)
			{
				result.at<Vec3b>(i,j)[c] = saturate_cast<uchar>(a*srcImage.at<Vec3b>(i,j)[c] + b);//线性变换,saturate_cast作用是防止数组越界
			}
		}
	}
	return result;
}
完整测试代码;

#include<iostream>
#include <opencv2/opencv.hpp> 
using namespace std;
using namespace cv;

Mat test(Mat srcImage, float a, int b)
{

	Mat result = Mat::zeros(srcImage.size(), srcImage.type());//创建一个完全相同规格的图片
	/*遍历每个像素点,进行线性操作*/
	for (int i = 0; i < srcImage.rows; i++)
	{
		for (int j = 0; j < srcImage.cols; j++)
		{
			for (int c = 0; c  < 3; c ++)
			{
				result.at<Vec3b>(i,j)[c] = saturate_cast<uchar>(a*srcImage.at<Vec3b>(i,j)[c] + b);//线性变换,saturate_cast作用是防止数组越界
			}
		}
	}
	return result;
}
int main()
{
	float a = 1.3;
	int b = 60;
	Mat srcImage = imread("C:\\Users\\haoming\\Pictures\\232034060884566900.jpg");
	if (srcImage.empty())
	{
		return -1;
	}
	imshow("srcImage",srcImage);
	waitKey(0);

	Mat result = test(srcImage, a, b);
	imshow("result",result);
	waitKey(0);

	return 0;
}


测试效果:


灰度图的线性变换也是类似

实现代码:

Mat testgray(Mat srcImage, float a, int b)
{
	Mat result = Mat::zeros(srcImage.size(), srcImage.type());
	for (int i = 0; i < srcImage.rows; i++)
	{
		for (int j = 0; j < srcImage.cols; j++)
		{
			
		
				result.at<uchar>(i,j) = saturate_cast<uchar>(a*srcImage.at<uchar>(i,j) + b);//线性变换,saturate_cast作用是防止数组越界
			
		}
	}
	return result;
}

完整测试代码:

int main()
{
	float a = 1.8;
	int b = 60;
	Mat srcImage = imread("C:\\Users\\haoming\\Pictures\\232034060884566900.jpg",0);//读入灰度图
	if (srcImage.empty())
	{
		return -1;
	}
	imshow("srcImage",srcImage);
	waitKey(0);

	Mat result = testgray(srcImage, a, b);
	imshow("result",result);
	waitKey(0);

	return 0;
}

测试效果:



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mango_haoming/article/details/62051771
个人分类: opencv
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭