精华内容
下载资源
问答
  • 对比度增强是一种新兴图像增强方法,在特定应用中,对图像进行更清晰分析,以便在空间领域进行解释和分析。对比度增强目标是为输入图像提供服务,以便生成图像更适合特定应用程序。黑白灰度阶跃较好...
  • OpenCV改变图像的对比度和亮度改变图像的对比度和亮度目标理论图像处理像素变换亮度和对比度调整代码解释结果 改变图像的对比度和亮度 目标 在本教程中,您将学习如何: 访问像素值 用零初始化矩阵 了解cv :: ...

    改变图像的对比度和亮度

    目标

    在本教程中,您将学习如何:

    访问像素值
    用零初始化矩阵
    了解cv :: saturate_cast的功能以及为什么有用
    获得有关像素转换的一些很酷的信息
    在实际示例中提高图像的亮度

    理论

    图像处理

    普通图像处理算子是一种功能,它可以获取一个或多个输入图像并生成输出图像。
    图像变换可以看成是:
    点运算符(像素变换)
    邻域(基于区域)的运营商

    像素变换

    在这种图像处理变换中,每个输出像素的值仅取决于相应的输入像素值(可能加上一些全局收集的信息或参数)。
    这样的运算符的示例包括亮度和对比度调整以及颜色校正和变换。

    亮度和对比度调整

    两个常用的点过程是具有常数的乘法和加法:
    在这里插入图片描述
    参数 α > 0 和 β通常被称为增益和偏置参数;有时,据说这些参数分别控制对比度和亮度。
    你可以想到 F(x ) 作为源图像像素和 G(x )作为输出图像像素。然后,我们可以更方便地将表达式编写为:
    在这里插入图片描述
    表示像素位于第i行第j列。

    代码

    C ++在这里插入图片描述

    #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;
        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;
    }
    

    解释

    C ++
    我们使用cv :: imread加载图像并将其保存在Mat对象中:

    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对象来存储它。另外,我们希望它具有以下功能:
    初始像素值等于零
    与原始图像大小和类型相同

      Mat new_image = Mat::zeros( image.size(), image.type() );
    

    我们观察到cv :: Mat :: zeros返回基于image.size()和image.type()的Matlab样式的零初始值设定项

    我们现在问的价值 α 和 β 由用户输入:

        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;
    

    现在,执行操作 G(我,Ĵ )= α &CenterDot;&˚F(i ,j )+ β我们将访问图像中的每个像素。由于我们正在处理BGR图像,因此每个像素有三个值(B,G和R),因此我们也将分别访问它们。这是一段代码:

        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 );
                }
            }
        }
    

    请注意以下内容(仅C ++代码):

    要访问图像中的每个像素,我们使用以下语法:image.at (y,x)[c]其中y是行,x是列,c是B,G或R(0、1或2)。
    自手术以来 α &CenterDot;&p (我,Ĵ )+ β 可以给出超出范围的值或非整数值(如果 α是float),我们使用cv :: saturate_cast来确保值有效。
    最后,我们以通常的方式创建窗口并显示图像。

        imshow("Original Image", image);
        imshow("New Image", new_image);
        waitKey();
    

    笔记
    代替使用for循环访问每个像素,我们可以简单地使用以下命令:

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

    其中cv :: Mat :: convertTo将有效地执行* new_image = a * image + beta *。但是,我们想向您展示如何访问每个像素。无论如何,这两种方法都可以得到相同的结果,但是convertTo更加优化并且工作更快。

    结果

    运行我们的代码并使用 α = 2.2 和 β= 50

    $ ./BasicLinearTransforms lena.jpg
    Basic Linear Transforms
    -------------------------
    * Enter the alpha value [1.0-3.0]: 2.2
    * Enter the beta value [0-100]: 50
    

    我们得到这个:
    在这里插入图片描述

    展开全文
  • OpenCV实验系列之修改图片对比度与明亮度 注意:以下内容根据opencv官网提供的教程结合个人理解所得,仅是个人学习...以下对于对比度的解释来自百度百科 对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之...

    OpenCV实验系列之修改图片对比度与明亮度


    注意:以下内容根据opencv官网提供的教程结合个人理解所得,仅是个人学习笔记,可能存在错误或偏差,欢迎指正。


    对比度与亮度的理解(个人臆测)

    以下对于对比度的解释来自百度百科

    对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就可容易地显示生动、丰富的色彩,当对比率高达300:1时,便可支持各阶的颜色。但对比率遭受和亮度相同的困境,现今尚无一套有效又公正的标准来衡量对比率,所以最好的辨识方式还是依靠使用者眼睛。

    以灰度图来举例,个人理解就是图片中亮与暗点间的灰度差值,比如255与200的对比度小于255与100的对比度,对于灰度图来说亮度就是整体的白的程度。由此可以得出对对比度和亮度进行调节的公式:
    这里写图片描述

    α用来控制对比度,β用来控制亮度。可以想象当α>1是图片的对比度将扩大(扩大了像素点间的差异),β>0时亮度将提高,当0<α<1是图片的对比度将j减小,β<0时亮度将减小。

    实现方法

    可以使用LUT()

    http://blog.csdn.net/Nrush/article/details/79330077
    进行处理在下例中使用一般遍历的方法进行处理。

    #include<iostream>  
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    void main()
    {
        double alpha = 1.5; double beta = 0;
        Mat src;
        src = imread( "timg.jpg" );
        imshow("src",src);
        Mat dst = Mat::zeros( src.size(), src.type());
    
        for( int y = 0; y < src.rows; y++ ) {
            for( int x = 0; x < src.cols; x++ ) {
                for( int c = 0; c < 3; c++ ) {
                    dst.at<Vec3b>(y,x)[c] =
                      saturate_cast<uchar>( alpha*( src.at<Vec3b>(y,x)[c] ) + beta );
                }
            }
        }
    
        imshow( "dst", dst );
        waitKey(0);
    }

    运行结果
    原图
    原图
    这里写图片描述
    α = 1,β = 50.提高亮度结果
    这里写图片描述
    α = 1,β = -50.降低亮度结果
    这里写图片描述
    α = 1.5,β = 0 提高对比度结果
    这里写图片描述
    α = 0.5,β = 0 降低对比度结果

    展开全文
  • 图像对比度

    2020-04-29 18:21:13
    对比度的计算公式如下: 2 计算案例 解释: 每个小括号的数据是怎么来的?按四近邻计算,比如第一个小括号:以第一行第一列为中心,上下左右分别与这个中心值相减再平方,然后加在一起,即:(2-1)2+(3-1)2...

    一 图像对比度理论知识
    1 定义
    对比度:通俗地讲就是亮暗的拉伸对比程度,通常表现了图像画质的清晰程度。对比度的计算公式如下:

    å¨è¿éæå¥å¾çæè¿°
    2 计算案例

    å¨è¿éæå¥å¾çæè¿°

    解释:

    每个小括号的数据是怎么来的?按四近邻计算,比如第一个小括号:以第一行第一列为中心,上下左右分别与这个中心值相减再平方,然后加在一起,即:(2-1)2+(3-1)2;第二个小括号即:(1-3)2+(9-3)2+(1-3)2
    最后的48是怎么来的:其实就是总的平方次个数
    二 代码实现
    '''上面案例和下面代码都是使用四近邻方式计算'''
    from cv2 import cv2
    import numpy as np
    def contrast(img0):   
        img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY) #彩色转为灰度图片
        m, n = img1.shape
        #图片矩阵向外扩展一个像素
        img1_ext = cv2.copyMakeBorder(img1,1,1,1,1,cv2.BORDER_REPLICATE) 
        rows_ext,cols_ext = img1_ext.shape
        b = 0.0
        for i in range(1,rows_ext-1):
            for j in range(1,cols_ext-1):
                b += ((img1_ext[i,j]-img1_ext[i,j+1])**2 + (img1_ext[i,j]-img1_ext[i,j-1])**2 + 
                        (img1_ext[i,j]-img1_ext[i+1,j])**2 + (img1_ext[i,j]-img1_ext[i-1,j])**2)

        cg = b/(4*(m-2)*(n-2)+3*(2*(m-2)+2*(n-2))+2*4) #对应上面48的计算公式
        print(cg)
       
    img0 = cv2.imread('1301022016GF2DOM_2535_5118_0_copy1.jpg')
    contrast(img0)
    img1 = cv2.imread('1301022016GF2DOM_2535_5118_0_copy2.jpg')
    contrast(img1)
    img2 = cv2.imread('1301022016GF2DOM_2535_5118_0_copy3.jpg')
    contrast(img2)
    img3 = cv2.imread('1301022016GF2DOM_2535_5118_0_copy4.jpg')
    contrast(img3)

    结果如下:
    20906.021314691152
    26861.281793266557
    27822.16401641625
    28115.63633277685
    结论:图片越清晰,对比度越大

    使用如下图片(因为下面图片大小被压缩,所以计算结果可能不一致,但大小顺序一致)
    ==

    å¨è¿éæå¥å¾çæè¿°

    å¨è¿éæå¥å¾çæè¿°

    å¨è¿éæå¥å¾çæè¿°

    å¨è¿éæå¥å¾çæè¿°

    展开全文
  • 对比度增强

    2014-10-23 20:44:14
    本课件详尽讲解了.对比度增强、图像平滑、图像锐化、同态滤波、为色彩和假色彩以及代数运算和几何运算,最重要是该课件里面有很多图片解释
  • 清晰度、对比度和锐化程度的调整,是照片后期的三个重要步骤。它们容易混淆,但各自效果却并不相同。本文会帮大家从原理上理清他们的区别。  1、对比度  对比度是指的画面的明暗反差程度。... 为了更好的解释...

     文章转载自:https://blog.csdn.net/qijitao/article/details/80271507

    清晰度、对比度和锐化程度的调整,是照片后期的三个重要步骤。它们容易混淆,但各自效果却并不相同。本文会帮大家从原理上理清他们的区别。

      1、对比度

      对比度是指的画面的明暗反差程度。增加对比度,画面中亮的地方会更亮,暗的地方会更暗,明暗反差增强。

      为了更好的解释对比度、清晰度和锐度的区别,我会使用下面一张放大20倍的纹理边缘为例子。

      下图就是增加对比度的结果。增加对比度之后,原来的两个物体反差扩大。

      对比度是对全局作用的,对照片整体的明暗有较大影响。比如下面这张照片:

      对比度增加之后,照片亮的地方更亮,暗的地方更暗,一下子反差就拉开了。

      2、清晰度

      在Photoshop以及众多软件中,都提供了清晰度的调整工具。

      当我们增加照片的清晰度,靠近边缘较暗的一侧会变得更暗,靠近边缘较亮的一侧会变得更亮,但这种亮度对比的变化只局限在边缘周围的部分。

      清晰度相当于让边缘亮的一边加上一根白色渐变条,暗的一边加上一根黑色渐变条,从而让物体轮廓和细节纹理更加清晰。

      因此增加清晰度,只会增加边缘附近的反差,让物体轮廓更清晰。对照片整体的对比度,影响没有对比度滑块那么大。

      由于清晰度相当于让边缘亮的一边加上一根白条,暗的一边加上一根黑条,所以调整清晰度滑块时一定要注意幅度,不然照片中会出现可怕的Halo(晕影)现象。比如下图,狂增清晰度后山体交界处出现极不自然的白边和黑边。

      另外清晰度比较适合结合蒙版、渐变滤镜、径向滤镜等等,只对画面中的局部应用,否则全图中会加入过量的黑色细节,黑色细节一多就会显得非常脏。

      比如下图,全局提高清晰度,画面显得比较脏。

      使用蒙版让增加清晰度的图层,只在前景区域显示。也就是我们只增加了照片前景石头、冰面的清晰度。

      局部增加清晰度之后,前景冰面质感大大提升,但照片整体又不会显得很脏。

      3、锐化程度

      锐化类似清晰度,只作用于物体的边缘,但原理有所不同。锐化主要是通过在边缘两侧,增加黑白相间的高对比线条“隔离带”,让边缘看起来更加突出锐利。

      Adobe Camera Raw中,锐化工具在第三个面板 - 细节面板。

      无论哪种软件,细节面板中的锐化工具,都有四个滑块:数量、半径、细节和蒙板。他们恰好对应了锐化中存在的三大问题。

      以上面这张锐化过度的照片为例,三个问题分别是:

      1)叶片边缘锐化强度过大,显得很假。而锐化强度,是由“数量”滑块决定的。

      2)叶片边缘出现了明显的白边和黑边,这是因为锐化作用的区域过大,本应很细微的边缘对比,一下子成了一大条白色和黑色色块。锐化区域,是由“半径”滑块控制。

      3)水面内部本来不是边缘的区域也被锐化了,一下子多了很多噪点。而识别哪些是边缘,哪些不是边缘,由“细节”和“蒙板”滑块控制。

      锐化数量

      锐化数量决定了锐化的强度,也就是边缘的对比度,以及边缘和物体的隔离程度。下面是ACR默认的25数量时,边缘的锐化情况。

      一旦把锐化数量提高到150,不仅边缘深浅两种颜色的反差更大,而且还出现了多条“隔离带”,让边缘更明显了。

      在具体的照片中,我们需要根据物体的特点决定锐化数量,比如人物照片可能20、30就够了,而建筑雕塑这类超过100也不觉得过。怎么观察呢,第一步,把照片放大到100%甚至更大,这样才能清楚的看到锐化效果。

      第二步,拖动数量滑块,直到物体的边缘和细节凸显出来。(拖动数量滑块的时候,同时按住Alt键,可以把照片由彩色变成黑白,更加方便观察)

      锐化半径

      锐化半径决定了锐化作用的区域,半径越大,边缘会有更多区域成为反差隔离带。比如下面这张照片,半径设为默认的1.0时,边缘被锐化的区域只有3个像素。

      当半径增加到3.0时,边缘8-9个像素到区域都产生了锐化效果。

      半径太大,物体边缘会有黑边白边的出现,看起来有点恐怖。

      记住在细节面板中,键盘上的Alt键是一个非常有用的按键。在调整半径时,按住Alt键,可以看到物体边缘锐化的作用效果。

      按住Alt键,半径过大时,会有比较明显的黑白线条出现。一般照片,锐化半径都保持在默认的1或者更低,极少有超过1.5的情况。

      锐化细节

      锐化细节就像“细节”字面本身提示的那样,这个滑块决定了多大反差的边缘才会被锐化。

      当细节值很小时,表示我们不需要多少细节,只有很大很明显的边缘才会被锐化。当细节值很大时,表示我们需要很多细节,即使微小反差的边缘也会被锐化。

      同样调整细节的同时按住Alt键,会显示出一个中灰色图像,图像中50%灰的区域是不被锐化影响的细节,更深更浅的部分则是会被锐化的细节。比如这张建筑照片,按住Alt键同时细节滑到0,只有轮廓清晰的建筑边缘显示了出来。

      如果我把细节值提高到26,一些更小的边缘也会被锐化。比如箭头所指的建筑墙体的花纹,在细节为0时被直接忽略了,在细节26时则会被锐化。

      如果我进一步把细节提高到100,图像中大大小小的各种细微边缘都会被锐化,甚至纯色天空中的噪点也会被锐化,这显然不是我们想要的。一般来说,默认的25是一个对大部分照片适用的值。

      蒙板

      细节是一个加法,细节值越大,越细微的边缘也会被锐化。而蒙板则是一个减法,它会识别出照片中类似天空、水面、皮肤等大片纯色区域,让锐化不作用于这些区域。蒙板是锐化工具中,重要程度最高的一个滑块,它让我们实现了局部锐化。

      蒙板为0的时候,大片天空也被锐化,本来应该纯蓝一片的天空却出现了许多颗粒。

      同样按住Alt键时移动蒙板滑块,图像中会显示出蒙板的作用情况,黑色表示完全不会被锐化,白色表示该部分会被锐化。蒙板提高到25,天空中仍然有大量白色线条,那些地方会被锐化,不好!

      蒙板直接升到100,天空中一片黑色,说明天空完全不会被锐化。不过这个时候建筑内部也是大片黑色,该被锐化的墙体细节没有锐化,蒙板拉的过了!

      对这张图而言,蒙板值在60左右时比较平衡。天空几乎一片黑色,不会被锐化。同时建筑中的纹理仍然是白色蒙板,会被锐化。

      再来看看蒙板为0和蒙板为60时,天空的“颗粒噪点”情况。左边是蒙板为0,右边蒙板拉到了60,保护纯色区域的效果立竿见影。

    •  
    展开全文
  • 文章目录目标理论图像处理像素处理亮度和对比度调整源码解释结果实例亮度和对比度调整图像灰度校正(Gamma 校正)校正曝光不足图像代码其它资源 目标 访问像素值 用零初始化一个矩阵 了解cv::saturate_cast做什么...
  • 清晰度、对比度和锐化程度的调整,是照片后期的三个重要步骤。它们容易混淆,但各自效果却并不相同。本文会帮大家从原理上理清他们的区别。  1  对比度 ... 对比度是指的画面的明暗反差程度... 为了更好的解释对...
  • namespace { class CLAHE_CalcLut_Body : public cv::ParallelLoopBody //公有继承类ParallelLoopBody (并行循环体) { //计算直方图,裁剪直方图,裁剪后累加直方图 public...
  • 对比度的定义:简单的来说就是使亮的地方更亮,暗的地方更暗。 但是关于亮与暗的解释有很多种,在RGB模式中,要使图片变亮的方法是提高R,G,B三个通道的值,从而使图片看起来更亮。   网上最常用的调整对比...
  • 彩色图像对比度

    千次阅读 2015-10-14 13:58:48
    对比度的定义:简单的来说就是使亮的地方更亮,暗的地方更暗。 但是关于亮与暗的解释有很多种,在RGB模式中,要使图片变亮的方法是提高R,G,B三个通道的值,从而使图片看起来更亮。   网上最常用的调整对比...
  • 图像对比度调整可以由一个模块contrast adjustment 完成,参数有输入范围和输出范围,计算过程由以下公式决定 解释一下,当input<=low_in时候输出值是low_out+low_out;当low_in<input<high_in时候...
  • ** 1. 对比度 ** 对比度是指的画面的明暗... 下图就是增加对比度的结果。增加对比度之后,原来的两个物体反差扩大。    对比度是对全局作用的,对照片整体的明暗有较大影响。比如下面这张照片:    对比度增加...
  • 图像处理:Python代码计算图像对比度

    千次阅读 热门讨论 2019-04-28 22:14:17
    对比度的计算公式如下: 2 计算案例 解释一下最后的48是怎么来的:其实就是总的平方次数 二 代码实现 from cv2 import cv2 import numpy as np def contrast(img0): img1 = cv2.cvtColor(img0, cv...
  • 图像处理之亮度与对比度

    万次阅读 2017-07-19 17:32:33
    上面这个公式可以很好的解释对图像的亮度和对比度操作的原理,第一个参数α必须是大于零,不然则基本上没有意义了。α能代表什么呢?α能使图像像素成倍数的增长或降低(αβ作何解释呢?β可为负,也可为正,那么...
  • 可能有部分小伙伴们,对于亮度、饱和度、对比度这些概念还不是很清楚,这里先大致做下解释。 我们知道,在计算机中描述一个物体颜色常见方式是“RGB颜色模型”,这种方式虽然很方便计算机计算,但却不方便人们...
  • 解释都在注释里啦 import numpy as nm import cv2 as cv def adjust(img1,x,y): h,w,c=img1.shape#获得img1参数height、width、channel img2=nm.zeros([h,w,c],img1.dtype)#色素全为0,输出一张全黑图片 img...
  • 目的 本篇教程中,你将学到: ...Note:以下解释节选自Richard Szeliski所著 Computer Vision: Algorithms and Applications 图像处理 一般来说,图像处理算子是带有一幅或多幅输入图像、产生一幅输出图像函数...
  • 目标在本教程中,将学习如何:访问像素值用零初始化矩阵获取关于像素变换的一些很酷的信息在实际的例子中提高图像的亮度理论下面的解释属于Richard Szeliski 的“ 《计算机视觉:算法与应用》 ”一书图像处理一般的...
  • 目标在本教程中,您将学习如何:访问像素值用零初始化矩阵获取有关像素变换的一些很酷的信息在一个实际的例子中提高图像的亮度理论注意下面的解释属于Richard Szeliski的“计算机视觉:算法与应用”一书图像处理一般...
  • 该方法由NarendraPM等人在《Real-Time Adaptive Contrast Enhancement》中提到,属于自适应对比度增强(ACE)算法。 ACE算法采用了反锐化掩模技术,解释如下:首先图像被分成两个部分。一是低频反锐化掩模(unsharp...
  • 目标 (Goal) 本教程学习: 访问像素值 用 0 初始化矩阵 cv::saturate_cast 作用 ...下面理论解释来自 Richard Szeliski 《计算机视觉:算法与应用》 一书。   图像处理 (Image Processing)
  • 目的 本篇教程中,你将学到: 访问像素值用0初始化矩阵saturate_cast 是做...以下解释节选自Richard Szeliski所著 Computer Vision: Algorithms and Applications 图像处理 一般来说,图像处理算

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 345
精华内容 138
关键字:

对比度的解释