首页 > 其他分享 >图像处理之对比度、亮度值调整

图像处理之对比度、亮度值调整

时间:2023-03-05 14:31:52浏览次数:46  
标签:srcImage int 亮度 像素 图像处理 图像 对比度

1 概述

本节我们将学习如何用OpenCV进行图像对比度和亮度值的动态调整。

2 理论依据

首先了解一下算子的概念。一般的图像处理算子都是一个函数,它接受一个或多个输入图像,并产生输出图像。下面是算子的一般形式。

图像处理之对比度、亮度值调整_OpenCV

本节所讲解的图像亮度和对比度的调整操作,其实属于图像处理变换中比较简单的一种——点操作(point operators)。点操作有一个特点:仅仅根据输入像素值(有时可加上某些全局信息或参数),来计算相应的输出像素值。这类算子包括亮度(brightness)和对比度(contrast)调整、颜色校正(colorcorrection)和变换 (transformations)。

两种最常用的点操作(或者说点算子)是乘上一个常数(对应对比度的调节)以及加上一个常数(对应亮度值的调节)。公式如下:

图像处理之对比度、亮度值调整_#include_02

看到这个式子,我们关于图像亮度和对比度调整的策略就比较好理解了。其中:

  • 参数f(x)表示源图像像素。
  • 参数g(x)表示输出图像像素。
  • 参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度。
  • 参数b通常被称为偏置(bias),常常被用来控制图像的亮度。而更近一步,我们这样改写这个式子:

图像处理之对比度、亮度值调整_#include_03

其中,i和j表示像素位于第i行和第j列,这个式子可以用来作为我们在OpenCV中控制图像的亮度和对比度的理论公式。

3 访问图片中的像素

访问图片中的像素有很多种方式,在前面节“访问图像中的像素”中已有过比较系统的讲解。

而为了执行如下运算:

图像处理之对比度、亮度值调整_#include_04

我们需要访问图像的每一个像素。因为是对GBR图像进行运算,每个像素有三个值(G、B、R),所以我们必须分别访问它们(中的图像存储模式为 GBR)。以下是访问像素的代码片段,使用了三个for循环。

// 三个for循环,执行运算 g_dstImage(i,j) = a*g_srcImage(i,j) + b
for( int y = 0; y < g_srcImage.rows; y++ )
{
for( int x = 0; x < g_srcImage.cols; x++ )
{
for( int c = 0; c < 3; c++ )
{
g_dstImage.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( (g_nContrastValue*0.01)*( g_srcImage.at<Vec3b>(y,x)[c] ) + g_nBrightValue );
}
}
}

让我们分三个方面进行讲解。

  • 为了访问图像的每一个像素,使用这样的语法:image.at<Vec3b>(y,x)[c]。

其中,y是像素所在的行,x是像素所在的列,c是R、G、B(对应0、1、2)其中之一。

  • 因为运算结果可能会超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),所以要用saturate_cast对结果进行转换,以确保它为有效值。
  • 这里的a也就是对比度,一般为了观察的效果,它的取值为0.0到3.0的浮点值,但是轨迹条一般取值都会取整数,因此在这里我们可以将其代表对比度值的nContrastValue参数设为0到300之间的整型,在最后的式子中乘以一个0.01,这样就完成了轨迹条中300个不同取值的变化。这就是为什么在式子中,会有 saturate_cast<uchar (g_nContrastValue0.01)(image.at< Vec3b>(y,x)[c])+g_nE[c])+g_nBrightValue)中的g_nContrastValue*0.01。

3 示例程序:图像对比度、亮度值调整

本小节依然是一个详细注释的配套示例程序,把本节前文介绍的知识点以代码为载体,展现给大家。 此示例程序用两个轨迹条分别控制对比度和亮度值,详细注释的示例程序代码如下。

//-----------------------------------【头文件包含部分】---------------------------------------
// 描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

//-----------------------------------【命名空间声明部分】---------------------------------------
// 描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace std;
using namespace cv;


//-----------------------------------【全局函数声明部分】--------------------------------------
// 描述:全局函数声明
//-----------------------------------------------------------------------------------------------
static void ContrastAndBright(int, void *);
void ShowHelpText();

//-----------------------------------【全局变量声明部分】--------------------------------------
// 描述:全局变量声明
//-----------------------------------------------------------------------------------------------
int g_nContrastValue; //对比度值
int g_nBrightValue; //亮度值
Mat g_srcImage,g_dstImage;
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main( )
{
//改变控制台前景色和背景色
system("color 2F");

ShowHelpText();
// 读入用户提供的图像
g_srcImage = imread( "1.jpg");
if( !g_srcImage.data ) { printf("Oh,no,读取g_srcImage图片错误~! \n"); return false; }
g_dstImage = Mat::zeros( g_srcImage.size(), g_srcImage.type() );

//设定对比度和亮度的初值
g_nContrastValue=80;
g_nBrightValue=80;

//创建窗口
namedWindow("【效果图窗口】", 1);

//创建轨迹条
createTrackbar("对比度:", "【效果图窗口】",&g_nContrastValue, 300,ContrastAndBright );
createTrackbar("亮 度:", "【效果图窗口】",&g_nBrightValue, 200,ContrastAndBright );

//调用回调函数
ContrastAndBright(g_nContrastValue,0);
ContrastAndBright(g_nBrightValue,0);

//输出一些帮助信息
cout<<endl<<"\t运行成功,请调整滚动条观察图像效果\n\n"
<<"\t按下“q”键时,程序退出\n";

//按下“q”键时,程序退出
while(char(waitKey(1)) != 'q') {}
return 0;
}




//-----------------------------------【ShowHelpText( )函数】----------------------------------
// 描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
//输出欢迎信息和OpenCV版本
printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
printf("\n\n\t\t\t此为本书OpenCV2版的第27个配套示例程序\n");
printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION );
printf("\n\n ----------------------------------------------------------------------------\n");
}


//-----------------------------【ContrastAndBright( )函数】------------------------------------
// 描述:改变图像对比度和亮度值的回调函数
//-----------------------------------------------------------------------------------------------
static void ContrastAndBright(int, void *)
{

// 创建窗口
namedWindow("【原始图窗口】", 1);

// 三个for循环,执行运算 g_dstImage(i,j) = a*g_srcImage(i,j) + b
for( int y = 0; y < g_srcImage.rows; y++ )
{
for( int x = 0; x < g_srcImage.cols; x++ )
{
for( int c = 0; c < 3; c++ )
{
g_dstImage.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( (g_nContrastValue*0.01)*( g_srcImage.at<Vec3b>(y,x)[c] ) + g_nBrightValue );
}
}
}

// 显示图像
imshow("【原始图窗口】", g_srcImage);
imshow("【效果图窗口】", g_dstImage);
}

最后看一下程序的运行截图。运行这个程序会得到两个图片显示窗口:第一个为原图,第二个为效果窗口。在效果窗口中可以调节两个轨迹条,来改变当前图片的对比图和亮度。

原图

图像处理之对比度、亮度值调整_示例程序_05

效果图

图像处理之对比度、亮度值调整_示例程序_06

标签:srcImage,int,亮度,像素,图像处理,图像,对比度
From: https://blog.51cto.com/u_11745691/6101389

相关文章

  • 图像处理之访问图像的像素
    1图像在内存之中的存储方式在之前的章节中,我们已经了解到图像矩阵的大小取决于所用的颜色模型,确切地说,取决于所用通道数。如果是灰度图像,矩阵就会如下图所示。而对多通道图......
  • 图像处理之OpenCV用户界面
    1概述在OpenCV中,HighGUI模块为高层GUI图形用户界面模块,包含媒体的输入输出、视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容。本章旨在为大家展开讲解OpenCV中......
  • 图像处理之OpenCV基础图像容器Mat
    1数字图像存储概述我们可以通过各种各样的方法从现实世界获取到数字图像,如借助相机、扫描仪、计算机摄像头或磁共振成像等。通常由显示屏上看到的都是真实而漂亮的图像,但是......
  • 图像处理│一张自拍即可实现变老变年轻,带你感受时光流逝之美
    目录......
  • Android图像处理实例解析
    一、概述本篇文章介绍的是关于Android图像处理相关的,主要有动态修改图像的色相、饱和度及亮度,颜色矩阵,图像像素点调整、图像矩阵实现图像的平移缩放等,Xfermode相关知识点,......
  • 山东大学数字图像处理实验:MATLAB的图像显示方法
    MATLAB学习实验目的了解MATLAB的基本功能及操作方法。掌握典型离散信号的Matlab产生和显示。实验原理及方法在MATLAB中,序列是用矩阵向量表示,但它没有包含采样信......
  • 图像处理
    图像处理(ImageProcess)对输入的图像作某种变换,输出仍然是图像,不涉及或者很少涉及图像内容的分析。例如:图像增强、图像去噪、图像压缩、图像恢复、二值图像处理,以及基于阈......
  • 【Python】【图像处理】图片压缩方法
    一直想找个“无损压缩”的办法。当然这并非真的无损。我采用了Opencv的处理图像相关的方法。请见代码:注意:opencv安装:pipinstallopencv-python别想不开installcv2......
  • opencv对比度跟亮度
    #include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<iostream>usingnamespacestd;usingnamespacecv;staticvoidon_ContrastAndBrigh......
  • 【图像处理】-形态学调整(膨胀、腐蚀、开/闭运算)
    形态学调整膨胀操作主要针对卷积计算区域内的该像素点的NxM区域的最大值进行膨胀操作;例如:前景是白色背景经过膨胀后区域会增大原图片(背景为黑色,前景为白色)如下:注:图......