数字图像处理(Matlab版)-2 直方图处理
对数及对比度拉伸变换、直方图处理与函数绘图。

对数及对比度拉伸变换
对数及对比度拉伸变换的主要作用在于突出图片中暗部区域的细节信息。数学表达式如式(1)所示:
c \cdot \log_{v+1}(1 + v \cdot r) \quad \text{其中} \ r \in [0,1]
其中底值为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');
代码解读
第一个图表展示了原始花粉图像及其灰度分布情况;从观察结果来看,在低灰度范围内的像素分布较为密集;第二个图表是经过直方图均衡处理后的结果显示;对比度明显有所提升,并且各灰度等级的分布较为均匀


直方图匹配
当直方图均衡无法达到预期效果时,则采用直方图匹配以获得预期结果。
以下展示两张图片:第一张是火星天体福布司及其原始分布图;第二张是经过直方图均衡处理后的图像及其分布图。
从图像可以看出效果欠佳:灰度值从低范围跃升至高范围。
这种处理方式导致图像色调偏暗。


用于直方图匹配的函数库中的工具是:g = \text{histeq}(f, hspec)
其中输入参数f代表输入图像,在本语句中可简称为输入图像;参数hspec则被定义为目标直方图(其形式是一个单行向量),它包含着希望得到的结果;输出变量g代表处理后的结果图像。
该函数的作用是通过对输入图像f进行处理得到结果图像g,使得其频次分布与hspc非常接近。
>> 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 部分所对应的图像用于构建初始分布表(input histogram)。随后展示原始 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技术处理后使得图像对比度得到显著提升;其原因在于原始图片具有较高的对比度分布特征,在经过均衡处理后其对应的直方图呈现出更为均匀的状态

直方图自适应匹配
函数adapthisted 采用了自适应直方图配准技术,在图像处理中将每一幅图像划分为若干小块(称为小块区域),通过双线性插值方法将相邻的小块区域组合起来以减少人工引入的边界模糊效果;其调用格式为:g = \text{adapthisteq}(f,\text{param1},\text{val1},\text{param2},\text{val2},\text{param3},\text{val3}\dots)
该函数所用参数如下:
- NumTiles:一个二维向量[r, c]表示图像分割的小块数量。其中r和c均为至少2的正整数,默认值为[8, 8]。
- ClipLimit:定义在[0, 1]范围内的单一数值参数,默认设置为0.01。
- NBins:指定直方图划分的数量,默认设置为256。
- Range:用于限定输出图像数据范围的字符型变量:
- 'original':数据范围限定在输入图像的实际数据范围内。
- '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位默认设置;图像细节得到明显提升;通过将图片尺寸设置为[25 25];图像清晰度得到改善;没有引入新的可见细节

