参考:
1、https://docs.opencv.org/3.2.0/
2、https://github.com/opencv/opencv/
两个常用的点过程是乘法和加法常量:
g(x)= α∗f(x)+ β
参数 α > 0和 β 通常被称为增益和偏置参数; 有时这些参数分别被称为控制对比度和亮度。
其中 i 和 j 表示像素位于第 i 行第 j 列。
#include
#include
using namespace cv;
double alpha; /*< Simple contrast control */
int beta; /*< Simple brightness control */
int main(int argc, char** argv)
{
Mat image = imread(argv[1]);
Mat new_image = Mat::zeros(image.size(), image.type()); //与image 大小(h*w*c) 类型一致
std::cout << " Basic Linear Transforms " << std::endl;
std::cout << "-------------------------" << std::endl;
std::cout << "* Enter the alpha value [1.0-3.0]: "; std::cin >> alpha;
std::cout << "* Enter the beta value [0-100]: "; std::cin >> beta;
for (int y = 0; y < image.rows; y++) {
for (int x = 0; x < image.cols; x++) {
for (int c = 0; c < 3; c++) {
new_image.at(y, x)[c] =
saturate_cast(alpha*(image.at(y, x)[c]) + beta);
}
}
}
namedWindow("Original Image", 1);
namedWindow("New Image", 1);
imshow("Original Image", image);
imshow("New Image", new_image);
waitKey();
return 0;
}
1、我们首先创建参数来保存要由用户输入的 α 和 β :
double alpha;
int beta;
2、我们使用cv :: imread加载图像,并将其保存在Mat对象中:
Mat image = imread( argv[1] );
3、现在,由于我们将对这个图像进行一些转换,我们需要一个新的Mat对象来存储它。 另外,我们希望这具有以下特点:
Mat new_image = Mat::zeros( image.size(), image.type() );
我们观察到cv :: Mat :: zeros返回一个基于image.size()和image.type()的Matlab风格的零初始化器,
4、现在,执行操作 g(i,j) = α ⋅ f(i,j) + β ,我们将访问图像中的每个像素。 由于我们使用BGR图像进行操作,因此每像素(B,G和R)将有三个值,因此我们也将分别访问它们。 这是一段代码:
for( int y = 0; y < image.rows; y++ ) {
for( int x = 0; x < image.cols; x++ ) {
for( int c = 0; c < 3; c++ ) {
new_image.at(y,x)[c] =
saturate_cast( alpha*( image.at(y,x)[c] ) + beta );
}
}
}
注意以下几点:
5、最后,我们创建窗口,并显示图像,通常的方式。
namedWindow("Original Image", 1);
namedWindow("New Image", 1);
imshow("Original Image", image);
imshow("New Image", new_image);
waitKey(0);
注意: |
不使用for循环来访问每个像素,我们可以简单地使用这个命令:
image.convertTo(new_image, -1, alpha, beta);
其中cv :: Mat :: convertTo将有效地执行* new_image = a * image + beta *。 不过,我们想告诉你如何访问每个像素。 在任何情况下,这两种方法给出了相同的结果,但convertTo更优化,工作速度更快。