图像变换可以看作如下:
- 像素变换 – 点操作
- 邻域操作 – 区域
- 像素变换 – 点操作
- 邻域操作 – 区域
调整图像亮度和对比度属于像素变换-点操作
公式:
α:表示对比度;β:表示亮度;
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src;
src = imread("D:/opencv/test.jpg");
if (src.empty()) {
printf("imread imgae error");
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
//cvtColor(src, src, CV_BGR2GRAY);//把src转为灰度图像
int height = src.rows;
int width = src.cols;
int channels = src.channels();
double alpha = 1.2;
double bata = 30;
Mat dst;
dst = Mat::zeros(src.size(), src.type());
//src.convertTo(dst, CV_32F);
printf("height=%d width=%d channels=%d", height, width, channels);
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (channels == 1) {
dst.at<uchar>(row, col) = saturate_cast<uchar>(alpha * src.at<uchar>(row, col) + bata);
}
if (channels == 3) {
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha * src.at<Vec3b>(row, col)[0] + bata);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha * src.at<Vec3b>(row, col)[1] + bata);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha * src.at<Vec3b>(row, col)[2] + bata);
}
}
}
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey(0);
return 0;
}
效果图: