水下图像增强相关算法的一个简练小结。图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)

  最近径直没有找到感兴趣的研究课题,下了几个流行的去雾的舆论,随便看了生,觉得还是为写论文而召开的论文,没有什么创新性,也不怕从来不想法去贯彻他们。偶尔看到了片关于水下图像增强方面的章,闲来无聊试着去看效果,不过也当甚受丁大失所望,似乎并从未特意实用的算法。

如出一辙、图像增强算法原理

        
图像增强算法常见于对图像的亮度、对比度、饱和度、色调等进行调节,增加其清晰度,减少噪点等。图像增强往往由此差不多个算法的结合,完成上述作用,比如图像去燥等同于低通滤波器,增加清晰度则为高通滤波器,当然增强同称图像是也最终收获图像发因此信息服务为主。一般的算法流程可也:图像去燥、增加清晰度(对比度)、灰度化或者取得图像边缘特征或者对图像进行卷积、二值化等,上述四单步骤往往可通过不同之步调进行落实,后续将对此点内容展开专题实验,列举其动场景和拍卖特点。

       
本文章是一致首综合性文章,算是一篇抛砖引玉的稿子,有均衡化、提高对比度、降低对比度的算法。

     
就自我看得几乎篇稿子而言,这仿佛算法都不是由规律及、或者说某某一个数学模型、抑或是某种先验知识出发,而提出的算法,都是一致种没有啊特强的争鸣支撑,只是透过一些其实的考而收获的有经过而已。这些经过对于论文本身吃提供的测试图像都有较为理想的拍卖效果,而要选择相同合乎其他属性的水下图像,其结果往往难以令人满意。因此,也就算从不接近于去雾算法界暗通道先验那样不可逾越的金子文章了。

1.1 基于直方图均衡化的图像增强

      
图像对比度增强的主意可分成两栽:直接指向比度增强方法,间接对比度增强方法。直方图拉伸和直方图均衡化是广大的间接对比度增强方法。直方图拉伸是运用对比度拉伸对直方图进行调整,扩大前景及背景灰度的歧异,这种办法可经过线性和非线性的艺术来贯彻,其中ps中即是使这措施提高对比度;直方图均衡化则是动累积函数对灰度值进行调,实现对比度的增进。

       
直方图均衡化处理原理:将本来图像的灰度图从比较集中的之一灰度区间都匀分布于所有灰度空间受到,实现对图像的非线性拉伸,重新分配图像像素值。

算法应用场景:

        
1、算法的本质是更分布图像的比如素值,增加了过多局部的指向比度,整体的针对比度没有进展最怪改,所以下图像为图像发因此数据的对比度相近是,例如:X光图像,可以以曝光过度还是曝光不足照片进行再次好的来得,或者是背景以及前景太亮或太暗的图像非常管用。

       
2、算法当然为来欠缺,具体表现为:变换后底图像灰度级减少,某些细节减少;某些图像来高峰值,则处理后针对比度不自然的超负荷增强。

算法实现特点:

      
1、均衡化过程:直方图均衡化保证在图像像素映射过程中原来的尺寸关系保无更换,即于亮的区域还比较亮,较暗的仍比较暗,只是针对比度增加,不能够明暗颠倒;保证像素映射函数的值域在0和255之内。累积分布函数是独自增长函数,并且值域是0到1。

         2、累积分布函数实现过程:

        
比较概率分布函数和积聚分布函数,前者的次维图像是参差不齐的,后者是枯燥递增的。直方图均衡化过程中,映射方法是

图片 1

          
其中,n是图像中像素的总数,图片 2是当前灰度级的像素个数,L是图像遭到恐的灰度级总数。

来探望通过上述公式怎样贯彻的拉伸。假设有如下图像:

图片 3

得图像的统计信息而下图所展示,并冲统计信息完成灰度值映射:

图片 4

照耀后底图像如下所示:

图片 5

算法伪代码:

        1、计算原始灰度图像的像素概率分布

         2、根据像素概率分布获取图像累积分布函数

        3、根据映射函数获取变换后的图像

算法matlab代码:

%直方图均衡化  
I = imread('rice.png');  
[height,width] = size(I);  
figure  
subplot(221)  
imshow(I)%显示原始图像  
subplot(222)  
imhist(I)%显示原始图像直方图  

%进行像素灰度统计;  
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级  
for i = 1:height  
    for j = 1: width  
        NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一  
    end  
end  
%计算灰度分布密度  
ProbPixel = zeros(1,256);  
for i = 1:256  
    ProbPixel(i) = NumPixel(i) / (height * width * 1.0);  
end  
%计算累计直方图分布  
CumuPixel = zeros(1,256);  
for i = 1:256  
    if i == 1  
        CumuPixel(i) = ProbPixel(i);  
    else  
        CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);  
    end  
end  
%累计分布取整  
CumuPixel = uint8(255 .* CumuPixel + 0.5);  
%对灰度值进行映射(均衡化)  
for i = 1:height  
    for j = 1: width  
        I(i,j) = CumuPixel(I(i,j));  
    end  
end  

subplot(223)  
imshow(I)%显示原始图像  
subplot(224)  
imhist(I)%显示原始图像直方图

       我看了三篇稿子,第一首是Underwater
Image Enhancement Using an Integrated Colour
Model,07年之文章,算法的细路很粗略,借用文章被的一致副流程图来说明下:

1.2 基于拉普拉斯算子的图像增强

       
利用拉普拉斯算子进行图像增强本质是下图像的次差微分对图像进行蜕化,在图像领域中微分是锐化,积分是张冠李戴,利用二软微分对图像进行蜕化即祭邻域像素提高对比度。在opencv中呢发生拉普拉斯函数,但当下生成了灰度图像,更多之求取边缘,具体源码还尚未研究,其中规律可以参考我前面一样篇稿子,针对拉普拉斯发只详细的介绍。

此次实验用之卷积核为:

图片 6

         
 图片 7

1.3 基于对象Log变换的图像增强

       
对数变换可以以图像的低灰度值部分扩大,显示有小灰度部分重新多之底细,将其高灰度值部分压缩,减少高灰度值部分的底细,从而达成强调图像低灰度部分的目的。变换方式:

图片 8

        对数变换对图像低灰度部分细节增强的职能了好于对数图上直观了解:

图片 9

        
x轴的0.4约对应了y轴的0.8,即原图上0~0.4的低灰度部分通过对数运算后扩大到0~0.8的部分,而整个0.4~1的高灰度部分为投影至只有0.8~1的区间,这样就是达成了扩大以及增强小灰度部分,压缩高灰度部分的价值的法力。

打高达图还可见到,对于不同之底数,底数越怪,对低灰度部分的扩充就更为强,对大灰度部分的减为不怕越是强。

 

1.4  基于伽马变换的图像增强

       
伽马变换主要用于图像的校正,将灰度过高还是灰度过低之图展开修正,增强针对性比度。变换公式就是针对原来图像及诸一个如素值做乘积运算:

图片 10

      
伽马变换对图像的修正作用其实就是是经过提高小灰度或高灰度的细节实现的,从伽马曲线可以直观了解:

图片 11

       
γ值以1吗分界,值更小,对图像低灰度部分的壮大作用就是更强,值更充分,对图像高灰度部分的扩展作用就是愈强,通过不同的γ值,就足以高达增进小灰度或高灰度部分细节的意向。

       
伽马变换对于图像对比度偏小,并且完全亮度值偏大(对于被相机过曝)情况下之图像增强效果显著。

   
 很简短的步调,首先是进展针对性比度拉升,可以看做是近乎于PS中之自发性对比度,接着用拍卖后的图像转换到HSI颜色空间,在对S和I分量进行拉升,之后再以HSI空间的数目易到RGB空间得到终极之图像。在百度上查找谁下图像增强,能找到一个息息相关的专利,见http://www.google.com/patents/CN102930512A?cl=zh,这个专利的内容实在为绝非啥新意,一样的哪怕是当HSI空间将S和I分量用其他的方法进行了拉升和拍卖,还是发明专利,呵呵,大家还亮国内专利是怎么回事。

第二、测试代码

根据上述讲解,本文利用python进行编程实验,代码如下:

def preprocess(filename, i):
    image = cv2.imread(filename)
    image_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)

#    直方图均衡增强
    image_equal = cv2.equalizeHist(image_gray)
    r,g,b = cv2.split(image)
    r1 = cv2.equalizeHist(r)
    g1 = cv2.equalizeHist(g)
    b1 = cv2.equalizeHist(b)
    image_equal_clo = cv2.merge([r1, g1, b1])

#   拉普拉斯算法增强
    kernel = np.array([ [0, -1, 0],  
                    [-1,  5, -1],  
                    [0, -1, 0] ]) 
    image_lap = cv2.filter2D(image,cv2.CV_8UC3 , kernel)

#    对象算法增强
    image_log = np.uint8(np.log(np.array(image) +1))    
    cv2.normalize(image_log, image_log,0,255,cv2.NORM_MINMAX)
#    转换成8bit图像显示
    cv2.convertScaleAbs(image_log,image_log)

#    伽马变换
    fgamma = 2
    image_gamma = np.uint8(np.power((np.array(image)/255.0),fgamma)*255.0)
    cv2.normalize(image_gamma, image_gamma, 0, 255, cv2.NORM_MINMAX)
    cv2.convertScaleAbs(image_gamma, image_gamma)

     
这篇论文对算法有的叙述或过于简单,虽然对比度拉升给了只公式,但连没有强烈的说明S和I分量的求实处理流程,他吃的有限首参考文献对应的网站也无力回天打开了,因此无法对原本的算法进行认证,我因此GIMP的对准比度拉升

老三、实验结果及分析

图片 12图片 13                              
(src)                                                               
(log)

图片 14图片 15

                           
(laplus)                                                                
(gamma)

图片 16                                                                         
(equal)

图片 17图片 18

                                 
(src)                                                                                           
(log)

图片 19图片 20

                                
(laplus)                                                                                 
(gamma)

图片 21

                                                                                  
(equal)

试行结果分析为:

       
1、log函数变化对图像增强来讲,更多是本着图像的指向比度有所削弱,毕竟函数表现形式吗像素值小之变大点,像素值大之变小点,所以针对比度减多少,亮度增加,正使图像所出示。所以时总的来说log函数还是慎用,如果提高函数可以使分支函数啊。

      
2、gamma函数图像增强,这个函数原理可以见见,当r大于1时,可以视作指数函数,小于则为log函数。在试验中我们经常因此r>1,实现图像对比度增强。从图像遭到好观看,黑色还黑,白色更白。

      
3、laplus函数图像增强,本质是微分,所以呢图像锐化,在图像锐化是判凸出显图像的细节,进而直观上提高图像对比度。

     
4、equal函数本质是重分布图像的诸如素值,直观我们发现图像颜色发生变化,但针对比度是有所提高,当然对于当下组的图像的用意,没有反映。

小结:图像增强方法不同,应用领域不同,更好的下得控制灵活多变的道。

  • HSV拉升未能上论文被的职能。 

季、参考文章

1、OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma):本文基本在这个基础及进行编程实现,原理可以参照这,同时协调对里面的概念问题展开详解。

2、直方图均衡化原理:本文详细介绍了直方图均衡化的原理,并经过opencv进行函数实现。

3、直方图均衡化详解及编程实现:文中对直方图均衡化的使用特点与缺陷进行辨析,并依据算法原理通过matlab实现了算法。

     
 第二篇和老三首都是用之图像融合之法子来拍卖的,分别是Enhancing
Underwater Images and Videos by Fusion以及Effective Single Underwater
Image Enhancement by
Fusion,后同样篇是境内合工大和中科大的作者写的,很肯定好看得出模仿之字迹

     
 其实这种通过融合之不二法门呢充分简短,就是先期找找点儿栽算法得到针对性本来图两种植不同程度的加强的结果,然后择好一个齐心协力系数的计算公式,再进行拉普拉斯金字塔融合,从而提取更好之结果。Enhancing
Underwater Images and Videos by
Fusion这首文章就是是选用了白平衡的结果(记否I1)作为融合的目标同,
用对I1进行双边滤波+CALHE之类的算法处理的结果(记否I2)作为融合的对象2。标准的拉普拉斯融合之齐心协力算法一般有:最老价值、最小值、平均值,这里虽改为某某平等种权重系数的齐心协力,最后进行拉普拉斯融合。

     
 因此,这个算法的处理结果的好坏性完全在融合的目标,即有限只前处理算法。但是同有的题材即使算法的广阔适应性,某平种前处理对有同类合适,对另外的虽非必然了。

     
 我这里通过一些尝试,也提出同样种前处理算法,这个算法的效用好以GIMP的颜料–》自动–》色调均化中看到。

     
 虽然GIMP是一个像样PS的软件,但彼此的彩均成为效应完全两样,查看GIMP的代码就能懂得就是干吗了,我此贴出GIMP的之算法的核心代码有:

static void
equalize_lut_setup (GimpLut       *lut,
                    GimpHistogram *hist,
                    gint           n_channels)
{
  gint            i, k, j;
  hist_lut_struct hlut;
  gdouble         pixels_per_value;
  gdouble         desired;
  gdouble         sum, dif;

  g_return_if_fail (lut != NULL);
  g_return_if_fail (hist != NULL);

  /* Find partition points */
  pixels_per_value = gimp_histogram_get_count (hist,
                                               GIMP_HISTOGRAM_VALUE,
                                               0, 255) / 256.0;

  for (k = 0; k < n_channels; k++)
    {
      /* First and last points in partition */
      hlut.part[k][0]   = 0;
      hlut.part[k][256] = 256;

      /* Find intermediate points */
      j   = 0;
      sum = (gimp_histogram_get_channel (hist, k, 0) +
             gimp_histogram_get_channel (hist, k, 1));

      for (i = 1; i < 256; i++)
        {
          desired = i * pixels_per_value;

          while (sum < desired && j < 256)
            {
              j++;
              sum += gimp_histogram_get_channel (hist, k, j + 1);
            }

          /* Nearest sum */
          dif = sum - gimp_histogram_get_channel (hist, k, j);

          if ((sum - desired) > (dif / 2.0))
            hlut.part[k][i] = j;
          else
            hlut.part[k][i] = j + 1;
        }
    }

  gimp_lut_setup (lut, (GimpLutFunc) equalize_lut_func, &hlut, n_channels);
}

void
gimp_lut_setup (GimpLut     *lut,
                GimpLutFunc  func,
                void        *user_data,
                gint         nchannels)
{
  guint   i, v;
  gdouble val;

  if (lut->luts)
    {
      for (i = 0; i < lut->nchannels; i++)
        g_free (lut->luts[i]);

      g_free (lut->luts);
    }

  lut->nchannels = nchannels;
  lut->luts      = g_new (guchar *, lut->nchannels);

  for (i = 0; i < lut->nchannels; i++)
    {
      lut->luts[i] = g_new (guchar, 256);

      for (v = 0; v < 256; v++)
        {
          /* to add gamma correction use func(v ^ g) ^ 1/g instead. */
          val = 255.0 * func (user_data, lut->nchannels, i, v/255.0) + 0.5;

          lut->luts[i][v] = CLAMP (val, 0, 255);
        }
    }
}

  gimp的代码看起相当晦涩的,但是其实上述算法要描述的意非常简单,就是自己盼望我调后的图像的直方图在每个色阶上之分布概率都是相同的。其实这进程就可以看成是直方图规定化的一个历程,举例如下:

     图片 22   
 图片 23

                     原  图      
                                                           
处理后底图

    图片 24   
 图片 25 
  图片 26

    图片 27   
 图片 28   
 图片 29

    图片 30   
 图片 31   
 图片 32

        原图B/G/R对应之直方图          
                   待匹配的直方图                 
 处理后底直方图

  可见处理后底直方图已经尽量向带匹配的模式贴近,但切莫可能全同。

   
 用这个过程处理了几幅论文中带的水下图像,效果如下:

 
 图片 33 
  图片 34

 
 图片 35 
  图片 36

 
 图片 37 
  图片 38

    最后一帧图于Enhancing Underwater
Images and Videos by
Fusion一软遭遇的效力是颇强的,主要是过于的异常当然,这个当融合在该作用吧。

   
融合这种处理方式确实一个值得推广的想法,因此那篇论文才会化为2012之CVPR论文之一的。

 图片 39

*********************************笔者:
laviewpbt   时间: 2014.4.6   联系QQ:  33184777
 转载请保留本行信息************************

admin

网站地图xml地图