《OpenCV3编程入门》学习笔记5 Core组件进阶(四)图像对比度、亮度值调整

news/2025/2/6 0:49:03/

第5章 Core组件进阶

5.4 图像对比度、亮度值调整

5.4.1 理论依据

1.算子:一般图像处理算子都是一个函数,接受一个或多个输入图像,并产生输出图像
2.算子一般形式:在这里插入图片描述
3.点操作(point operators):仅根据输入像素值计算输出像素值,这类算子包括亮度(brightness)和对比度(contrast)调整、颜色矫正(color correction)、变换(transformations)
4.两种最常用的点操作是乘上一个常数(对应对比度调节)以及加上一个常数(对应亮度值调节)
(1)公式如下:在这里插入图片描述(具体到像素:在这里插入图片描述
(2)f(x)表示源图像像素,g(x)表示输出图像像素,a控制图像对比度(被称为增益gain),b控制图像亮度(被称为偏置bias)

5.4.2 示例程序

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace cv;
using namespace std;//全局函数声明
static void on_ContrastAndBright(int, void *);
//全局变量声明
int g_nContrastValue;//对比度值
int g_nBrightValue;//亮度值
Mat g_srcImage, g_dstImage;int main()
{//[1]输入图像g_srcImage = imread("love.jpg");if (!g_srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~!"); return false; }g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());//[2]设定对比度和亮度初值g_nContrastValue = 80;g_nBrightValue = 80;//[3]创建效果图窗口namedWindow("[效果图窗口]");//[4]创建轨迹条createTrackbar("对比度:", "[效果图窗口]", &g_nContrastValue, 300, on_ContrastAndBright);createTrackbar("亮  度:", "[效果图窗口]", &g_nBrightValue, 200, on_ContrastAndBright);//[5]进行回调函数初始化on_ContrastAndBright(g_nContrastValue, 0);on_ContrastAndBright(g_nBrightValue, 0);//[6]按下"q"键时,程序退出while(char(waitKey(1))!='q'){ }return 0;
}
//改变图像对比度和亮度值的回调函数
static void on_ContrastAndBright(int, void *)
{//创建窗口namedWindow("[原始图窗口]");//三个for循环,执行运算g_dstImage(i,j)=a*g_srcImage(i,j)+bfor (int x = 0; x < g_srcImage.rows; x++){for (int y = 0; y < g_srcImage.cols; y++){for (int c = 0; c < 3; c++){g_dstImage.at<Vec3b>(x, y)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(x, y)[c]) + g_nBrightValue);//saturate_cast模板函数,用于溢出保护,原理:if(data<0) data=0; else if(data>255) data=255;//a的取值为0.0-3.0的浮点值,但轨迹条一般取整数,将对比度值nContrastValue参数设为0到300,式子中乘以0.01}}}//显示图像imshow("[原始图窗口]", g_srcImage);imshow("[效果图窗口]", g_dstImage);
}

http://www.ppmy.cn/news/611409.html

相关文章

npm修改淘宝原

//修改之前查看一下npm config get registry https://registry.npmjs.org/ //设置源npm config set registry https://registry.npm.taobao.org //确认npm config get registry 转载于:https://www.cnblogs.com/huochaihe/p/10562132.html

用户自定义协议client/server代码示例

用户自定义协议client/server代码示例 代码参考链接&#xff1a;https://github.com/sogou/workflow message.h message.cc server.cc client.cc 关于user_defined_protocol 本示例设计一个简单的通信协议&#xff0c;并在协议上构建server和client。server将client发送…

Java 静态变量,静态方法,静态常量(java static 关键字)

Java 静态变量,静态方法,静态常量 就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main 类中用到一个 NAME常量 而 有一个Book类中也用到了NAME常量,这时就没有必要在2个类中都…

《OpenCV3编程入门》学习笔记5 Core组件进阶(五)离散傅里叶变换(DFT)

第5章 Core组件进阶 5.5 离散傅里叶变换&#xff08;Discrete Fourier Transform&#xff0c;DFT&#xff09; 5.5.1 离散傅里叶变换原理 1.对一张图像使用傅里叶变换就是把它分解成正弦和余弦&#xff0c;将图像从空间域&#xff08;spatial domain&#xff09;转换到频域&…

sklearn.model_selection.train_test_split随机划分训练集和测试集

1 函数用途 train_test_split()是交叉验证中常用的函数&#xff0c;功能是将数组或矩阵按比例随机划分为训练集和测试集&#xff0c;使用方法为&#xff1a; X_train,X_test, y_train, y_test cross_validation.train_test_split(train_data,train_target,test_size0.4, random…

Java 数值大小比较

1: 2个数的最大数 package me; public class Me {public static void main(String[] args) {int a 10;int b 6;int max a>b?a:b; //方法一System.out.println(max);int max1;if (a>b){ //方法二max1 a;System.out.println(max1);}else if (a<b){max1 b;System.…

Selenium Web元素交互

目录 目录 Web元素交互 附加验证 点击 发送键位 清除 使用选择列表元素 类型 单选 复选 构建类 选项列表 全部选项 选中的选项 选项 文本 值 序号 禁用的选项 取消选择选项 Web元素交互 用于操纵表单的高级指令集. 仅有五种基本命令可用于元素的操作: 点…

程序设计团队项目

目录 程序设计团队项目团队作业&#xff08;一&#xff09;&#xff1a;团队展示任务一&#xff1a;团队组建任务二&#xff1a;团队展示其他团队作业&#xff08;二&#xff09;&#xff1a;项目选题任务一&#xff1a;团队选题任务二&#xff1a;需求分析其他团队作业&#x…