算子的概念
首先介绍一下算子的概念。一般的图像处理算子都是一个函数,输入一个或多个图像,产生输出图像。
//算子的一般形式
g(x) = h(f(x))
g(x) = h(f0(x) .... fn(x))
点操作
这里所将的图像亮度和对比度的调整操作,其实属于图像处理变换中比较简单的一种—点操作。
点操作的特点:仅仅根据输入像素值(有时有其他参数)来计算相应的输出像素值
这类算子包括:亮度和对比度调整、颜色校正和变换
亮度和对比度算子
g(x) = a * f(x) + b
//f(x) => 原图像
//g(x) => 输出图像
//a => 增益 (a > 0),常用来调整对比度
//b => 偏置,常用来调整亮度
// 图像时一个矩阵,因此可以调整上面的公式为:
g(i, j) = a * f(i , j) + b
//这就是操作时的理论公式
示例
Mat src;
Mat showpic;
void on_BrightnessAndContrast(int , void *);
int BrightnessValue = 50;
int ContrastValue = 50;
int main()
{
src = imread("D:\\c plus plus\\lena.tiff");
if (!src.data)
{
cout << "imread error" << endl;
return -1;
}
src.copyTo(showpic);
namedWindow("test", WINDOW_AUTOSIZE);
createTrackbar("Brightness", "test", &BrightnessValue, 300, on_BrightnessAndContrast);
createTrackbar("Contrast", "test", &ContrastValue, 300, on_BrightnessAndContrast);
on_BrightnessAndContrast(BrightnessValue, 0);
on_BrightnessAndContrast(ContrastValue, 0);
while (char(waitKey(1)) != 'q')
{
;
}
return 0;
}
void on_BrightnessAndContrast(int, void*)
{
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
for (int changls = 0; changls < 3; changls++)
{
showpic.at<Vec3b>(i, j)[changls] = saturate_cast<uchar>((ContrastValue * 0.01) * src.at<Vec3b>(i, j)[changls] + BrightnessValue);
}
}
}
imshow("test", showpic);
}