#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main()
{
//引入图像
Mat src, dst;
src = imread("C:\\Users\\pc\\Pictures\\Camera Roll\\2.jpeg");
//伽马变换
imshow("src", src);
//convertTo函数里面的参数1.0/255.0指灰度的精度。这里设置为每一个灰度刻度大小为1.0/255.0。
//convertTo函数把一个矩阵从一种数据类型转换到另一种数据类型,方便接下来的处理。具体用法以后再去了解
src.convertTo(src, CV_64F,1.0/255.0); //转化为32位浮点型并归一化处理
int height = src.rows;
int width = src.cols*3;
dst = cv::Mat::zeros(src.size(), src.type());//得到一个大小与数据类型均与src相同的0矩阵(即全黑矩阵,灰度值为0就是全黑)
float gamma = 1.5;//gamma就是伽马变换公式中的指数γ。
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
//Mat类中的at方法作用:用于获取图像矩阵某点的值或改变某点的值。
dst.at<double>(i, j) = std::pow(src.at<double>(i, j), gamma);
//std::pow(x,y),计算x的y次方.这里就是src.at<double>(i, j)返回的矩阵中某
//点的值做底数,gamma做指数。
}
}
dst.convertTo(dst, CV_8U, 255.0);
//输出图像
//imshow("src", src);
imshow("dst", dst);
waitKey(0);
return 0;
}