图像灰度变换--灰度反转 对数变换 分段线性变换 伽马校正

该代码示例展示了使用OpenCV库进行图像处理的几种方法,包括灰度反转、对数变换、分段线性变换(对比度拉伸)和伽马校正。这些技术用于改变图像的亮度和对比度,以增强视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<opencv2/opencv.hpp>


/*灰度反转*/
void Image_inversion(cv::Mat& src, cv::Mat& dst) 
{
	dst = cv::Mat::zeros(src.size(), CV_8U);
	for (int i = 0; i < src.rows; i++) 
	{
		for (int j = 0; j < src.cols; j++) 
		{
			dst.at<uchar>(i, j) = 255 - src.at<uchar>(i, j); //开始处理每个像素
		}
	}
}

/*对数变换*/
void LogTransform(cv::Mat& src, cv::Mat& dst, double c)
{
	dst = cv::Mat::zeros(src.size(), CV_64F);
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			dst.at<double>(i, j) = c * log(double(1.0 + src.at<uchar>(i, j))); //开始处理每个像素
		}
	}

	cv::normalize(dst, dst, 0, 255, cv::NORM_MINMAX); //经过对比拉升(将像素值归一化到0-255)得到最终的图像
	dst.convertTo(dst, CV_8U);  //转回无符号8位图像
}

/*分段线性变换——对比度拉伸*/
void contrast_stretching(cv::Mat & src, cv::Mat & dst, double a, double b, double c, double d) 
{
	double min = 0, max = 0;
	cv::minMaxLoc(src, &min, &max, 0, 0);
	dst = cv::Mat::zeros(src.size(), CV_64F);
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			if(min <= src.at<uchar>(i, j) < a)
			dst.at<double>(i, j) = c / a * src.at<uchar>(i, j); 
			else if (a <= src.at<uchar>(i, j) < b)
				dst.at<double>(i, j) = (d - c) / (b - a) * src.at<uchar>(i, j);
			else if (b <= src.at<uchar>(i, j) < max)
				dst.at<double>(i, j) = (max - d) / (max - b) * src.at<uchar>(i, j);
		}
	}
	dst.convertTo(dst, CV_8U);  //转回无符号8位图像
}

/*伽马校正*/
void gamma_correction(cv::Mat& src, cv::Mat& dst, float K) 
{
	uchar LUT[256];
	dst = src.clone();
	for (int i = 0; i < 256; i++) 
	{
		float f = pow(i / 255.0, K);
		LUT[i] = (uchar)(f * 255.0);
	}

	cv::MatIterator_<uchar> it = dst.begin<uchar>();
	cv::MatIterator_<uchar> it_end = dst.end<uchar>();
	for (; it != it_end; ++it)
		* it = LUT[(*it)];
}



int main() 
{
	cv::Mat src = cv::imread("1.jpg", 0), dst;

	//Image_inversion(src, dst); //图像反转
	//LogTransform1(src, dst, 10); //对数变换1
	//contrast_stretching(src, dst, 20, 100, 30, 200); //分段函数变换
	gamma_correction(src, dst, 3);

	cv::imwrite("result.jpg", dst);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给算法爸爸上香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值