#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;
}
图像灰度变换--灰度反转 对数变换 分段线性变换 伽马校正
最新推荐文章于 2024-08-07 18:56:25 发布