当前位置: 首页 > news >正文

open cv对比度与亮度调节

图像变换可以看作如下
像素变换-点操作

调整图像亮度和对比度属于像素变换-点操作

邻域操作-区域 图像卷积 梯度计算

g(i,j)=a*f(i,j)+b其中a>0,b是增益变量


重要的API

Mat new image = Mat:zeros( image,size(), image.type();
建一张跟原图像大小和类型一致的空白图像、像素值初始化为0

saturate_ cast<uchar(value)确保值大小范围为0^255之间

Mat.at(y,x)[index]=value 给每个通道的每个像素点赋值


亮度是图片的明亮程度 超过80%图像开始发白
对比度是颜色之间的对比程度 对比度越大 个颜色之间的分别越明显特别是黑白之间
超过85%过于艳丽

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat dst;
	Mat src = imread("D:/实验台/机器视觉/测试图片/白人女.png");
	imshow("原图",src);
	if (!src.data)
	{
		cout << "加载失败" << endl;
		return -1;
	}

    //像素点 位操作
	char input_win[] = "input image";// 设置一个名为input image的字符串 来做src的窗口显示
	namedWindow(input_win,CV_WINDOW_AUTOSIZE);
	imshow(input_win,src);//直接显示这条字符串到src窗口

	int height = src.rows;
	int width = src.cols;
	dst = Mat::zeros(src.size(), src.type());
	float alpha = 1;//第一通道赋值 越低越暗 越高越亮 对比度调节
	float beta = 30;//第二通道赋值 越低越暗 越高越亮 亮度调节 
	/*
	α > 1会扩大两个像素值之间的差值,从而提高了图像的对比度,
	反之降低图像对比度;β \betaβ值可以用来增大图片的亮度,
	值越大,图片亮度增加越明显。
	*/

	Mat m1;
	//若想进一步提高精度,可以使使读取的像素的数据类型都为float类型,
	//即Vec3f,这里需要一个转换函数
	src.convertTo(m1, CV_32F);//转换为32位浮点型的矩阵 对比度亮度调节精度更大 

 //  cvtColor(src,dst,CV_BGR2GRAY);

	for (int row = 0; row < height; row++)
	{
		for (int col = 0; col < width; col++)
		{
			if (dst.channels() == 3) //RGB图
			{
		      float  r = m1.at<Vec3f>(row, col)[2];//获取图片各个像素值
			  float  g = m1.at<Vec3f>(row, col)[1];
			  float  b = m1.at<Vec3f>(row, col)[0];
				
			  //                                            数据溢出保护    对各个像素值进行处理
			  dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha + beta);
			  dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);
			  dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);
			}
			else if (dst.channels() == 1) //灰度图
			{
				int v = dst.at<uchar>(row,col);
				dst.at<uchar>(row, col) = saturate_cast<uchar>(v + alpha + beta);

			}
		}
	}


	char output_tittle[] = "output and brightness change demo";
	namedWindow(output_tittle,CV_WINDOW_AUTOSIZE);

	imshow(output_tittle, dst);
	waitKey(0);
	return 0;
}

相关文章:

  • POJ 1905
  • open cv绘制形状与文字
  • open cv均值 中值 高斯 双边高斯 滤波及模糊
  • C语言运算符优先级
  • open cv膨胀与腐蚀
  • 浅谈外链因何而存在?
  • open cv形态学操作
  • 微软发布Surface平板电脑 再度挑战苹果
  • open cv提取水平线与垂直线
  • 用VBScript实现Zip解压缩目录中的所有文件
  • open cv图像上采样与下采样
  • C#中的Main方法
  • open cv阈值的基本操作
  • GridView 点击子View时设置子View的背景色为透明
  • open cv常见算子与自定义线性滤波
  • Codepen 每日精选(2018-3-25)
  • gops —— Go 程序诊断分析工具
  • JavaScript创建对象的四种方式
  • React+TypeScript入门
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Redis在Web项目中的应用与实践
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue 个人积累(使用工具,组件)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 当SetTimeout遇到了字符串
  • 力扣(LeetCode)21
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #LLM入门|Prompt#3.3_存储_Memory
  • (十三)Maven插件解析运行机制
  • (转)h264中avc和flv数据的解析
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .Net Web项目创建比较不错的参考文章
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net 应用中使用dot trace进行性能诊断
  • .NetCore部署微服务(二)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • [ Linux ] Linux信号概述 信号的产生
  • [2669]2-2 Time类的定义
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [Editor]Unity Editor类常用方法
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [Java开发之路](14)反射机制
  • [Json.net]快速入门
  • [ndss 2023]确保联邦敏感主题分类免受中毒攻击
  • [Python3网络爬虫开发实战] 5.3-非关系型数据库存储
  • [Swift学习] 访问控制 Access Control, private、public、filePrivate等修饰符
  • [UE4]射中机器人
  • [VC++入门]指针一
  • [Vue] 自定义命令
  • [WeChall] Training: GPG Write Up 解决方法
  • [yolov9]使用python部署yolov9的onnx模型
  • [毕设]基于STM32的语音识别智能蓝牙音箱设计
  • [导入]VI常用实用命令学习
  • [调试]stm32使用过程debug记录,持续更新ing