图像增强_图像增强算法 - CSDN
图像增强 订阅
增强图像中的有用信息,它可以是一个失真的过程,其目的是要改善图像的视觉效果,针对给定图像的应用场合。有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。 展开全文
增强图像中的有用信息,它可以是一个失真的过程,其目的是要改善图像的视觉效果,针对给定图像的应用场合。有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。
信息
外文名
image enhancement
类    型
频率域法和空间域法
方    法
基于空域的算法和基于频域的算法
中文名
图像增强
目    的
改善图像的视觉效果
应用领域
航空航天领域、生物医学领域等
图像增强基本信息
图像增强可分成两大类:频率域法和空间域法。前者把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。采用低通滤波(即只让低频信号通过)法,可去掉图中的噪声;采用高通滤波法,则可增强边缘等高频信号,使模糊的图片变得清晰。后者空间域法中具有代表性的算法有局部求平均值法和中值滤波(取局部邻域中的中间像素值)法等,它们可用于去除或减弱噪声。图像增强的方法是通过一定手段对原图像附加一些信息或变换数据,有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征,使图像与视觉响应特性相匹配。在图像增强过程中,不分析图像降质的原因,处理后的图像不一定逼近原始图像。图像增强技术根据增强处理过程所在的空间不同,可分为基于空域的算法和基于频域的算法两大类。空域法是对图像中的像素点进行操作,用公式描述如下:g(x,y)=f(x,y)*h(x,y)其中是f(x,y)是原图像;h(x,y)为空间转换函数;g(x,y)表示进行处理后的图像。基于空域的算法处理时直接对图像灰度级做运算,基于频域的算法是在图像的某种变换域内对图像的变换系数值进行某种修正,是一种间接增强的算法。基于空域的算法分为点运算算法 [1]  和邻域去噪算法 [2]  。点运算算法即灰度级校正、灰度变换和直方图修正等,目的或使图像成像均匀,或扩大图像动态范围,扩展对比度。邻域增强算法分为图像平滑和锐化两种。平滑一般用于消除图像噪声,但是也容易引起边缘的模糊。常用算法有均值滤波、中值滤波。锐化的目的在于突出物体的边缘轮廓,便于目标识别。常用算法有梯度法、算子、高通滤波、掩模匹配法、统计差值法等。
收起全文
精华内容
参与话题
  • 图像增强方法

    千次阅读 2019-08-28 20:43:18
    图像增强的目的是采用某种技术手段,改善图像的视觉效果,或者将图像转换成更适合人眼观察和机器识别的形式。图像增强的基本方法主要有灰度变换、灰度均衡、伪彩色增强、平滑、锐化、滤波等。灰度变换、灰度均衡。 ...

           图像增强的目的是采用某种技术手段,改善图像的视觉效果,或者将图像转换成更适合人眼观察和机器识别的形式。图像增强的基本方法主要有灰度变换、灰度均衡、伪彩色增强、平滑、锐化、滤波等。灰度变换、灰度均衡。

    线性滤波:方框滤波、均值滤波、高斯滤波 

    非线性滤波:中值滤波、双边滤波

    图像增强可以分为两种:

    • 领域处理技术。对像素点及其周围的点进行处理,即使用卷积核。
    • 点处理技术。只对单个像素进行处理

    点运算

    线性变换
    图像增强线性变换主要对图像的对比度和亮度进行调整,线性变换公式如下:
     

    参数 a 影响图像的对比度,参数 b 影响图像的亮度,具体分为可分为以下几种情况:

    a>1: 增强图像的对比度,图像看起来更加清晰
    a<1: 减小了图像的对比度, 图像看起来变模糊
    a<0 and b=0:图像的亮区域变暗,暗区域变亮
    a=1 and b≠0:图像整体的灰度值上移或者下移,也就是图像整体变亮或者变暗,不会改变图像的对比度,b>0时图像变亮,b<0时图像变暗
    a=-1 and b=255:图像翻转

    cv::convertScaleAbs()用于实现对整个图像数组中的每一个元素,进行如下操作:

     该操作可实现图像增强等相关操作的快速运算,具体用法如下:

    void cv::convertScaleAbs(
        cv::InputArray src, // 输入数组
        cv::OutputArray dst, // 输出数组
        double alpha = 1.0, // 乘数因子
        double beta = 0.0 // 偏移量
    );

    分段线性变换

    https://blog.csdn.net/cyf15238622067/article/details/87717092 

    对数变换

    图像直方图均衡化

    幂律变换/gamma变换

    高反差保留
           高反差保留主要是将图像中颜色、明暗反差较大两部分的交界处保留下来,比如图像中有一个人和一块石头,那么石头的轮廓线和人的轮廓线以及面部、服装等有明显线条的地方会变被保留,儿其他大面积无明显明暗变化的地方则生成中灰色。其表达形式为:dst = r*(img - Blur(img))。

    	Mat image = imread("test.jpg");
    	Mat temp;
    	GaussianBlur(image, temp, Size(7, 7), 2.0);
    
    	int r = 10;
    	Mat diff = image + r * (image - temp); //高反差保留算法
    
    	imshow("原图", image);
    	imshow("反差图片", diff);
    

     

    加Masaic算法

      在日常中有时候保密或其他需要将图像马赛克,下面的算法实现图像马赛克功能(原理:用中心像素来表示邻域像素)。 

    uchar getPixel( IplImage* img, int row, int col, int k)
    {
        return ((uchar*)img->imageData + row* img->widthStep)[col*img->nChannels +k];
    }
     
    void setPixel( IplImage* img, int row, int col, int k, uchar val)
    {
        ((uchar*)img->imageData + row* img->widthStep)[col*img->nChannels +k] = val;
    }
    
    // nSize:为尺寸大小,奇数
    // 将邻域的值用中心像素的值替换
    void Masic(IplImage* img, IplImage* dst, int nSize)
    {
        int offset = (nSize-1)/2;
        for ( int row = offset; row <img->height - offset; row= row+offset)
        {
            for( int col= offset; col<img->width - offset; col = col+offset)
            {
                int val0 = getPixel(img, row, col, 0);
                int val1 = getPixel(img, row, col, 1);
                int val2 = getPixel(img, row, col, 2);
                for ( int m= -offset; m<offset; m++)
                {
                    for ( int n=-offset; n<offset; n++)
                    {
                        setPixel(dst, row+m, col+n, 0, val0);
                        setPixel(dst, row+m, col+n, 1, val1);
                        setPixel(dst, row+m, col+n, 2, val2);
                    }
                }
            }
        }
    
    

    图像滤波


    图像滤波包括空间域滤波和频率域滤波。

    伪彩色增强、平滑、锐化和滤波。

    参考:

    https://blog.csdn.net/weixin_39731083/article/details/81227533

    https://blog.csdn.net/kezunhai/article/details/41553097

    展开全文
  • 【计算机视觉】图像处理——图像增强技术(一)

    万次阅读 多人点赞 2020-08-18 15:44:37
    好久没有发过计算机视觉的...然而如果把这种事情交给计算机来做的话,可能就有难度了,所以,为了让人工智能设备的视觉系统可以更加准确地找到我们想让它找到的目标,视觉三个基本步骤的第一个步骤——图像处理,就...

    好久没有发过计算机视觉的文章啦~

    差点就忘记自己的本职工作了......

    —————————————下面是正文—————————————

           对于人的眼睛来说,要识别一幅不太清晰的照片上面的人物可能不是一件难事,然而如果把这种事情交给计算机来做的话,可能就有难度了,所以,为了让人工智能设备的视觉系统可以更加准确地找到我们想让它找到的目标,视觉三个基本步骤的第一个步骤——图像处理,就显得尤为重要(三个基本步骤不知道是哪三个的同学可以找我之前的视觉文章【计算机视觉】数字图像以及图像处理的基本步骤,增加下点击量,hiahiahia~),

           作为视觉处理的第一步,图像处理主要负责把图像进行初步的去噪、增强等,使得原本模糊的照片变得比原来更为清晰,突出目标,但是值得注意的是,视觉处理大部分情况下都是为了突出目标而达到尽量接近清晰的结果,并不能百分百地把一张照片还原成原图,比如想百分百去掉马赛克什么的......还是想想就好~(其实去马赛克最有效的方法是眯着眼然后远远地看 ~-~)

           在图像处理中,有很多的方法可以让图像变得清晰,其中一个就是叫 “图像增强” 的方法 ,图像增强主要应用在图像特别暗时,或者因为曝光太亮而无法让目标突出,这个时候就需要把目标的亮度提高一点,然后把不必要的障碍(俗称:噪声)调暗,以把目标清晰度最大化。今天就来讲几个比较简单的,专门对于像素进行处理的方法。

     

    一.对比度增强法

           对比度增强的方法有很多,其中最简单的就是让每个像素都乘以一个数,使得图像整体的像素扩大,提高对比度。在这里说一下什么是对比度:图像的亮区与暗区的灰度的比值,图像的对比度越大,明暗的区分就会更加明显,目标更为突出。什么是叫灰度值:图像上各个像素的亮度值。图像从模拟量转化到数字量,经由量化和采样之后,将一幅图像分成了N个格子,而这个格子就称之为 “像素” , 每个格子里面都保存有一个离散型数字,代表这个地方的灰度值。

           假设用 (x,y) 来表示每个像素的位置,辣么 每个像素中的灰度值就可以用  F(x,y) 来表示,G(X , Y) 表示经过对比度增强的处理之后的像素值,辣么用一个标准的公式就可以这样来表达:

                                                                

           其中   N    代表倍数,下面我们来用  MATLAB  来实现一下对比度增强,图像就用一下这张在百度上搜刮下来的:

                                      

                                                                       原     图

                                                 

                                                                      原图直方图

           处理的代码略微简单,就只有那么几行,主要就是读入图像,然后把图像的每个像素都乘以N倍,然后输出就可以了。

    I = imread("yuantu.jpg"); %读入原图
    I1 = 2 * I; %把原图的每个像素都乘以2倍
    figure,imshow(I1); %输出处理后的图像

            执行代码可以得到如下效果图

                                          

                                                                        结 果 图

                                                    

                                                                       结果图直方图

           由图可以看出,当源图像的所有像素全部扩大两倍之后,原先一些暗区会变得超级清晰,但同时原本已经够清楚的地方也会因为像素扩大而变得高亮

     

    二.灰度变换

             灰度值变换主要是分为 线性变换非线性变换 两种,因线性较多,先介绍线性变换

          (1).线性变换

            线性变换可以被应用于因成像设备动态范围太狭窄等因素造成的对比度不足、细节分辨不清等问题,采用线性变换可以把图像的某一个像素相对集中的范围拉宽到某一个范围之内,使得因灰度值过度集中而导致图像细节不清晰的问题。用坐标系来表示如下

                                   

            举个栗子,以下图为例

                                              

                                                      原  图

            第一步:先调出原图的直方图

                                              

            由直方图可以得知,原图的像素值主要集中在0.4~0.7这个范围,所以,如果我们把[0.4 0.7]的像素值扩展到 [0 1]范围中,将会使得原图中大片相同的像素降低,而原图中的细节将会被提亮

             第二步:灰度范围拉伸

             这一步实现起来也非常的简单,因为MATLAB里面有个函数叫 imadjust(I,[low_in; high_in],[low_out; high_out])  ,具体的用法可以再 MATLAB 的命令行里面输入 : help imadjust 获取详细用法 。

    I3 = imadjust(I,[0.45 0.7],[]); %在这里,I 表示输入的原图,经过函数的处理之后在用一个I3里存放

              第三步:显示结果

                                               

                                                      结 果 图

                                               

                                                     结果直方图

               在后面还有直方图均衡化、全局、局部等基于像素的操作方法,待我慢慢道来

    展开全文
  • 图像增强技术

    千次阅读 2018-08-27 10:52:20
    一、空域内的图像增强 空域内的图像增强就是调整灰度图像的明暗对比度,是对图像中各个像素的灰度值直接进行处理。常用的方法包括灰度变换增强和直方图增强。下面分别进行介绍。 1. 灰度变换增强 灰度变换增强是...

    一、空域内的图像增强

    空域内的图像增强就是调整灰度图像的明暗对比度,是对图像中各个像素的灰度值直接进行处理。常用的方法包括灰度变换增强和直方图增强。下面分别进行介绍。

    1. 灰度变换增强

    灰度变换增强是在空间域内对图像进行增强的一种简单而有效的方法。灰度变换增强不改变原图像中像素的位置,只改变像素点的灰度值,并逐点进行,和周围的其他像素点无关。为了进行灰度变换,首先需要获取图像的直方图。在MATLAB中,可以通过编写程序获取灰度图像的直方图,也可以通过函数imhist( )获取灰度图像的直方图。

    2. 直方图增强

    图像的灰度直方图表示灰度图像中具有每种灰度的像素的个数,反映了图像中每种灰度级出现的频率,是图像的基本统计特征之一。直方图均衡方法因为其有效性和简单性己成为图像对比度增强的最常用方法。其基本思想是根据输入图像的灰度概率分布来确定其对应的输出灰度值,通过扩展图像的动态范围达到提升图像对比度的目的。

    直方图增强是以概率论为基础,常用的直方图调整方法包括直方图均衡化和直方图规定化两方面。

    3.图像的标准差

    对于向量,其中,其标准差为:

    其中,该向量的长度为n

    MATLAB软件中,采用函数std( )计算向量的标准差,通过函数std2( )计算矩阵的标准差。灰度图像的像素为二维矩阵A,则该图像的标准差为std2(A)。函数std( )和函数std2( )的详细使用情况,读者可以查阅MATLAB的帮助系统。

    4.图像的相关系数

    灰度图像的像素为二维矩阵。两个大小相等的二维矩阵,可以计算其相关系数,其公式如下:

    其中和为大小为mn列的灰度图像,为mean2(A),为mean2(B)

    5.图像的等高线

    MATLAB软件中,通过函数imcontour( )可以绘制灰度图像的等高线。该函数的简单调用格式为:

    imcontour(I):该函数中I为灰度图像的二维数据矩阵,绘制灰度图像的等高线。

    imcontour(I, n):该函数设置等高线的条数为n,如果不指定n,该函数会自动选取n

    6.空域滤波

    空域滤波是空域图像增强的常用方法。空域滤波是对图像中每个像素为中心的邻域进行一系列的运算,然后将得到的结果代替原来的像素值。空域滤波分为线性空域滤波和非线性空域滤波。下面分别进行介绍。

     

    线性空域滤波:

    线性平均滤波是一种最常用的线性空域滤波。线性平均滤波实际是一种低通滤波,信号的低频部分通过,阻止高频部分通过。由于图像的边缘处于高频部分,因此线性平均滤波后,会造成图像边缘的模糊。

    在进行线性平均滤波时,常用的模板大小为3×3,如下所示:

    对应的函数表达式为:

     

    非线性空域滤波:

    非线性空域滤波主要包括中值滤波、顺序统计滤波和自适应滤波等。中值滤波是一种保护边缘的非线性图像平滑方法,在图像增强中应用非常广泛。下面首先介绍一维中值滤波。对于一维数据,按照从大到小的顺序进行排列,则:

    二维中值滤波用于图像的增强。中值滤波可以去除图像中的椒盐噪声,平滑效果优于均值滤波,在抑制噪声的同时还能够保持图像的边缘清晰。在MATLAB软件中,采用函数medfilt2( )进行图像的二维中值滤波。

    二、频域滤波

    频率域图像增强首先通过傅立叶变换将图像从空间域转换为频率域,然后在频率域内对图像进行处理,最后通过傅立叶反变换转换到空间域。频率域内的图像增强通常包括低通滤波、高通滤波和同态滤波等。

    为原始图像函数, 为滤波器脉冲响应函数,则空域内的滤波是基于卷积运算的,如下所示

    其中 可以是低通或高通滤波, 为空域滤波的输出图像函数。根据卷积定理,上式的傅立叶变换如下:

    1.低通滤波

    低通滤波器的功能是让低频率通过而滤掉或衰减高频,其作用是过滤掉包含在高频中的噪声。所以低通滤波的效果是图像的去噪声平滑增强,但同时也抑制了图像的边界,造成图像不同程度上的模糊。对于大小为的图像,频率点与频域中心的距离为,其表达式为:

    2.高通滤波

    衰减或抑制低频分量,让高频分量通过称为高通滤波,其作用是使图像得到锐化处理,突出图像的边界。经理想高频滤波后的图像把信息丰富的低频去掉了,丢失了许多必要的信息。一般情况下,高通滤波对噪声没有任何抑制作用,若简单的使用高通滤波,图像质量可能由于噪声严重而难以达到满意的改善效果。为了既加强图像的细节又抑制噪声,可采用高频加强滤波。这种滤波器实际上是由一个高通滤波器和一个全通滤波器构成的,这样便能在高通滤波的基础上保留低频信息。

    3.带阻滤波器

    带阻滤波器是用来抑制距离频域中心一定距离的一个圆环区域的频率,可以用来消除一定频率范围的周期噪声。带阻滤波器包括理想带阻滤波器、巴特沃斯带阻滤波器和高斯带阻滤波器。

    同态滤波

    展开全文
  • OpenCV--Python 图像增强

    万次阅读 多人点赞 2020-07-27 11:13:15
    图像增强主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来增加清晰。对比度增强有几种常用的方法,如线性变换、分段线性变换、伽马...

    图像增强主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来增加清晰。对比度增强有几种常用的方法,如线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化等。

    1.灰度直方图

    在讲解图像增强的方法之前先来认识一下灰度直方图,灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。接下来使用程序实现直方图:

    import cv2 as cv
    import numpy as np
    import matplotlib.pyplot as plt
    
    def calcGrayHist(I):
        # 计算灰度直方图
        h, w = I.shape[:2]
        grayHist = np.zeros([256], np.uint64)
        for i in range(h):
            for j in range(w):
                grayHist[I[i][j]] += 1
        return grayHist
    
    img = cv.imread("../testImages/4/img1.jpg", 0)
    grayHist = calcGrayHist(img)
    x = np.arange(256)
    # 绘制灰度直方图
    plt.plot(x, grayHist, 'r', linewidth=2, c='black')
    plt.xlabel("gray Label")
    plt.ylabel("number of pixels")
    plt.show()
    # cv.imshow("img", img)
    # cv.waitKey()
    

    Matplotlib本身也提供了计算直方图的函数hist,以下由matplotlib实现直方图的生成:

    import cv2 as cv
    import numpy as np
    import matplotlib.pyplot as plt
    img = cv.imread("../testImages/4/img1.jpg", 0)
    h, w = img.shape[:2]
    pixelSequence = img.reshape([h * w, ])
    numberBins = 256
    histogram, bins, patch = plt.hist(pixelSequence, numberBins,
                                      facecolor='black', histtype='bar')
    plt.xlabel("gray label")
    plt.ylabel("number of pixels")
    plt.axis([0, 255, 0, np.max(histogram)])
    plt.show()
    cv.imshow("img", img)
    cv.waitKey()
    

    图像的对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰,所以通过算法调整图像的灰度值,从而调整图像的对比度是有必要的。最简单的一种对比度增强的方法是通过灰度值的线性变换实现的。

    2.线性变换

    假设输入图像为I,宽为W,高为H,输出图像记为O,图像的线性变换可以用以下公式定义:

            O(r,c) = a * I(r,c) + b, 0\leqslant r<H,0\leqslant c<W

    如下图所示,当a=1,b=0时,OI的一个副本;如果a>1,则输出图像O的对比度比I有所增大;如果0<a<1,则O的对比度比I有所减小。而b值的改变,影响的是输出图像的亮度,当b>0时,亮度增加;当b<0时,亮度减小。下面代码实现:

    import numpy as np
    a = np.array([[0, 200], [23, 4]], np.uint8)
    b = 2 * a
    print(b.dtype)
    print(b)
    '''
    uint8
    [[  0 144]
     [ 46   8]]
    '''
    

    在上面代码中,输入的是一个uint8类型的ndarray,用数字2乘以该数组,返回的ndarray的数据类型是uint8。注意输出第0行第1列,200*2应该等于400,但是400超出了uint8的数据范围,Numpy是通过模运算归到uint8范围的,即400%256=144,从而转换成uint8类型。如果将常数2改为2.0,虽然这个常数只是整型和浮点型的区别,但是结果却不一样。代码如下:

    import numpy as np
    a = np.array([[0, 200], [23, 4]], np.uint8)
    b = 2.0 * a
    print(b.dtype)
    print(b)
    '''
    float64
    [[   0.  400.]
     [  46.    8.]]
    '''
    

    可以发现返回的ndarray的数据类型变成了float64,也就是说,相乘的常数是2和2.0会导致返回的ndarray的数据类型不一样,就会造成200*2的返回值是144,而200*2.0的值却是400;而对8位图进行对比度增强来说,线性变换计算出的输出值可能要大于255,需要将这些值截断为255,而不是取模运算,所以不能简单地只是用“*”运算来实现线性变换。具体代码如下:

    import cv2 as cv
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 绘制直方图函数
    def grayHist(img):
        h, w = img.shape[:2]
        pixelSequence = img.reshape([h * w, ])
        numberBins = 256
        histogram, bins, patch = plt.hist(pixelSequence, numberBins,
                                          facecolor='black', histtype='bar')
        plt.xlabel("gray label")
        plt.ylabel("number of pixels")
        plt.axis([0, 255, 0, np.max(histogram)])
        plt.show()
    
    img = cv.imread("../testImages/4/img4.jpg", 0)
    out = 2.0 * img
    # 进行数据截断,大于255的值截断为255
    out[out > 255] = 255
    # 数据类型转换
    out = np.around(out)
    out = out.astype(np.uint8)
    # 分别绘制处理前后的直方图
    # grayHist(img)
    # grayHist(out)
    cv.imshow("img", img)
    cv.imshow("out", out)
    cv.waitKey()
    
    (a)原图                     (b)图(a)的灰度直方图                    (c)a=2的线性变换                       (d)图(c)的灰度直方图

    以上线性变换是对整个灰度级范围使用了相同的参数,有的时候也需要针对不同灰度级范围进行不同的线性变换,这就是常用的分段线性变换,经常用于降低较亮或较暗区域的对比度来增强灰度级处于中间范围的对比度,或者压低中间灰度级处的对比度来增强较亮或者较暗区域的对比度。从下图(a)的灰度直方图(b)可以看出,图像的灰度主要集中在 [100,150]之间,可以通过以下分段线性变换将主要的灰度级拉伸到[50,230],结果如图(c)所示,对比度拉伸后显然比原图能够更加清晰地看到更多的细节。

    (a)原图                                (b)图(a)的灰度直方图                     (c)分段线性变换                     (d)图(c)的灰度直方图
    img = cv.imread("../testImages/4/img7.jpg", 0)
    img = cv.resize(img, None, fx=0.3, fy=0.3)
    h, w = img.shape[:2]
    out = np.zeros(img.shape, np.uint8)
    for i in range(h):
        for j in range(w):
            pix = img[i][j]
            if pix < 50:
                out[i][j] = 0.5 * pix
            elif pix < 150:
                out[i][j] = 3.6 * pix - 310
            else:
                out[i][j] = 0.238 * pix + 194
            # 数据类型转换
    out = np.around(out)
    out = out.astype(np.uint8)
    # grayHist(img)
    # grayHist(out)
    cv.imshow("img", img)
    cv.imshow("out", out)
    cv.waitKey()

    线性变换的参数需要根据不同的应用及图像自身的信息进行合理的选择,可能需要进行多次测试,所以选择合适的参数是相当麻烦的。直方图正规化就是基于当前图像情况自动选取a和b的值的方法,下面介绍这种方法。

    3.直方图正规化

    假设输入图像为I,宽为W,高为HI(r,c)代表I的第r行第c列的灰度值,将I中出现的最小灰度级记为I_{min},最大灰度级记为I_{max},即I(r,c) \in [I_{min},I_{max}],为使输出图像O的灰度级范围为 [O_{min},O_{max}]I(r,c)O(r,c)做以下映射关系:

    O(r,c) = \frac{O_{max}-O_{min}}{I_{max}-I_{min}}(I(r,c)-I_{min}) + O_{min},0\leqslant r<H,0\leqslant c<W

    这个过程就是直方图正规化,直方图正规化是一种自动选取a和b的值的线性变换方法,其中

    a = \frac{O_{max}-O_{min}}{I_{max}-I_{min}},b=O_{min}-\frac{O_{max}-O_{min}}{I_{max}-I_{min}}*I_{min}

    下面使用Python代码实现直方图正规化:

    
    img = cv.imread("../testImages/4/img6.jpg", 0)
    # 计算原图中出现的最小灰度级和最大灰度级
    # 使用函数计算
    Imin, Imax = cv.minMaxLoc(img)[:2]
    # 使用numpy计算
    # Imax = np.max(img)
    # Imin = np.min(img)
    Omin, Omax = 0, 255
    # 计算a和b的值
    a = float(Omax - Omin) / (Imax - Imin)
    b = Omin - a * Imin
    out = a * img + b
    out = out.astype(np.uint8)
    cv.imshow("img", img)
    cv.imshow("out", out)
    cv.waitKey()

    代码中计算原图中出现的最小灰度级和最大灰度级可以使用OpenCV提供的函数 

    minVal, maxVal, minLoc, maxLoc  = cv.minMaxLoc(src[, mask])

    返回值分别为:最小值,最大值,最小值的位置索引,最大值的位置索引。

    正规化函数normalize: dst=cv.normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]])

    使用函数normalize对图像进行对比度增强时,经常令参数norm_type=NORM_MINMAX,此函数内部实现和咱们上边讲的计算方法是相同的,参数alpha相当于O_{max},参数beta相当于O_{min}。注意,使用normalize可以处理多通道矩阵,分别对每一个通道进行正规化操作。使用该函数的代码如下,实现结果和上边是相同的:

    img = cv.imread("../testImages/4/img6.jpg", 0)
    out = np.zeros(img.shape, np.uint8)
    cv.normalize(img, out, 255, 0, cv.NORM_MINMAX, cv.CV_8U)
    cv.imshow("img", img)
    cv.imshow("out", out)
    cv.waitKey()

    4.伽马变换

    假设输入图像为I,宽为W,高为H,首先将其灰度值归一化到[0,1]范围,对于8位图来说,除以255即可。I(r,c)代表归一化后的第r行第c列的灰度值,输出图像记为O,伽马变换就是O(r,c) = I(r,c)^\gamma,0\leqslant r<H,0\leqslant c<W。当\gamma =1时,图像不变。如果图像整体或者感兴趣区域较暗,则令0<\gamma <1可以增加图像对比度;相反,如果图像整体或者感兴趣区域较亮,则令\gamma >1可以降低图像对比度。图像的伽马变换实质上是对图像矩阵中的每一个值进行幂运算,Numpy提供的幂函数power实现了该功能,代码实现如下:

    img = cv.imread("../testImages/4/img8.jpg", 0)
    # 图像归一化
    fi = img / 255.0
    # 伽马变换
    gamma = 0.4
    out = np.power(fi, gamma)
    cv.imshow("img", img)
    cv.imshow("out", out)
    cv.waitKey()
    

    伽马变换在提升对比度上有比较好的效果,但是需要手动调节\gamma值。下面介绍一种利用图像的直方图自动调节图像对比度的方法。

    5.全局直方图均衡化

    对于直方图均衡化的实现主要分为四个步骤:
    1、计算图像的灰度直方图
    2、计算灰度直方图的累加直方图
    3、输入灰度级和输出灰度级之间的映射关系
    4、根据映射关系循环输出图像的每一个像素的灰度级
    其中的映射关系是:q=\frac{\sum_{k=0}^{p}hist_{I}(k)}{H*W}*256-1,其中q为输出的像素,p为输入的像素。可以这么理解,\frac{\sum_{k=0}^{p}hist_{I}(k)}{H*W}这一项相当于是灰度直方图的累加概率直方图(范围在0~1之间),再将此范围放大至0~255之间便得到输出图像的像素。下面使用程序来实现:

    def equalHist(img):
        # 灰度图像矩阵的高、宽
        h, w = img.shape
        # 第一步:计算灰度直方图
        grayHist = calcGrayHist(img)
        # 第二步:计算累加灰度直方图
        zeroCumuMoment = np.zeros([256], np.uint32)
        for p in range(256):
            if p == 0:
                zeroCumuMoment[p] = grayHist[0]
            else:
                zeroCumuMoment[p] = zeroCumuMoment[p - 1] + grayHist[p]
        # 第三步:根据累加灰度直方图得到输入灰度级和输出灰度级之间的映射关系
        outPut_q = np.zeros([256], np.uint8)
        cofficient = 256.0 / (h * w)
        for p in range(256):
            q = cofficient * float(zeroCumuMoment[p]) - 1
            if q >= 0:
                outPut_q[p] = math.floor(q)
            else:
                outPut_q[p] = 0
        # 第四步:得到直方图均衡化后的图像
        equalHistImage = np.zeros(img.shape, np.uint8)
        for i in range(h):
            for j in range(w):
                equalHistImage[i][j] = outPut_q[img[i][j]]
        return equalHistImage
    
    img = cv.imread("../testImages/4/img1.jpg", 0)
    # 使用自己写的函数实现
    equa = equalHist(blur)
    # grayHist(img, equa)
    # 使用OpenCV提供的直方图均衡化函数实现
    # equa = cv.equalizeHist(img)
    cv.imshow("img", img)
    cv.imshow("equa", equa)
    cv.waitKey()
    

    理解了上述代码,对于OpenCV提供的函数 equalizeHist() 就可以轻松掌握了,使用方法很简单,只支持对8位图的处理。虽然全局直方图均衡化方法对提高对比度很有效,但是均衡化处理以后暗区域的噪声可能会被放大,变得清晰可见,而亮区域可能会损失信息。为了解决该问题,提出了自适应直方图均衡化(Aptive Histogram Equalization)方法。

    6.限制对比度的自适应直方图均衡化

    自适应直方图均衡化首先将图像划分为不重叠的区域块,然后对每一个块分别进行直方图均衡化。显然,在没有噪声影响的情况下,每一个小区域的灰度直方图会被限制在一个小的灰度级范围内;但是如果有噪声,每一个分割的区域块执行直方图均衡化后,噪声会被放大。为了避免出现噪声这种情况,提出了“限制对比度”(Contrast Limiting),如果直方图的bin超过了提前预设好的“限制对比度”,那么会被裁剪,然后将裁剪的部分均匀分布到其他的bin,这样就重构了直方图。下面介绍OpenCV实现的限制对比度的自适应直方图均衡化函数,

    img = cv.imread("../testImages/4/img3.jpg", 0)
    img = cv.resize(img, None, fx=0.5, fy=0.5)
    # 创建CLAHE对象
    clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    # 限制对比度的自适应阈值均衡化
    dst = clahe.apply(img)
    # 使用全局直方图均衡化
    equa = cv.equalizeHist(img)
    # 分别显示原图,CLAHE,HE
    cv.imshow("img", img)
    cv.imshow("dst", dst)
    cv.imshow("equa", equa)
    cv.waitKey()

    OpenCV提供的函数:cv.createCLAHE([, clipLimit[, tileGridSize]])

    参数 解释
    clipLimit 对比度限制的阈值,默认为40
    tileGridSize 用于直方图均衡的区域块大小。 输入图像将被分成相同大小的矩形块。 tileGridSize定义行和列中的块数。默认为(8,8)

    上图显示了对原图(a)进行限制对比度自适应直方图均衡化(CLAHE)和全局直方图均衡化(HE)的效果,会发现,原图中比较亮的区域,经过HE处理后出现了失真的情况,而且出现了明显的噪声,而CLAHE避免了这两种情况。

    7.总结

    对比度增强只是图像增强方法中的一种手段,对比度拉伸的方法受图像噪声的影响会明显,下一篇介绍去除噪声的方法,去噪之后再使用对比度增强技术效果会更好。

    本篇文章讲解了灰度直方图的可视化、线性变换、分段线性变换、直方图正规化、伽马变换、全局直方图均衡化、限制对比度的自适应直方图均衡化,使用到的函数有 minMaxLoc(),normalize(),equalizeHist(),createCLAHE()。

    展开全文
  • 图像增强

    万次阅读 多人点赞 2018-07-31 10:20:27
    我们还需要利用图像增强技术,对图像进行进一步处理,以得到更好的特征和视觉效果。 图像增强:  一般的图像增强方法根据增强处理过程所在的空间不同,可分为基于空域和频域的方法。基于空域的方法直接对图像进行...
  • 图像增强的方法

    千次阅读 热门讨论 2018-11-13 16:42:44
    最近在做基于图像的文字和公式识别项目,在想是不是去噪及灰度化之后用NN效果会更好。下面是常用的增强方法,先罗列一下。 reference https://blog.csdn.net/m0_38007695/article/details/82718107 #!/usr/bin/...
  • (4)图像增强- Part1. 对比度增强

    千次阅读 2019-06-03 17:43:03
    本章主要总结了图像增强技术中的点处理技术,包括灰度直方图的获取、直方图均衡化、直方图规范化和对比度调整等内容。C++和Python语言环境下,使用OpenCV工具实现上述图像增强操作。 OpenCV 简介: 1、OpenCV的...
  • 基于直方图的图像增强算法(HE、CLAHE)之(二)

    万次阅读 多人点赞 2020-04-17 03:16:37
    作为图像增强算法系列的第二篇文章,下面我们将要介绍功能强大、用途广泛、影响深远的对比度有限的自适应直方图均衡(CLAHE,Contrast Limited Adaptive Histogram Equalization)算法。尽管最初它仅仅是被当作一种...
  • Retinex图像增强算法

    万次阅读 热门讨论 2018-07-22 21:09:19
    Retinex图像增强算法   Retinex是一种常用的建立在科学实验和科学分析基础上的图像增强方法,它是Edwin.H.Land于1963年提出的。就跟Matlab是由Matrix和Laboratory合成的一样,Retinex也是由两个单词合成的一个...
  • 图像去雾(二)Retinex图像增强算法

    万次阅读 2020-08-23 18:35:52
    前一段时间研究了一下图像增强算法,发现Retinex理论在彩色图像增强、图像去雾、彩色图像恢复方面拥有很好的效果,下面介绍一下我对该算法的理解。 Retinex理论 Retinex理论始于Land和McCann于20世纪60年代作出的...
  • Opencv 学习---8种常用图像增强算法

    万次阅读 多人点赞 2018-07-21 17:12:52
    常见的8种图像增强算法及其opencv实现 1.直方图均衡化  直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。   这种方法通常用来增加许多图像的局部对比度。这种方法对于背景和前景都太亮或者...
  • 图像处理--图像增强

    千次阅读 2015-02-06 10:30:54
     对于一个图像处理系统来说,可以将流程分为三个阶段,在获取原始图像后,首先是图像预处理阶段、第二是特征抽取阶段、第三是识别分析阶段。图像预处理阶段尤为重要,如果这阶段处理不好,后面的工作根本无法展开。...
  • 本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、不同算子的图像锐化知识...
  • 灰度图像增强和图像去噪

    万次阅读 2017-11-22 10:05:02
    数字图像处理 目录 P1 图像灰度变换增强... 2 一、  前言... 2 二、  灰度变换增强的方法及其实现... 2 1.  线性灰度变换... 2 2.  分段线性灰度变换... 4 3.  对数函数灰度变换... 6 4.  反对数函数灰度变换....
  • OpenCV—Python Retinex图像增强算法

    千次阅读 多人点赞 2019-07-02 15:10:55
    Retinex图像增强算法一、Retinex理论二、Retinex理论的理解三、Retinex理论应用 一、Retinex理论 Retinex理论始于Land和McCann于20世纪60年代作出的一系列贡献,其基本思想是人感知到某点的颜色和亮度并不仅仅取决于...
  • 图像增强—图像锐化

    万次阅读 多人点赞 2020-04-02 11:49:48
    图像锐化与图像平滑是相反的操作,锐化是通过增强高频分量来减少图像中的模糊,增强图像细节边缘和轮廓,增强灰度反差,便于后期对目标的识别和处理。锐化处理在增强图像边缘的同时也增加了图像的噪声。方法通常有...
  • 图像增强的几个方法以及Matlab代码

    万次阅读 2018-09-24 23:39:55
    假设图像为III 则其中每一个像素点的灰度值为I(x,y)I(x,y)I(x,y) 我们利用简单的线性变换可以得到: I(x,y)∗=k∗I(x,y)+bI(x,y)^*=k*I(x,y)+bI(x,y)∗=k∗I(x,y)+b 取k=1,b=16k=1,b=16k=1,b=16可以得到 这里给出...
  • 图像的灰度增强、去噪、图像增强

    千次阅读 2019-06-24 21:47:07
    futurehello博客 ... 整理笔记 一、前言 图像的灰度变换则不同,其对像素的...灰度变换也被称为图像的点运算(只针对图像的某一像素点)是所有图像处理技术中最简单的技术,其变换形式如下:      ...
  • 遥感图像增强方法应用

    万次阅读 2007-11-28 22:21:00
    黄永璘 (广西气象减灾研究所 广西南宁 530022) 1、引 言 人类从眼睛获取信息占人体器官获取信息的90%以上,虽然人眼能看到很多东西,但其实我们看到的只是波长为0.38~0
1 2 3 4 5 ... 20
收藏数 116,170
精华内容 46,468
关键字:

图像增强