添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
聪明的电影票  ·  Spring ...·  11 月前    · 
没有腹肌的沙滩裤  ·  python ...·  1 年前    · 

(1)对比度:一副图像中,各种不同颜色最亮处和最暗处之间的差别,差别越大对比度越高,这个跟分辨率没有多少关系,只跟最暗和最亮有关系,对比度越高一个图像给人的感觉就越刺眼,更加鲜亮,突出;越低则给人感觉变化不明显,反差就越小。这个概念只是在给定的图像中,与图像中颜色亮度的变化有关。

(2)亮度:一副图像给人的一种直观感受,如果是灰度图像,则跟灰度值有关,灰度值越高则图像越亮。

(3)饱和度:彩色图像的概念,饱和度为0的话,图像表现为灰度图像;饱和度越高颜色表现出种类越多,颜色表现更丰富,反之亦然。

理论依据

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

(OpenCV — 9)图像对比度、亮度值调整_#include

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

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

(OpenCV — 9)图像对比度、亮度值调整_回调函数_02

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

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

(OpenCV — 9)图像对比度、亮度值调整_回调函数_03

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

访问图片中的像素

访问图片中的像素有很多种方式,可以参考:​ ​(OpenCV — 6)访问图像中的像素​ ​ 而为了执行如下运算 :

(OpenCV — 9)图像对比度、亮度值调整_#include_04

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

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

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

为了访问图像的每一个像素,使用这样的语法: image.at<Vec3b>(y,x)[c] 。其中, y 是像素所在的行, x 是像素所在的列, c 是 R 、 G 、 B (对应 0 、 l 、 2)其中之一 。

因为运算结果可能会超 出像素取值范围(溢出),还可能是非整数(如果是浮点数的话) ,所以要用 saturate_cast 对结果进行转换,以确保它为有效值 。

这里的 a 也就是对比度, 一般为了观察的效果,它的取值为 0.0 到 3 .0 的浮点值 , 但是轨迹条一般取值都会取整数 , 因此在这里我们可以将其代表对比度值的 nContrastValue 参数设为 0 到 300 之间 的整型, 在最后的式子 中乘以一个 0.0 1 , 这样就完成了轨迹条中 300 个不同取值的变化 。 这就是为什么在式子中,会有 saturate_cast<uchar> ((g_ nContrastYalue*0.01)*(image.at<Vec3b> (y,x)[c])+g_ nBrightYalue)中的 g_nContrastValue*0.01。

实例代码:

/***头文件包含部分***/
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <qstring.h>
#include <qdebug.h>
#include <qthread.h>
#include <sys/time.h>
/***命名空间声明部分***/
using namespace cv;
using namespace std ;

// 描述:全局函数声明
static void ContrastAndBright(int, void *);

// 描述:全局变量声明
int g_nContrastValue; //对比度值
int g_nBrightValue; //亮度值
Mat g_srcImage,g_dstImage;

// 描述:控制台应用程序的入口函数,我们的程序从这里开始
int main( )
{
// 读入用户提供的图像
g_srcImage = imread( "D:\\QT\\project\\opencv_qtcreaor\\image\\1.jpg");
if( !g_srcImage.data ) { printf("读取g_srcImage图片错误~! \n"); return false; }
g_dstImage = Mat::zeros( g_srcImage.size(), g_srcImage.type() );

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

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

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

//创建轨迹条
createTrackbar("contrast", "xiaoguo",&g_nContrastValue, 300,ContrastAndBright );//对比度
createTrackbar("brightness", "xiaoguo",&g_nBrightValue, 200,ContrastAndBright );//亮度

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

//输出一些帮助信息
qDebug()<<"运行成功"<<endl;

//按下“q”键时,程序退出
waitKey(0);
return 0;
}


// 描述:改变图像对比度和亮度值的回调函数
static void ContrastAndBright(int, void *)
{
// 三个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("xiaoguo", g_dstImage);
}