知识点:
- 访问像素值
- 用零初始化矩阵
- 了解cv :: saturate_cast的作用以及它有用的原因
- 获取有关像素转换的一些很酷的信息
- 在实际例子中提高图像的亮度
理论知识:
图像处理
- 一般图像处理操作符是获取一个或多个输入图像并产生输出图像的功能。
- 图像变换可以看作:
点运算符(像素变换)
邻域(基于区域)运营商
像素转换
- 在这种图像处理变换中,每个输出像素的值仅取决于相应的输入像素值(加上,可能还有一些全局收集的信息或参数)。
- 这种算子的例子包括亮度和对比度调整以及颜色校正和变换。
亮度和对比度调整
-
两个常用的点过程是乘法和加法与常量:
G(X )= α ˚F(x )+ β
-
参数和\ beta通常称为增益和偏差参数; 有时这些参数据说分别控制对比度和亮度。α > 0,β是增益变量
-
您可以将视为源图像像素,将g(x)视为输出图像像素。然后,我们可以更方便地将表达式编写为:F(x )G(x )
G(i ,j )= α · f(i ,j )+ β
其中和j表示像素位于第i行和第j列
其中 α>0,β是增益变量
一些函数
Mat new_image = Mat::zeros(image.size(),image.type());
cv :: Mat :: zeros返回一个基于image.size()和image.type()的Matlab样式的零初始值设定项
image.convertTO(new_image,-1,alpha,beta);
其中cv::Mat::convertTo将有效地执行* new_image = a * image + beta *。下面的两种方法都给出相同的结果,但convertTo更优化,工作速度更快
例子:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage, dst;
srcImage = imread("E:/image/6.jpg");
if (srcImage.empty()) {
printf("没有找到图片");
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", srcImage);
dst = Mat::zeros(srcImage.size(), srcImage.type());
float alpha = 1.2;
float beta = 30;
int heigth = srcImage.rows;
int width = srcImage.cols;
int nc = srcImage.channels();
for (int row = 0; row < heigth; row++) {
for (int col = 0; col < width; col++) {
if (nc == 1) {
float v = srcImage.at<uchar>(row, col); //获取像素值
dst.at<uchar>(row, col) = saturate_cast<uchar>(alpha*v + beta); //像素值取反赋值
}
else if (nc == 3) {
float b = srcImage.at<Vec3b>(row, col)[0];
float g = srcImage.at<Vec3b>(row, col)[1];
float r = srcImage.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha*b + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha*g + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha*r + beta);
}
}
}
namedWindow("调整图像亮度和对比度", WINDOW_AUTOSIZE);
imshow("调整图像亮度和对比度", dst);
waitKey(0);
return 0;
}
效果图:
- 第二个例子:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat srcImage, dst;
srcImage = imread("E:/image/6.jpg");
if (srcImage.empty()) {
printf("没有找到图片");
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", srcImage);
dst = Mat::zeros(srcImage.size(), srcImage.type());
float alpha = 1.2;
float beta = 30;
srcImage.convertTo(dst, -1, alpha, beta);
namedWindow("调整图像亮度和对比度", WINDOW_AUTOSIZE);
imshow("调整图像亮度和对比度", dst);
waitKey(0);
return 0;
}
效果图: