数字图像处理MATLAB第二版 学习笔记 直方图处理与函数绘图

数字图像处理MATLAB第二版 学习笔记
2.3 直方图处理与函数绘图
以从图像灰度直方图中提取的信息为基础的灰度变换函数,在诸如增强、压缩、分割、描述等方面的图像处理中起着重要作用。
一幅数字图像在[0,G]范围内共有L个灰度级,其直方图定义为下列离散函数:
h ( r k ) = n k
式中,rk是区间[0,G]内的第k级灰度,nk为图像中出现rk这种灰度级的像素数。对于uint8类图像,G的值为255;对于uint16类图像,G的值为65535;对于浮点图像,G的值为1.0.注意,对于uint8类和uint16类图像,G=L-1。
h ( r k ) 的所有元素除以图像中的总像素数n,就可以简单地得到归一化直方图:
p ( r k ) = h ( r k ) n = n k n
式中,对于整数函数,k=0,1,2,~~~~L-1.从基础概率论的角度,可以认为 p ( r k ) 是灰度级rk出现的概率的估计。
在处理图像直方图的工具箱中,核心函数是imhist,其基本语法如下:
h=imhist(f,b)
其中,f为输入图像,h为其直方图。b用来形容直方图的“容器”的数目(若b未包含在此参量中,默认其值为256)。
使用表达式,可以得到归一化直方图:
p=imhist(f,b)/numel(f)
函数numel(f)给出数组f中的元素数
例2.4 计算并绘制图像直方图
imhist(f);
图2.7a
直方图还可以用条形图来绘制,为此,可使用函数
bar(horz,z,width)
其中z是一个包含被绘制的点的行向量;horz是一个与z同维数的向量,它包含了水平刻度的增量;width是一个介于0和1之间的数。horz的值给出了水平增量,z的值是相应的垂直值。若horz被省略,水平轴会从0至length(z)等分为若干单位。当width的值为1时,竖条比较明显;当width值为0时,竖条是垂直线。width的默认值为0.8,绘制条形图时,通常会通过将水平轴等分为几段来降低其分辨率。

如下命令将产生把水平轴分为10级一组的条形图:
h=imhist(f,25);
horz=linspace(0,255,25);
bar(horz,h)
axis([0 255 0 60000])
set(gca,’xtick’,0:50:255)
set(gca,’ytick’,0:20000:60000)
图2.7b bar

杆状图与条形图相似,语法为:
stem(horz,z,’LineSpec’,’fill’)
其中,z是一个包含了将被绘制的点的行向量,horz是一个与z同维数的向量,它包含了水平刻度的增量,若horz被省略,水平轴会从0至length(z)等分为若干单位。
图2.7c所示杆状图由下列语句得到:
h=imhist(f,25);
horz=linspace(0,255,25);
stem(horz,h,’fill’)
axis([0 255 0 60000])
set(gca,’xtick’,[0:50:255])
set(gca,’ytick’,[0:20000:60000])
图2.7c stem

函数plot,将一组点用直线连接起来,其语法为:
plot(horz,z,’LineSpec’)
如同函数stem那样,plot中的属性也指定为一个三值组。plot的默认值是不带标记点的蓝色实线。
图2.7d所示图形由以下语句得到:
hc=imhist(f);
plot(hc)%Use the default values.
axis([0 255 0 15000])
set(gca,’xtick’,[0:50:255])
set(gca,’ytick’,[0:2000:15000])
图2.7d plot

2.3.2直方图均衡
直方图均衡由工具箱中的函数histeq实现,其语法为:
g=histeq(f,nlev)
其中,f为输入图像,nlev是为输出图像设定的灰度级数。若nlev与L(输入图像中可能的灰度级总数)相等,则histeq直接执行变换函数。若nlev小于L,则histeq试图分配灰度级,以便得到近似平坦的直方图。

例2.5 直方图均衡
图2.8a是花粉的电子显微图像,已经放大了700倍,就所需的图像增强而言,这幅图最突出的特点就是较暗,且其动态范围较低。这些特点在图2.8b所示的直方图中很明显。其中图像较暗的性质导致直方图偏向于灰度级的暗端,从直方图相对于整个灰度范围非常狭窄的事实看出,其 较低的动态范围是很明显的。令f表示输入图像,下列各步骤产生图2.8a到图2.8d所示结果。
imshow(f);%Fig.2.8(a).
figure,imhist(f)%Fig.2.8(b).
ylim(‘auto’)
g=histeq(f,256);
figure,imshow(g)%Fig.2.8(c).
figure,imhist(g)%Fig.2.8(d).
ylim(‘auto’)
图2.8a 输入图像
图2.8b 输入图像的直方图
图2.8c 直方图均衡后的图像
图2.8d 直方图均衡后的图像的直方图

如前所述,在直方图均衡中使用的变换函数是归一化直方图的累加求和。可以利用函数cumsum实现变换功能,如下:
hnorm=imhist(f)./numel(f);
cdf=cumsum(hnorm);
由cdf绘制的图形如图2.9所示,可由如下命令得到:
x=linspace(0,1,256);

plot(x,cdf)
axis([0 1 0 1]);
set(gca,’xtick’,0:.2:1)
set(gca,’ytick’,0:.2:1)
xlabel(‘Input intensity values’,’fontsize’,9)
ylabel(‘Output intensity values’,’fontsize’,9)
图2.9
图2.9 用于将图2.7a所示输入图像映射到图2.7c所示输出图像的变换函数
从图2.8所示的直方图可看出,图2.9中的变换函数把输入灰度级低端中较窄的灰度级映射到输出图像的整个灰度范围。比较图2.8中的输入图像和输出图像,可见图像对比度的改进是很明显的。

2.3.3直方图匹配(规定化)
能够规定处理后图像的直方图形状在某些应用中是非常有用的。生成具有特定直方图的图像的方法,称为直方图匹配或直方图规定化。
实现直方图匹配的工具箱函数histeq的语法如下:
g=histeq(f,hspec)
其中,f为输入图像,hspec为规定的直方图(一个规定值的行向量),g为输出图像,输出图像的直方图近似于指定的直方图hspec。histeq的特性是当length(hspec)比图像f中的灰度级数小很多时,图像g的直方图通常会较好地匹配hspec.

例2.6 直方图匹配
图2.10a显示了火星天体福布司的图像f,图2.10b显示使用了imhist(f)得到的直方图。这幅图片受大片较暗区域控制,造成直方图中大部分像素都集中在灰度级的暗端。图2.10c使用了直方图均衡,使得较暗区域中的细节更加明显,命令:
f1=histeq(f,256);
结果表明,使用直方图均衡方法,在这种情况下,图像产生了“褪色”现象。图2.10d为均衡后图像的直方图。我们看到,灰度级已经移到了较高端一侧,因而给出了一幅低对比度且有褪色现象的图像。灰度级的移动是由于在原始直方图中灰度级在0及其附近区域过于集中。由直方图得到的累积变换函数非常陡,因此把在低端过于集中的像素点映射到了灰度级的高端。
图2.10a
图2.10b
图2.10c
图2.10d

2.3.4 函数adapthisteq
这个工具箱函数执行所谓的对比度受限的自适应直方图均衡。这种方法与前面讨论的对整个图像进行操不同,其用直方图匹配方法来逐个处理图像中的较小区域(称为小片)。然后,使用双线性内插方法将相邻的小片组合起来,从而消除人工引入的边界。特别是在均匀灰度区域,可以限制对比度来避免放大噪声。adapthisteq的语法是:
g=adapthisteq(f,param1,val1,param2,val2…

例2.7 函数adapthisteq的使用
图2.12a与图2.10a相同,图2.12b是使用函数adapthisteq的全部默认设置得到的结果:
g1=adapthisteq(f);
虽然该结果在细节上稍有改善,但图像的重要部分仍然较暗。图2.12c显示了将小尺寸增加到[25 25]后的结果:
g2=adapthisteq(f,’NumTiles’,[25 25]);
清晰度稍有增加,但未见到新的细节。使用命令:
g3=adapthisteq(f,’NumTiles’,[25 25],’ClipLimit’,0.05);
产生了图2.12d所示结果。与前面两个结果相比,这幅图像的细节得到了明显增强。比较图d和图b,可知:
局部增强方法好于全局增强方法,但付出的代价通常是额外的函数复杂性。
图2.12a
这里写图片描述
图2.12b使用带默认值的函数adapthisteq后的结果;
图2.12c
将参数NumTiles置为[25 25]来使用这个函数后的结果;
图2.12d
使用这一小片数量且ClipLimit=0.05所得结果。

猜你喜欢

转载自blog.csdn.net/daodanxiansheng/article/details/82226556