图像亮度调整
遍历像素的小练习,对每个像素dst[row][col] = alpha×src[row][col]+beta改变图像亮度
代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat src, dst;
src = imread("girl6.jpg");
if (!src.data)
{
printf("Wrong with Loading img!\n");
return -1;
}
int height = src.rows, width = src.cols;
dst = Mat::zeros(src.size(), src.type());
float alpha = 1.2;
float beta = 30;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (src.channels() == 3)
{
float b = src.at<Vec3b>(row, col)[0];
float g = src.at<Vec3b>(row, col)[1];
float r = src.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha + beta);
}
else if (src.channels() == 1)
{
float gray = src.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(gray * alpha + beta);
}
}
}
char input_win[] = "input img";
namedWindow(input_win, WINDOW_AUTOSIZE);
imshow(input_win, src);
char output_win[] = "output img";
namedWindow(output_win, WINDOW_AUTOSIZE);
imshow(output_win, dst);
waitKey(0);
return -1;
}
加点细节
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int alpha = 1;
int beta = 30;
Mat src, dst;
void Process(int, void*);
Mat change(int alpha, int beta, Mat src);
int main() {
src = imread("girl6.jpg");
if (!src.data)
{
printf("Wrong with Loading img!\n");
return -1;
}
namedWindow("res");
createTrackbar("alpha", "res", &alpha, 40, Process);
createTrackbar("beta", "res", &beta, 40, Process);
waitKey(0);
return -1;
}
void Process(int, void*)
{
dst = change(alpha, beta, src);
imshow("res", dst);
}
Mat change(int alpha2, int beta2, Mat src)
{
int height = src.rows, width = src.cols;
float alpha1 = float(alpha2) / 10;
float beta1 = float(beta2);
Mat tmp = Mat::zeros(src.size(), src.type());
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (src.channels() == 3)
{
float b = src.at<Vec3b>(row, col)[0];
float g = src.at<Vec3b>(row, col)[1];
float r = src.at<Vec3b>(row, col)[2];
tmp.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha1 + beta1);
tmp.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha1 + beta1);
tmp.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha1 + beta1);
}
else if (src.channels() == 1)
{
float gray = src.at<uchar>(row, col);
tmp.at<uchar>(row, col) = saturate_cast<uchar>(gray * alpha1 + beta1);
}
}
}
return tmp;
}