您的位置 首页 观点

根据直方图的图画增强算法(HE、CLAHE、Retinex)之(一)

直方图是图像色彩统计特征的抽象表述。基于直方图可以实现很多有趣的算法。例如,图像增强中利用直方图来调整图像的对比度、有人利用直方图来进行大规模无损数据隐藏、还有人利用梯度直方图HOG来构建图像特征

  直方图是图画颜色核算特征的笼统表述。根据直方图能够完成许多风趣的算法。例如,图画增强中运用直方图来调整图画的比照度、有人运用直方图来进行大规模无损数据躲藏、还有人运用梯度直方图HOG来构建图画特征从而完成目标检测。本节咱们就来评论重要的直方图均衡化算法,说它重要是因为以此为基础后续又衍生出了许多有用而风趣的算法。

  Histogram equalization

  假如一幅图画的像素灰度值在一个过于有限的规模内集合,那么图画的程序作用即会很糟糕,直接观感便是比照度很弱。下图来自维基百科,榜首幅图的直方图散布十分不均衡。假如把直方图均匀地延展到整个散布域内,则图画的作用显得好了许多。

    

 

  Matlab中供给了现成的函数“histeq()”来完成图画的直方图均衡。但为了演示阐明算法的原理,下面我将在Matlab中自行编码完成图画的直方图均衡。经过代码来演示这个算法明显愈加直观,愈加易懂。当然,其实我还不得不感叹,假如仅仅是作为图画算法研讨之用,Matlab的确十分好用。

  首要读入图画,并将其转化为灰度图。然后提取图画的长和宽。

  image = imread('Unequalized_Hawkes_Bay_NZ.jpg');

  Img = rgb2gray(image);

  [height,width]=size(image);

  然后制作一下原始图画的直方图。

  [plain] view plain copy

  [counts1, x] = imhist(Img,256);

  counts2 = counts1/height/width;

  stem(x, counts2);

    

 

  核算每个灰度的像素值累计数目。

  NumPixel = zeros(1,256);%核算各灰度数目,共256个灰度级

  for i = 1:height

  for j = 1: width

  %对应灰度值像素点数量添加一

  %因为NumPixel的下标是从1开端,可是图画像素的取值规模是0~255,所以用NumPixel(Img(i,j) + 1)

  NumPixel(Img(i,j) + 1) = NumPixel(Img(i,j) + 1) + 1;

  end

  end

  然后将频数值算为频率

  ProbPixel = zeros(1,256);

  for i = 1:256

  ProbPixel(i) = NumPixel(i) / (height * width * 1.0);

  end

  再用函数cumsum来核算cdf,并将频率(取值规模是0.0~1.0)映射到0~255的无符号整数。

  CumuPixel = cumsum(ProbPixel);

  CumuPixel = uint8(255 .* CumuPixel + 0.5);

  直方图均衡。赋值句子右端,Img(i,j)被用来作为CumuPixel的索引。比方Img(i,j) = 120,则从CumuPixel中取出第120个值作为Img(i,j) 的新像素值。

  for i = 1:height

  for j = 1: width

  Img(i,j) = CumuPixel(Img(i,j));

  end

  end

  最终显现新图画的直方图。

  imshow(Img);

  [counts1, x] = imhist(Img,256);

  counts2 = counts1/height/width;

  stem(x, counts2);

    

 

  当然,上述评论的是灰度图画的直方图均衡。关于五颜六色图画而言,你或许会想到别离对R、G、B三个重量来做处理,这也的确是一种办法。但有些时分,这样做很有或许导致成果图画颜色失真。因而有人主张将RGB空间转换为HSV之后,对V重量进行直方图均衡处理以保存图画颜色不失真。下面咱们来做一些比照试验。待处理图画是规范的图画处理测试用图couple图,如下所示。

    

 

  首要,咱们别离处理R、G、B三个重量,为了简洁咱们直接运用matlab中的函数histeq()。

  a = imread('couple.tiff');

  R = a(:,:,1);

  G = a(:,:,2);

  B = a(:,:,3);

  R = histeq(R, 256);

  G = histeq(G, 256);

  B = histeq(B, 256);

  a(:,:,1) = R;

  a(:,:,2) = G;

  a(:,:,3) = B;

  imshow(a)

  下面的代码运用了别的一种办法,行将颜色空间转换到HSV后,对V通道进行处理。因为代码根本与前面介绍的共同,这儿咱们不再做过多解说了。

  Img = imread('couple.tiff');

  hsvImg = rgb2hsv(Img);

  V=hsvImg(:,:,3);

  [height,width]=size(V);

  V = uint8(V*255);

  NumPixel = zeros(1,256);

  for i = 1:height

  for j = 1: width

  NumPixel(V(i,j) + 1) = NumPixel(V(i,j) + 1) + 1;

  end

  end

  ProbPixel = zeros(1,256);

  for i = 1:256

  ProbPixel(i) = NumPixel(i) / (height * width * 1.0);

  end

  CumuPixel = cumsum(ProbPixel);

  CumuPixel = uint8(255 .* CumuPixel + 0.5);

  for i = 1:height

  for j = 1: width

  V(i,j) = CumuPixel(V(i,j));

  end

  end

  V = im2double(V);

  hsvImg(:,:,3) = V;

  outputImg = hsv2rgb(hsvImg);

  imshow(outputImg);

  最终,来比照一下不同办法对五颜六色图画的处理作用。下面的左图是选用R、G、B三重量别离处理得到的成果。右图是对HSV空间下V通道处理之成果。明显,右图的作用更抱负,而左图则呈现了必定的颜色失真。事实上,对五颜六色图画进行直方图均衡是图画处理研讨范畴一个看似简略,可是一向有人在研讨的论题。咱们所说的对HSV空间中V重量进行处理的办法也是比较根本的战略。许多相关的研讨文章都提出了更进一步的、适应性更强的五颜六色图画直方图均衡化算法。有爱好的读者能够参看相关文献以了解更多。

    

 

  别离处理R、G、B三个重量之成果 转换到HSV空间后处理V重量

  这是本系列文章的榜首篇,鄙人一篇文章中咱们即将评论CLAHE算法,也便是约束比照度的自适应直方图均衡算法。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/207251.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部