1.5 改变图像的对比度和亮度

图像处理

    点算子:对每个像素的操作不依赖它的邻域像素。

    邻域算子:对每个像素的输出值依赖于其邻域像素。

像素变换

    在这一类图像处理变换中,仅仅根据输入像素值(有时可加上某些全局信息或参数),计算相应输出像素值。

    这类算子包括,亮度和对比度调整,以及颜色校正和变换。

亮度和对比度调整

    两种常用的点算子,是用常数对点进行乘法和加法运算。

                g( x )=a*f( x )+ b

    两个参数a>0,和b 一般称为增益和偏置参数,分别用来控制对比度和亮度。

    将f(x)看做源图像像素,将g(x)看做输出图像像素。

              g( i, j )=a*f( i, j )+ b  

 saturate_cast(防止溢出)

    对像素进行加减乘除运算之后,结果为负,转化为0;结果大于255转化为255。

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main() {
	double alpha;
	int beta;
	Mat image = imread("D:\\OpenCVT\\2.jpg");
	Mat new_image = Mat::zeros(image.size(), image.type());
	//初始化
	cin >> alpha;
	cin >> beta;
	//执行运算 new_image=alpha*image+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<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha*(image.at<Vec3b>(y, x)[c]) + beta);
			}
		}
	}
	//创建窗口
	namedWindow("Original Image", 1);
	namedWindow("New Image", 1);

	//显示图像
	imshow("Original Image", image);
	imshow("New Image", new_image);
	waitKey();
	return 0;
}

 代码中for循环可直接用函数

image.convertTo(new_image, -1, alpha, beta);

猜你喜欢

转载自www.cnblogs.com/zuoyou151/p/9582811.html