直方图是图画颜色核算特征的笼统表述。根据直方图能够完成许多风趣的算法。例如,图画增强中运用直方图来调整图画的比照度、有人运用直方图来进行大规模无损数据躲藏、还有人运用梯度直方图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算法,也便是约束比照度的自适应直方图均衡算法。