直方图相当于一个图像中所有像素个数的统计表,x轴为图像的灰度级,从0到L-1,y轴是对应灰度级的个数。
绘制直方图
核心函数是imhist函数,语法形式h=imhist(f,b)
,f表示输入的图像,b表示统计灰度级的个数,省略时默认为256.通过p=imhist(f,b)/numel(f)
可以获得归一化的直方图,numel函数可以给出数组f中元素的个数。
例:使用imhist函数和stem函数绘制杆状直方图
clf;
clear;
f=imread('Fig0203(a).tif');
[counts,x]=imhist(f,25);%计算有25个区间的直方图
[m,n]=size(f);%计算图像大小
counts=counts/m/n;%计算归一化直方图各区间的值
stem(x,counts);绘制归一化直方图
例绘制条形图
f=imread('Fig0203(a).tif');
h=imhist(f,25);%直方图,灰度级分为25份,垂直量
horz=linspace(0,255,25);%将灰度级分为25份,水平分量
bar(horz,h)
axis([0 255 0 450000])
set(gca,'xtick',0:50:255)
set(gca,'ytick',0:50000:450000)
axis函数语法axis([horzmin horzmax vertmin vertmax])
设定水平轴与垂直轴的最小值与最大值。后两句中的gca代表获取当前轴,xtick和ytick设置显示水平轴和垂直轴标尺。
直方图均衡
就是将图像中的灰度级发布平均,每个灰度级区间的元素数量相近,就可以使原图像的细节更加清晰。
使用histeq函数实现,语法形式q=histeq(f,nlev)
f为输入图像,nlev是输出图像设定的灰度级,默认值是64.若nlev与L相等,则histeq直接执行变换函数,若nelv小于L,则histeq试图分配灰度值区间,从而得到近似平坦的直方图。
例 直方图均衡
% clf;
% clear;
% clc;
f=imread('Fig0208(a).tif');
subplot(2,2,1);
imshow(f);
subplot(2,2,2);
imhist(f);
ylim('auto');
g=histeq(f,256);
subplot(2,2,3);
imshow(g);
subplot(2,2,4);
imhist(g);
ylim('auto');
变换函数
hnorm=imhist(f)./numel(f);
cdf=cumsum(hnorm);
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','fontsize',9);
ylabel('output','fontsize',9);
直方图匹配
就是将原始图像的直方图经过处理之后,改变为与目标变换函数相近的图像。
用到了histeq函数,语法形式j=histeq(i,hgram)
,其中i为输入图像,hgram为目标直方图的图像,j为经过处理后的图像。
例 将i的图像分别匹配到i1和i2的直方图。
clf;clear;clc;
i=imread('pout.tif');
i1=imread('coins.png');
i2=imread('circuit.tif');
hgram1=imhist(i1);
hgram2=imhist(i2);
j1=histeq(i,hgram1);
j2=histeq(i,hgram2);
subplot(2,5,1);
imshow(i);
subplot(2,5,2);
imshow(i1);
subplot(2,5,3);
imshow(i2);
subplot(2,5,4);
imshow(j1);
subplot(2,5,5);
imshow(j2);
subplot(2,5,6);
imhist(i);
subplot(2,5,7);
imhist(i1);
subplot(2,5,8);
imhist(i2);
subplot(2,5,9);
imhist(j1);
subplot(2,5,10);
imhist(j2);