• 学习如何使用opencv中的函数,学习把彩色图像分解成RGB分量的操作,学习split()函数的使用 二、函数说明 函数原型: void split(InputArray src,OutputArray *dst) 参数详解: src:源图像。图像必须是灰度图...

    一、目标

    学习如何使用opencv中的函数,学习把彩色图像分解成RGB分量的操作,学习split()函数的使用

    二、函数说明

    函数原型:

    void split(InputArray src,OutputArray *dst)

    参数详解:

    src:源图像。图像必须是灰度图。
    dst:目标图像集合。

    三、程序代码

    #include "cv.h"                             //  OpenCV 文件头
    #include "highgui.h"
    #include "opencv2/opencv.hpp"
    #include "opencv2/imgproc.hpp"
    #include <iostream>
    #include <string>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        Mat m_SrcImg;
    
        m_SrcImg = imread("C:\\Users\\lidabao\\Desktop\\image\\1\\LENA1.bmp", -1);
    
        namedWindow("原图像", 1);
        imshow("原图像", m_SrcImg);
    
        Mat m_ResImg;
    
        //直方图均衡化
        equalizeHist(m_SrcImg, m_ResImg);
    
        namedWindow("直方图均衡化", 1);
        imshow("直方图均衡化", m_ResImg);
    
        waitKey(0);
    }

    四、结果

    程序运行如下图:
    这里写图片描述

    五、注意

    正确的配置opencv
    正确使用split()函数

    展开全文
  • 所谓的颜色空间是指,针对一个给定的颜色,我们如何组合颜色元素以对其编码。即把颜色分成几个基元素,通过组合基元素可以产生所有的颜色。 RGB 是最常用的一种颜色空间,因为它的原理和我们人眼的内部构成颜色的...

    所谓的颜色空间是指,针对一个给定的颜色,我们如何组合颜色元素以对其编码。即把颜色分成几个基元素,通过组合基元素可以产生所有的颜色。

    RGB

    是最常用的一种颜色空间,因为它的原理和我们人眼的内部构成颜色的方式相同,通过基色 R(红色),G(绿色),B(蓝色),有时候还会有表示颜色透明度的(A)。

    HSV

    由一个圆锥组成,下顶点为黑色,上顶圆的中心点为白色。
    H:色调,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°。
    S:饱和度,饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。
    V:明度,明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白),(明度)是被认为是”光的量“,可以是任何颜色。

    HLS

    表示的两个圆锥组合而成,下顶点为黑色,上顶点为白色。
    H:色调,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°
    S:饱和度,和上面的不一样,因为是按照明度/亮度的缩放比来设置饱和度,所以两个的值不一样。
    L:亮度,Lightness(亮度)是作为”白的量“来理解的。

    YCrCb即YUV

    主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
    YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):
    Y = 0.299R + 0.587G + 0.114B   U = -0.147R - 0.289G + 0.436B   V = 0.615R - 0.515G - 0.100B R = Y + 1.14V   G = Y - 0.39U - 0.58V   B = Y + 2.03U  在DirectShow中,常见的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32等;常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。

    在人脸检测中也常常用到YCrCb空间,因为一般的图像都是基于RGB空间的,在RGB空间里人脸的肤色受亮度影响相当大,所以肤色点很难从非肤色点中分离出来,也就是说在此空间经过处理后,肤色点是离散的点,中间嵌有很多非肤色,这为肤色区域标定(人脸标定、眼睛等)带来了难题。如果把RGB转为YCrCb空间的话,可以忽略Y(亮度)的影响,因为该空间受亮度影响很小,肤色会产生很好的类聚。这样就把三维的空间将为二维的CrCb,肤色点会形成一定得形状,如:人脸的话会看到一个人脸的区域,手臂的话会看到一条手臂的形态,对处理模式识别很有好处,根据经验某点的CrCb值满足:133≤Cr≤173,77≤Cb≤127 那么该点被认为是肤色点,其他的就为非肤色点。根据经验某点的CrCb值满足:133≤Cr≤173,77≤Cb≤127 那么该点被认为是肤色点,其他的就为非肤色点。

    CIELab

    同RGB颜色空间相比,Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]


    展开全文
  • 本文主要介绍常见的几种颜色模型以及使用opencv进行颜色空间转换。 1.RGB 模型 即三原色,Red,Green,Blue,分别含有256个灰度级。 2.CMY 模型 CMY 为相减混色,它与相加混色的RGB空间正好互补,也即用白色减去...

    本文主要介绍常见的几种颜色模型以及使用opencv进行颜色空间转换。

    1.RGB  模型

    即三原色,Red,Green,Blue,分别含有256个灰度级。

    2.CMY  模型

    CMY 为相减混色,它与相加混色的RGB空间正好互补,也即用白色减去空间正好互补,也即用白色减去RGB 空间中的某一色彩值就等于同样色彩在CMY空间中的值

    3.HSI  模型

    HSI模型是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation 或Chroma )和亮度(Intensity 或Brightness)来描述色彩
     I:表示光照强度或称为亮度,它确定了像素的整体亮度,而不管其颜色是什么。其最亮值为:表示光照强度或称为亮度,它确定了像素的整体亮度,而不管其颜色是什么。其最亮值为1 ,0 为最暗。

    H:表示色度,由角度表示(0~360º)。反映了该颜色最接近什么样的光谱波长(既彩虹中的那种颜色)。反映了该颜色最接近什么样的光谱波长(既彩虹中的那种颜色)0度为红色,120度为绿色,240度为蓝色。

     S:表示色饱和度,色饱和度参数是色环的原点到彩色点的半径长度。在环的外围圆周是纯的或称饱和的颜色,其饱和度值为1:表示色饱和度,色饱和度参数是色环的原点到彩色点的半径长度。在环的外围圆周是纯的或称饱和的颜色,其饱和度值为1。在中心是中性(灰)影调,即饱和度为0。

    模型之间的转换

    颜色模型之间的转换

    转换颜色空间

    在 OpenCV 中有超过 150种进行颜色空间转换的方法。但是你以后就会、发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。
    我们要用到的函数是:cv2.cvtColor(input_image ,flag),其中 flag就是转换类型。
    对于 BGR↔Gray 的转换,我们要使用的 flag 就是 cv2.COLOR_BGR2GRAY。
    同样对于 BGR↔HSV 的转换,我们用的 flag 就是 cv2.COLOR_BGR2HSV。

    注意:在 OpenCV 的 HSV 格式中,H(色彩/色度)的取值范围是 [0,179],S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。但是不同的软件使用的值可能不同。所以当你需要拿 OpenCV 的 HSV 值与其他软件的 HSV 值进行对比时,一定要记得归一化。

     

    展开全文
  • 颜色空间  近100多年来,为了满足不同用途的需要,人们开发了许多不同名称的颜色空间,“可以说表示颜色空间的数目是无穷的”,但是,现有的颜色空间还没有一个完全符合人的视觉感知特性、颜色本身的物理特性或...

    颜色空间 

    近100多年来,为了满足不同用途的需要,人们开发了许多不同名称的颜色空间,“可以说表示颜色空间的数目是无穷的”,但是,现有的颜色空间还没有一个完全符合人的视觉感知特性、颜色本身的物理特性或发光物体或反光物体的特性。人们还在继续开发各种新的颜色空间。

    不同的颜色空间有着不同的特性,使用在不同的领域。因此在实际中需要进行不同颜色空间的转换。不同颜色空间的转换可以是直接转换,也可以通过与设备无关的颜色空间进行转换。这时就会遇到选择颜色空间和转换方法的问题。

     

    为了使用颜色空间,首先应该了解各种颜色空间的特性。颜色空间的分类有多种方法。

    1.按使用类别分类

    彩色色度学模型:CIE-RGB、CIE-XYZ、均匀色差彩色模型(CIE 1976Luv和CIE Lab)

    工业彩色模型:RGB彩色显示模型、CMYK彩色印制模型、彩色传输模型YUV(PAL)、YIQ(NTSC)、YCrCb(数字高清晰度电视)

    视觉彩色模型:HVC(孟赛尔)、HSB(Photoshop)、HLS(Windows画图和Apple Color Picker)、HSI(图像分割)、HSY(电视)、Ohta(图像分割)等。

    2.按颜色感知分类

    混合颜色模型:按3种基色的比例混合而成的颜色。RGB、CMYK、XYZ等

    非线形亮度/色度颜色模型:用一个分量表示非色彩的感知,用两个分量表示色彩的感知,这两个分量都是色差属性。L*a*b、L*u*v、YUV、YIQ等。

    强度/饱和度/色调模型:用强度描述亮度或灰度等光强的感知,用饱和度和色调描述色彩的感知,这两个分量接近人眼对颜色的感觉。如HIS、HSL、HSV、LCH等

     

    一.彩色色度学模型

    1.CIE-RGB彩色模型

    CIE-RGB彩色模型是国际照明委员会(CIE)制定了第一个彩色色度学模型。它是在三原色学说下,以红色、绿色、蓝色作为三种基色建立起来的颜色模型。其不足点是:在某些情况下,颜色值会出现负值。

    2.CIE-XYZ彩色模型

    CIE-XYZ彩色模型是为消除CIE—RGB色度坐标中负值而设计的。其中三刺激值X、Y、Z,并不代表真实的物理彩色。其颜色空间包含了人类能够发觉的所有颜色,但并不是均匀色差空间。

    3.均匀色差空间

    在均匀色差空间中,相同距离的彩色色差与人眼主观感觉基本一致。有Luv和Lab两种均匀色差彩色模型。普遍认为,Lab彩色模型更接近人眼的主观感觉。

    Buchsbaum等人对色彩迁移进行了研究,利用一些正交线性变换将人类视觉系统所能感受到的红、绿、蓝三色信号变换到三个不相关的色彩分量。在他们的研究基础上,Ruderman等人经过对大量的自然界图像进行颜色分布统计,得到了图像的颜色分布统计结果,并用转化色彩空间的方法形成一个统计意义上具有近似正交基的均匀色彩空间lαβ,并给出了简单的3×3矩阵运算实现RGB到lαβ空间的转化。lαβ色彩空间是基于数据驱动对人类感觉的研究,它假设人类的视觉系统理想地适应自然景色的处理,由亮度分量l,和两个色度分量α和β组成。其中,α表示黄一蓝通道(yellow—blue opponent),β表示红一绿通道(red—green opponent),如图:

     

    Ruderman等人在一幅用lαβ色彩空间表示的图像中随机抽取1000个像素点,生成了图4所示的坐标关系图。从中可以看出,lαβ色彩空间不仅基本消除了颜色分量之间的强相关性,而且有效地将图像的灰度信息和颜色信息分离开来。所以可以分别对三个通道图像进行独立的运算,而不需要修改另外两个通道的信息,从而不会影响原图像的自然效果。

     

                                                                                                       lab空间l-a、l-b、a-b关系图

    色彩空间的转换

           色彩空间一方面要符合人眼的视觉感知特性,另一方面应方便图像的处理。图像色彩迁移的过程是一个改变图像颜色基调的过程,通常希望在改变图像的一个颜色属性时,不改变图像其它的颜色属性。由前面的介绍可知,RGB空间的三通道具有很强的相关性,而lαβ空间的各通道具有最小的相关性。所以,在lαβ空间对图像的颜色进行出来将会变得十分方便。因此,选择在lαβ空间进行图像间的色彩迁移,这就需要将图像从RGB空间转换到lαβ空间。

    1.从RGB空间到lαβ空间的转换

    需要进行3次变换,即RGB->CIEXYZ->LMS->lαβ,具体步骤如下:

    1)从RGB空间到CIE XYZ空间的转换

     

    2)从CIE XYZ空间到LMS空间的转换

     

    通过1、2可以得到RGB空间到LMS空间的转换。由于数据在LMS空间比较分散,所以进一步将其转换到以10为底的对数空间,这样不仅使数据分布更加聚敛,而且符号人类对于颜色感觉的心理物理学研究结果。

     

    3)从LMS空间到lαβ空间的转换

    这一变换是基于对数据的主成分分析(PCA,Principal ComponentAnalysis)得到的,其中l为第一主成分,α为第二主成分,β为第三主成分。

     

    经过这三个步骤就完成了从RGB空间到lαβ空间的转换。

    色彩空间的逆转换

    当图像在lαβ空间进行处理之后,为了显示处理的结果,需要把图像转换到RGB空间,具体步骤为:

    1)从lαβ空间到LMS对数空间的转换

     

    2)从LMS对数空间到LMS线性空间的转换

     

    3)从LMS空间到RGB空间的转换

     

     

    二.工业彩色模型

    1.RGB彩色显示模型

    RGB模型是一种加色系统,色彩源于红、绿、蓝三基色。用于CRT显示器、数字扫描仪、数字摄像机和显示设备上,是当前应用最广泛的一种彩色模型。RGB彩色模型可用一个三维空间的立方体来表示,在此系统中计算的任何颜色都该立方体内,其彩色空间在L*a*b*彩色空间内。但人眼不能直接感觉红、绿、蓝三色的比例,因此对图像进行增强处理结果难以控制。

    2.CMYK彩色印制模型

    CMYK彩色模型是一种减色模型,色彩来源于青、品红、黄3种基色,其彩色空间小于RGB彩色空间。主要适用于印刷油墨和调色剂等实体物质产生颜色的场合,广泛用于彩色印刷领域。

    3.彩色传输模型

    彩色传输模型主要用于彩色电视机信号传输标准,他们的共同特点是都能向下兼容黑白显示器,即在黑白显示器上也能显示彩色图像,只不过显示为灰度图像。YUV彩色传输模型适用于PAL、SECAM彩色电视制式。YIQ彩色传输模型适用于美国国家电视标准委员会(NTSC)彩色电视制式,它是经YUV模型旋转色差分量而形成的彩色空间。YCrCb彩色传输适用于计算机用的显示器。

     

    三.视觉彩色模型

    根据人眼视觉特性提出的,用色调(Hue)、饱和度(Saturation)、亮度(luminance)来描述彩色模型。其彩色空间能更好的与人的视觉特性相匹配。

    1.   基于孟塞尔彩色系统的HVC模型

    蒙塞尔系统是比较经典和理想的均匀的颜色表示系统。它在视觉上是等色差的,即沿色调、亮度值、或饱和度方向上等量的变化产生相同的视觉差异。遗憾的是,蒙塞尔系统没有具体的描述公式,是依靠大量的实验数据,以查表方式(表的大小为256*256*256)和蒙塞尔色品卡建立起来的,因此和其它的彩色模型的转换十分复杂,必须通过数据查询和线性插值,计算量繁多。

    2.   HSB彩色模型

    HSB彩色模型是一个单锥体,红、绿、蓝以及各自的补色色调均匀分布于圆周上,是基于孟塞尔彩色系统的一种理想情况。其彩色模型问题在于:

    ① 除白色外,R、G、B三值中只要其中一个值是255,饱和度就等于最大值100;同一亮度下,各种颜色的饱和度都相等。这和孟塞尔系统颜色模型不一致。

    ② HSB模型中,在同一亮度平面上(如亮度最大的平面上),可见到所有的颜色。这与人眼的视觉特性相违背。

    ③ 只要R、G、B中有一个值为255,那么亮度B就达到最大值100。这与Grassman的三色调配公理和格拉斯曼定律内容不符。

    3.   HLS彩色模型

    HLS彩色模型是一个双锥体,其色调H与HSV模型中的色调分布完全一样。不同的是:HLS模型中的最亮纯色位于L=0.5处,亮度为最大时,只能看到白色。它也是基于孟塞尔彩色系统的一种理想模型,其自身也同样存在一些不足:

    ① 除白色外,R、G、B三值中只要其中一个值是255,饱和度就等于最大值100;同一亮度下,各种颜色的饱和度都相等;且饱和度随着亮度L均匀的变化。

    ②HLS模型中的三个属性(H、L、S)并不完全独立。可由公式亮度看出,这给人们单独处理某一属性时带来麻烦。

    ③ 在L=0.5的平面上能够看到所有的纯彩色;而实际上这些颜色看起来并不一样亮,但看起来一样亮的颜色,其亮度值未必相等,与人眼之间有误差。这个问题在HSB模型中也同样存在。

    4.    HSY彩色模型

    HSY模型是一种彩色传输模型,传输基本的色差和亮度信号,被用于摄像机传输模式。YCrCb模型、YUV模型以及YIQ模型都是在HSY模型基础上对色差信号进行调制和压缩而形成的彩色电视机信号的传输标准。

    ①它的亮度变化(在各种纯彩色之间)完全符合人眼的实际视觉感受。它的亮度公式是根据人的视觉特性,由美国国家电视制式委员会的NTSC制式推导得到的

    ②在 HSY模型饱和度最大的颜色并不在一个圆周上,同一亮度平面上的各颜色的饱和度也不一样大,这很接近人眼的实际视觉感受,和孟塞尔颜色系统理论相符。

    ③基色色调与其补色近似互补,但是各基色及其补色在圆周上的分布不均匀。

    有关研究表明:人眼对亮度、饱和度信息的变化比色调信号所携带的信息的变化要敏感的得多,也就是说人眼对色调的变化相对不敏感。

    基于以上综合分析,采用HSY彩色模型作为测量工具,进行实际测试。测试结果和预期分析的结果非常符合,亮度和饱和度相对于HSB和HLS彩色模型,更符合人眼的实际视觉感受,色调分布无大的差别。从总体上说HSY彩色模型的测试效果更好。

    5.    HSI彩色模型

     

    HSI (hue、saturation、intensity) 和HSV (hue、saturation、value)颜色空间在设计上使得颜色感知和解释的方式与人很接近,在需要手动指定颜色值时经常需要使用它们。HLS (hue、lightness、saturation) 类似于HSI,只是使用了术语lightness,而不是光强度intensity来表示亮度。

    HSI和HSV颜色空间的差异在于亮度分量(I or V)的计算方式。HSI颜色空间适合传统的图像处理函数,如卷积、均化、直方图等,可以通过处理亮度值来实现这些操作,因为亮度I对R、G、B值的依赖程度是一样的。HSV颜色空间适合处理色度和饱和度,因为它使得饱和度具有更大的动态取值范围

    6.    Ohta颜色空间

    Ohta颜色空间是1980年Ohta 等人提出的颜色空间,该空间中三个颜色分量,I1,I2,I3,为一组正交的颜色特征集,它们也可由RGB颜色空间转换得到,三个分量各自互相独立。

     

     

    利用该模型也可以对彩色图像进行分割,可以得到很好的效果(黄色的图像背景)

     

    数字图像处理和计算机视觉领域,遇到应用问题,应该怎么选择合适的色彩空间,下面是葛老师总结的一个表格,供参考

    小结:图象处理使用HIS较多,图形学使用HSV较多。图象分割使用HSV较多,Ohta较新。

     

     OpenCV转换图像的色彩空间的方法,参见博客:

    【OpenCV图像处理】颜色空间转换函数 cvtColor()

     

    展开全文
  •   提到图像增强,第一印象就是直方图均衡与直方图规定化,这是最常见的也是非常有效的全局图像增强方法。在前不久的一次组会讨论中,课题组的一位同学提到了“自适应图像增强”,虽然自己以前也用过,但是一时间...

    【fishing-pan:https://blog.csdn.net/u013921430 转载请注明出处】

      提到图像增强,第一印象就是直方图均衡与直方图规定化,这是最常见的也是非常有效的全局图像增强方法。在前不久的一次组会讨论中,课题组的一位同学提到了“自适应图像增强”,虽然自己以前也用过,但是一时间忘记了原理,就去复习了一下,其实他使用的方法的全称应该叫自适应直方图均衡,对应的是Matlab 中的adapthisteq 函数;

      我在复习的过程中,偶然发现了另一个图像增强的算法,也就是这篇文章中要提到的——自适应对比度增强(Adaptive Contrast Enhancement,ACE),下面就从原理到实现,来好好聊一下这种方法。

    自适应对比度增强

      在图像处理的方法中,自适应方法是与图像本身信息相关,根据图像对图特征对图像进行处理的一系列方法,这些方法往往具有更好的鲁棒性、普适性。而本文中提到的这种ACE方法由NarendraPMNarendra P M等人在《Real-Time Adaptive Contrast Enhancement》中提到,原理简单易懂,有兴趣的朋友可以点击链接去阅读。

       对于图像中的每一个点,分别计算其局部均值与局部标准差;
    M(i,j)=1(2n+1)(2m+1)s=ini+nk=jmj+mf(s,k)M(i,j)=\frac{1}{(2n+1)(2m+1)}\sum_{s=i-n}^{i+n}\sum_{k=j-m}^{j+m}f(s,k)
    σ2(i,j)=1(2n+1)(2m+1)s=ini+nk=jmj+m(f(s,k)M(i,j))2\sigma ^{2}(i,j)=\frac{1}{(2n+1)(2m+1)}\sum_{s=i-n}^{i+n}\sum_{k=j-m}^{j+m}(f(s,k)-M(i,j))^{2}
      上述式子中,f(s,k)f(s,k)代表坐标为(s,k)(s,k)的点的像素值,M(i,j)M(i,j)为以点(i,j)(i,j)为中心,窗口大小为[(2n+1)(2m+1)][(2n+1),(2m+1)]的区域的局部均值,对应的σ2(i,j)\sigma ^{2}(i,j)为局部的方差,σ(i,j)\sigma (i,j)为局部图像的标准差。
      
      在求得局部均值与标准差后,就可以对图像进行增强了,具体的公式如下;
    I(i,j)=M(i,j)+G(f(i,j)M(i,j))I(i,j)=M(i,j)+G(f(i,j)-M(i,j))
    G=αMσ(i,j)0<α<1G=\alpha \frac{M}{\sigma (i,j)}\qquad 0<\alpha<1
      上式中,I(i,j)I(i,j)为增强后的像素值,MM为全局均值(你也可以把它设为某一合理数值),α\alpha是一个系数参数,一般取小于1大于0的小数。

      再来分析一下,上面式子的含义;如果将每个点的局部均值M(i,j)M(i,j)构成一张图,其实就是均值滤波的结果,而在《数字图像傅里叶变换的物理意义及简单应用》中,我提到过均值滤波是一种低通滤波,获得的是图像的低频部分,也就是背景部分,f(i,j)M(i,j)f(i,j)-M(i,j)就可以用来量化图像中的一个点是高频还是低频。而在一般情况下,GG 都是大于1的,所以通过 G(f(i,j)M(i,j))G(f(i,j)-M(i,j))可以实现对图像的高频部分的放大,进而对图像进行增强。
    在这里插入图片描述
      再来看看参数GG,经过上面的过程可以看出,如果GG 是一个固定参数,比如都取5,通过式子中的局部均值,我们已经能够将图像实现一定程度上的自适应增强了。那么为什么还要在参数G中引入标准差呢?

      我们回忆一下对比度增强的初衷,对比度增强是为了让本身对比度不强的图像的对比度变得明显,而对本身对比度很强的图像,是没必要做增强的。那么在同一图像中,我们尤其需要增强对比度不强的部分。而方差表示的是图像的像素值的均匀性,我们可以认为方差越大的局部区域,其像素值越不均匀,对比度越强;反之,方差越小的局部区域,其像素值越均匀,对比度越弱。因此,在参数GG中除以了局部标准差,可以让图像中对比度较弱的部分的增强效果更加明显。

      其次,如果对整张图像中所有点进行等比例增强,图像中本身就是高频的部分出现过增强的现象,图像看起来十分奇怪。

    彩色图像的ACE

      在网上看到有人说,对彩色图像增强可以分别对RGB三通道进行增强后进行合并。这个观点是错误的,因为分别对各个通道进行增强,会引起图像色相的变化,图像会变的不是其原来的颜色了。

      所以需要将图像转到HSI色彩空间,或者是YCrCb颜色空间。前者只需要对I亮度通道进行增强,而H、S分别代表的色调和饱和度通道不需要变化。后者用Y通道表示亮度,只需要对Y通道进行增强即可。增强之后再合并通道,转换回RGB空间便完成了对彩色图像的增强。

    代码

      在这里我只提供一个adaptContrastEnhancement函数的代码,完整的代码也很简单,可以点击下载。无C币的可以直接在博客留言,我也会发送到你的邮箱。

    C++ 版本代码

    //--------------------------
    //Adaptive Contrast Enhancement(自适应对比度增强,ACE)
    //不用先生,2018.11.08
    //
    //函数功能:获取图像的局部均值与局部标准差的图
    //函数名称:adaptContrastEnhancement
    //函数参数:Mat &scr:输入图像,为三通道RGB图像;
    //函数参数:Mat &dst:增强后的输出图像,为三通道RGB图像;
    //函数参数:int winSize:局部均值的窗口大小,应为单数;
    //函数参数:int maxCg:增强幅度的上限;
    //返回类型:bool
    //--------------------
    
    bool adaptContrastEnhancement(Mat &scr, Mat &dst, int winSize,int maxCg)
    {
    	if (!scr.data)  //判断图像是否被正确读取;
    	{
    		cerr << "自适应对比度增强函数读入图片有误";
    		return false;
    	}
    
    	Mat ycc;                        //转换空间到YCrCb;
    	cvtColor(scr, ycc, COLOR_RGB2YCrCb);
    
    	vector<Mat> channels(3);        //分离通道;
    	split(ycc, channels);
    
    	
    	Mat localMeansMatrix(scr.rows , scr.cols , CV_32FC1);
    	Mat localVarianceMatrix(scr.rows , scr.cols , CV_32FC1);
    	
    	if (!getVarianceMean(channels[0], localMeansMatrix, localVarianceMatrix, winSize))   //对Y通道进行增强;
    	{
    		cerr << "计算图像均值与标准差过程中发生错误";
    		return false;
    	}
    
    	Mat temp = channels[0].clone();
    
    	Scalar  mean;
    	Scalar  dev;
    	meanStdDev(temp, mean, dev);
    
    	float meansGlobal = mean.val[0];
    	Mat enhanceMatrix(scr.rows, scr.cols, CV_8UC1);
    
    	for (int i = 0; i < scr.rows; i++)            //遍历,对每个点进行自适应调节
    	{
    		for (int j = 0; j < scr.cols; j++)
    		{
    			if (localVarianceMatrix.at<float>(i, j) >= 0.01)
    			{
    				float cg = 0.2*meansGlobal / localVarianceMatrix.at<float>(i, j);
    				float cgs = cg > maxCg ? maxCg : cg;
    				cgs = cgs < 1 ? 1 : cgs;
    				
    				int e = localMeansMatrix.at<float>(i, j) + cgs* (temp.at<uchar>(i, j) - localMeansMatrix.at<float>(i, j));
    				if (e > 255){ e = 255; }
    				else if (e < 0){ e = 0; }
    				enhanceMatrix.at<uchar>(i, j) = e;
    			}
    			else
    			{
    				enhanceMatrix.at<uchar>(i, j) = temp.at<uchar>(i, j);
    			}
    		}
    			
    	}
    	
    	channels[0] = enhanceMatrix;    //合并通道,转换颜色空间回到RGB
    	merge(channels, ycc);
    
    	cvtColor(ycc, dst, COLOR_YCrCb2RGB);
    		
    }
    
    

    Python 版本代码(2020.03.11)

      最近有不少人私信我,问我有没有python版本的代码,所以我晚上写了一份;完整的脚本都在这里了,里面提供了两种求均值方差的方法!

    # -*- coding: utf-8 -*-
    """
    Created on Wed Mar 11 20:20:47 2020
    
    @author: 不用先生
    """
    import numpy as np
    import cv2
    
    def getVarianceMean(scr, winSize):
        if scr is None or winSize is None:
            print("The input parameters of getVarianceMean Function error")
            return -1
        
        if winSize % 2 == 0:
            print("The window size should be singular")
            return -1 
        
        copyBorder_map=cv2.copyMakeBorder(scr,winSize//2,winSize//2,winSize//2,winSize//2,cv2.BORDER_REPLICATE)
        shape=np.shape(scr)
        
        local_mean=np.zeros_like(scr)
        local_std=np.zeros_like(scr)
        
        for i in range(shape[0]):
            for j in range(shape[1]):   
                temp=copyBorder_map[i:i+winSize,j:j+winSize]
                local_mean[i,j],local_std[i,j]=cv2.meanStdDev(temp)
                if local_std[i,j]<=0:
                    local_std[i,j]=1e-8
                
        return local_mean,local_std
        
    def adaptContrastEnhancement(scr, winSize, maxCg):
        if scr is None or winSize is None or maxCg is None:
            print("The input parameters of ACE Function error")
            return -1
        
        YUV_img=cv2.cvtColor(scr,cv2.COLOR_BGR2YUV)    ##转换通道
        Y_Channel = YUV_img[:,:,0]
        shape=np.shape(Y_Channel)
        
        meansGlobal=cv2.mean(Y_Channel)[0]
        
        ##这里提供使用boxfilter 计算局部均质和方差的方法
    #    localMean_map=cv2.boxFilter(Y_Channel,-1,(winSize,winSize),normalize=True)
    #    localVar_map=cv2.boxFilter(np.multiply(Y_Channel,Y_Channel),-1,(winSize,winSize),normalize=True)-np.multiply(localMean_map,localMean_map)
    #    greater_Zero=localVar_map>0
    #    localVar_map=localVar_map*greater_Zero+1e-8
    #    localStd_map = np.sqrt(localVar_map)
       
        localMean_map, localStd_map=getVarianceMean(Y_Channel,winSize)
    
        for i in range(shape[0]):
            for j in range(shape[1]):
                
                cg = 0.2*meansGlobal/ localStd_map[i,j];
                if cg >maxCg:
                    cg=maxCg
                elif cg<1:
                    cg=1
                
                temp = Y_Channel[i,j].astype(float)
                temp=max(0,min(localMean_map[i,j]+cg*(temp-localMean_map[i,j]),255))
                
    #            Y_Channel[i,j]=max(0,min(localMean_map[i,j]+cg*(Y_Channel[i,j]-localMean_map[i,j]),255))
                Y_Channel[i,j]=temp
                    
                
        YUV_img[:,:,0]=Y_Channel
        
        dst=cv2.cvtColor(YUV_img,cv2.COLOR_YUV2BGR)
        
        return dst
    
    def main():
        img=cv2.imread(input_fn)
        
        if img is None:
            print("The file name error,please check it")
            return -1
        
        print(np.shape(img))
        dstimg=adaptContrastEnhancement(img,15,10)
        
        cv2.imwrite('output.jpg',dstimg)
        cv2.waitKey(0)
        
        return 0
     
        
    input_fn='temp1.jpg'
    if __name__ == '__main__':
        main()
    
    
    

    运行结果

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

      可以明显看出,图像中原先对比度不强的部分,如树干、江面、远景。经过增强后,都有了明显的改善,而本身对比度已经明显的区域,就没有太大的改变。

    已完。。

    参考

    1. Narendra P M, Fitch R C. Real-time adaptive contrast enhancement[J]. IEEE transactions on pattern analysis and machine intelligence, 1981 (6): 655-661.
    2. http://www.cnblogs.com/Imageshop/p/3324282.html
    展开全文
  • 主要内容: ...封装后,算法之间互相替换,或者把几个算法组合起来进行更复杂的处理,都会更加容易而且这种模式能够尽可能地将算法的复杂性隐藏在一个直观的编程接口之后,因而有利于算法的部署。 准备工...
  • 虽然单单要做车牌号识别的话不需要特别多种类的图像处理,但是我们不能只是为了这么一个目标去学习,所以这次就讲一些OpenCV里基本的图像处理,大家以后可以根据需求使用不同的图像处理。 一、图像显示 这一步在...
  • 刚刚起步开始学习opencv图像处理: 今天学习的是怎样对于一幅RGB图像转变为灰度图像(并不是采用API直接实现), 并对RGB图像不同位置的像素值进行读取,以及对像素值进行修改。 主要用到的函数:(读取图像的...
  • opencv 彩色图像对比度增强
  • *在算法设计中使用策略...在效果图中,检测图像中偏黑色的部分,并将其设置为黑色 效果: OpenCV中也有计算向量的欧几里得范数的函数,因此也可以这样计算距离: return static_cast(cv::norm(cv::Vec3i(color[0]
  • 本节直接用代码讲解一些图像的基本操作 像素级访问 第一种方法:模板函数at&amp;amp;lt;&amp;amp;gt; uchar pixel=img.at(0,0); //获得灰度图像0,0点像素 Vec3b pixel=img.at(0,0); //获得3波段...
  • 通过彩色图像的直方图均衡化,创建一副在整个亮度范围内具有相同分布的亮度图像。
  • OpenCV 彩色图像均衡化

    2017-12-26 18:08:01
    处理彩色图像时,正确的方法是仅对亮度数据应用局部均衡。首先,将原始图像的RGB格式图像转换到HIS或Lab空间,然后修改亮度值,再后与原始色相饱和度值组合,以便计算新的RGB值,进而能够显示结果(Buzuloiu et al.,...
  • opencv2/imgcodecs.hpp" #include&lt;opencv2/highgui/highgui.hpp&gt; #include&lt;opencv2/imgproc/imgproc.hpp&gt; int main() { cv::Mat image = cv::imread("D:\\用户目录\\我的...
  • 前面已经介绍过灰度图像的平滑和锐化,下面使用均值平滑和拉普拉斯锐化处理彩色图像。 平滑结果: 平滑差异和锐化结果 代码实现: #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/...
  • 1、利用 OpenCV 读取图像。 具体内容:用打开 OpenCV 打开图像,并在窗口中显示 2、灰度图像二值化处理 具体内容:设置并调整阈值对图像进行二值化处理。 3、灰度图像的对数变换 ...具体内容:对彩色图像进行补色变换。
  • 我把颜色空间从BGR转化到了HSV了。其他颜色(橙、黄、绿等颜色)都能显示得很清楚,就是红色不行,是什么原因呢?主要代码如下: Mat imgHSV; vector<Mat> hsvSplit;... cvtColor(imgOriginal, imgHSV, COLOR...
  • 彩色图像直方图均衡化的主要步骤和灰度直方图均衡化的步骤一样,区别就在于彩色图像需要分别计算BGR三个通道. import cv2 import numpy as np img = cv2.imread('image0.jpg', 1) cv2.imshow('src', img) imgInfo...
  • cv彩色图像逐个像素访问 https://blog.csdn.net/kezunhai/article/details/41652959 https://blog.csdn.net/stack_moon/article/details/82285403
  • 先均衡化一下图像亮度看看情况,方法:由BGR--&gt;YCrCb---&gt;均衡化Y---&gt;BGR   代码如下: #include &lt;iostream&gt; #include &lt;string&gt; #include "opencv2/...
1 2 3 4 5 ... 20
收藏数 11,837
精华内容 4,734