【机器视觉学习笔记】伽马变换(C++)

平台:Windows 10 20H2
Visual Studio 2015
OpenCV 4.5.3


本文内容节选自《数字图像处理》第三版
C++源码修改自C++数字图像处理(1)-伽马变换 —— 图像大师

概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C++源码

变换函数

//函数名:gammaTransformation
//作用:实现伽马变换
//参数:
//matInput:输入图像
//fGamma : 伽马值
//fC : C值(缩放系数)
//返回值 :变换后的图像
Mat gammaTransformation(cv::Mat matInput, float fGamma, float fC = 1.0f)
{
	Mat chRGB[3];
	Mat matOutput[3];
	Mat output = matInput.clone();
	split(matInput, chRGB);
	for (unsigned char k = 0; k < 3; ++k)
	{
		//构造输出图像
		matOutput[k] = cv::Mat::zeros(chRGB[k].rows, chRGB[k].cols, chRGB[k].type());

		//循环中尽量避免除法
		float fNormalFactor = 1.0f / 255.0f;
		for (size_t r = 0; r < chRGB[k].rows; r++)
		{
			unsigned char* pInput = chRGB[k].data + r * chRGB[k].step[0];
			unsigned char* pOutput = matOutput[k].data + r * matOutput[k].step[0];
			for (size_t c = 0; c < chRGB[k].cols; c++)
			{
				//gamma变换
				float fOutput = std::pow(pInput[c] * fNormalFactor, fGamma) * fC;
				//数值溢出判断
				fOutput = fOutput > 1.0f ? 1.0f : fOutput;
				//输出
				pOutput[c] = static_cast<unsigned char>(fOutput * 255.0f);
			}
		}
	}
	merge(matOutput, 3, output);
	return output;
}

主函数

图片路径根据实际情况调整,注意反斜杠是转义字符的开头,故“\”应替换为“\\”

int main(int argc, char * argv[])
{
	string GammaPic = "Gamma=";
	float Gamma = 0.5;

	Mat Image = imread("D:\\Work\\OpenCV\\Workplace\\Test_1\\1.jpg");

	imshow("原图", Image);
	imshow(GammaPic + to_string(Gamma) + "变换后", gammaTransformation(Image, Gamma));

	waitKey(0);

	return 0;
}

效果

在这里插入图片描述
Gamma = 0.5 时
在这里插入图片描述
Gamma = 2 时
在这里插入图片描述

完整源码

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

using namespace cv;
using namespace std;

//函数名:gammaTransformation
//作用:实现伽马变换
//参数:
//matInput:输入图像
//fGamma : 伽马值
//fC : C值(缩放系数)
//返回值 :变换后的图像
Mat gammaTransformation(cv::Mat matInput, float fGamma, float fC = 1.0f)
{
	Mat chRGB[3];
	Mat matOutput[3];
	Mat output = matInput.clone();
	split(matInput, chRGB);
	for (unsigned char k = 0; k < 3; ++k)
	{
		//构造输出图像
		matOutput[k] = cv::Mat::zeros(chRGB[k].rows, chRGB[k].cols, chRGB[k].type());

		//循环中尽量避免除法
		float fNormalFactor = 1.0f / 255.0f;
		for (size_t r = 0; r < chRGB[k].rows; r++)
		{
			unsigned char* pInput = chRGB[k].data + r * chRGB[k].step[0];
			unsigned char* pOutput = matOutput[k].data + r * matOutput[k].step[0];
			for (size_t c = 0; c < chRGB[k].cols; c++)
			{
				//gamma变换
				float fOutput = std::pow(pInput[c] * fNormalFactor, fGamma) * fC;
				//数值溢出判断
				fOutput = fOutput > 1.0f ? 1.0f : fOutput;
				//输出
				pOutput[c] = static_cast<unsigned char>(fOutput * 255.0f);
			}
		}
	}
	merge(matOutput, 3, output);
	return output;
}

int main(int argc, char * argv[])
{
	string GammaPic = "Gamma=";
	float Gamma = 2;

	Mat Image = imread("D:\\Work\\OpenCV\\Workplace\\Test_1\\1.jpg");

	imshow("原图", Image);
	imshow(GammaPic + to_string(Gamma) + "变换后", gammaTransformation(Image, Gamma));

	waitKey(0);

	return 0;
}
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乙酸氧铍

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

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

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

打赏作者

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

抵扣说明:

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

余额充值