数字图像处理(Matlab版)-2 直方图处理
对数及对比度拉伸变换、直方图处理与函数绘图。
对数及对比度拉伸变换
对数及对比度拉伸变换的作用主要是可以增强图片里较暗部分的细节,公式如下所示
底数为v+1,底越大,暗处部分的细节就越明显,实际计算的时候,需要用换底公式。其为了使其灰度部分较为明显,一般都会使用灰度变换处理一下。
>> f = imread('Fig0305(a)(spectrum).tif');
>> f = mat2gray(f,[0 255]);
>> v = 10;
>> g_1 = log2(1 + v*f)/log2(v+1);
>> v = 30;
>> g_2 = log2(1 + v*f)/log2(v+1);
>> v = 200;
>> g_3 = log2(1 + v*f)/log2(v+1);
>> figure();
>> subplot(1,2,1);
>> imshow(f,[0 1]);
>> xlabel('a).Original Image');
>> subplot(1,2,2);
>> imshow(g_1,[0 1]);
>> xlabel('b).Log Transformations v=10');
>> figure();
>> subplot(1,2,1);
>> imshow(g_2,[0 1]);
>> xlabel('c).Log Transformations v=100');
>> subplot(1,2,2);
>> imshow(g_3,[0 1]);
>> xlabel('d).Log Transformations v=200');
直方图处理与函数绘图
imhist
绘制图像直方图的核心函数是h = imhist(f,b)
其中f为输入图像,h为其直方图,b是用来形成直方图的“容器”的数目(默认256),如果正在处理一副uint8类的图像,另b=2,则灰度范围被分为两部分:0-127,128-255.h1和h2,h1等于图像中其值在区间[0 127]内的像素数,h2等于图像中其值在区间[128 256]内的像素数。
使用这个表达式可以得到归一化直方图:p = imhist(f,b)/numel(f) ps:numel(f)给出数组f中的元素数,即像素数。
>> f = imread('pig.jpg');
>> subplot(121),imshow(f);title('pig');
>> subplot(122),imhist(f);title('pig直方图');
上面的条形图太挤了,下面这个比较直观。
下面的命令可以将水平轴分为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);
其中linspace的作用
>> t = linspace(0,100,5)
t =
0 25 50 75 100
stem画杆状图
下面的命令生成一副杆状图
>> 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);
plot画线性图
函数plot,将一组点用直线连起来。语法为:plot(horz,z,‘LineSpec’)
>> hc = imhist(f);
>> plot(hc)
>> axis([0 255 0 1500])
>> set(gca,'xtick',[0:50:255]);
>> set(gca,'ytick',[0:200:1500]);
直方图的属性
可以选择直方图的显示方式,比如颜色,线性和标记点
颜色符号 | 说明 |
---|---|
b | blue 蓝色 |
g | green 绿色 |
r | red 红色 |
c | cayn 青色 |
m | magenta 品红 |
y | yellow 黄色 |
k | black 黑色 |
w | white 白色 |
线型符号 | 说明 |
---|---|
- | 实线 |
: | 虚线 |
-. | 点划线 |
– | 双划线 |
数据点符号 | 说明 |
---|---|
. | 实心点 |
o | 空心圆圈 |
x | 叉子 |
+ | 十字符号 |
* | 米字符号 |
s | square方块 |
d | diamond菱形 |
v | 下三角 |
^ | 上三角 |
< | 左三角 |
> | 右三角 |
p | pentagram 五角星 |
h | hexagram 六角星 |
>> hc = imhist(f);
>> plot(hc,'c--o');
直方图均衡
将直方图中灰度较集中的地区间扩散到全部灰度范围,使其较均匀分布。
效果是可以增强图像对比度。
>> f = imread('Fig0308(a)(pollen).tif');
>> subplot(121),imshow(f),title('pollen');
>> subplot(122),imhist(f),title('pollen_hist');
>> g = histeq(f,256);
>> figure;
>> subplot(121),imshow(g),title('pollen_eq');
>> subplot(122),imhist(g),title('pollen_histeq');
图一是花粉原图像和其直方图,可以看出灰度在低范围内比较集中,图二是经过histeq均衡后的结果,明显图像对比度增强了,灰度级比较平均。
直方图匹配
当直方图均衡不能得到期望的结果,就需要用直方图匹配来得到我们期望的结果。
如下的两张图片,第一张是火星天体福布司和其直方图,第二张使其直方图均衡过的图和其直方图,通过图片我们可以看出效果并不好,灰度由低范围映射到了较高的范围,导致图片褪色。
实现直方图匹配的工具箱函数: g = histeq(f,hspec)
f为输入图像,hspec为规定的直方图(一个规定值的行向量),g为输出图像,输出图像的直方图近似于指定的直方图hspec。
>> f1 = imread('sea.jpg');
>> f2 = imread('pig.jpg');
>> subplot(121),imshow(f1),title('sea');
>> subplot(122),imhist(f1),title('sea_hist');
>> figure
>> subplot(121),imshow(f2),title('pig');
>> subplot(122),imhist(f2),title('pig_hist');
输入为f1:sea f2:pig的图片,分别显示其原图和直方图。
然后将pig作为输入图片,sea的直方图作为输入直方图,显示pig原图,均衡后的pig和均衡后的直方图。
>> g = histeq(f2,imhist(f1));
>> figure
>> subplot(131),imshow(f2),title('pig');
>> subplot(132),imshow(g),title('pig_hist_sea');
>> subplot(133),imhist(g),title('pig_hist');
通过和sea对比,可以看出均衡后的pig和sea的风格相似,而且直方图也相似。
将sea作为输入图片,pig的直方图作为输入直方图,显示sea原图,均衡后的sea和均衡后的直方图。
>> g = histeq(f1,imhist(f2));
>> figure
>> subplot(131),imshow(f1),title('sea');
>> subplot(132),imshow(g),title('sea_hist_pig');
>> subplot(133),imhist(g),title('sea_hist');
看出sea对比度增强了,这是因为pig的原图片对比度较高,均衡后的图片直方图的灰度级也更均匀。
直方图自适应匹配
函数adapthisted可以自适应直方图匹配,它使用直方图匹配来逐个图像中的较小区域(称为小片),然后用双线性内插法将相邻的小片组合起来从而消除人工引入的边界
g = adapthisteq(f,param1,val1,param2,val2,param3,val3…)
该函数所用参数:
- NumTiles: 一个有正整数组成的两元素向量[r, c],由向量的行和列指定小片数。r和c都必须至少是2,小片总数等于r*c。默认值是[ 8 8]
- ClipLimit: 范围是[0 1]内的标量,用于指定对比度增强的限制。较高的值产生较强的对比度。默认值是0.01
- NBins: 针对建立对比度增强变黄所用的直方图容器数目指定的正整数标量。较高的值会在较慢的处理速度下导致较大的动态范围。默认值是256
- Range: 规定输出图像数据范围的字符串
------‘original’——范围被限制到原始图像的范围,[min(f(????) max(f(????)]
------‘full’——使用输出图像类的整个范围。例如,对于uint8类的数据,范围是[0 255]。这是默认值。- Distribution: 为图像小片指定期望直方图形状的字符串
------‘uniform’——平坦的直方图(默认)
------‘rayleigh’——钟形直方图
------‘exponential’——曲线直方图- Alpha: 适用于瑞利和指数分布的非负标量,默认值为0.4
>> f = imread('Fig0310(a)(Moon Phobos).tif');
>> g1 = adapthisteq(f);
>> g2 = adapthisteq(f, 'NumTiles', [25 25]);
>> g3 = adapthisteq(f, 'NumTiles', [25 25], 'ClipLimit', 0.05);
>> subplot(221),imshow(f),title('a');
>> subplot(222),imshow(g1),title('b');
>> subplot(223),imshow(g2),title('c');
>> subplot(224),imshow(g3),title('d');
结果显示在下图,g1位默认值,图片细节得到了细微的增加,g2将图片尺寸增加到[25 25],清晰度细微增加,新的细节未出现,g3使参数ClipLimit = 0.05,细节显著增强。