数字图像处理第二章——直方图处理与函数绘图

数字图像处理—灰度变换与空间滤波

(三)直方图处理与函数绘图

以从图像灰度直方图中提取的信息为基础的灰度变换函数,在诸如增强、压缩、分割、描述等方面的图像处理中起着重要作用。

3.1生成并绘制图像的直方图

在[0,G]范围内总共有L级可能灰度的一幅数字图像的直方图,定义为下列离散函数:
在这里插入图片描述
r k r_k 是[0,G]间隔内的第k级灰度, n k n_k 为图像中出现 r k r_k 这种灰度的像素数。对于uint8类,G的值为255;对于uint16类,G的值为65535;对于浮点图像类,G的值为1.0。注意,对于uint8和uint16类的图像,G=L-1。有时,利用归一化的直方图是必要的。用 h ( r k ) h(r_k) 的所有元素除以图像中的像素总数,就可以简单地得到归一化直方图:
在这里插入图片描述
其中,对整幅图像k=0, 1, 2, … , L-1。从基础概率论的角度讲,我们认可用 p ( r k ) p(r_k) 表示灰度级 r k r_k 出现的概率。

工具箱中用于处理图像直方图的核心函数是imhist,

基本语法如下:

h=imhist(f,b)       %f为输入图像,h为直方图,b是用来形成直方图的“统计堆栈”的数目(默认256)

举例描述:

如果我们处理一幅 uint8 类的图像且设 b = 2, 然后灰度范围被分成两部分: 0至 127和 128 至255。所得的直方图将有两个值:h (1) 等于图像在[0,127]间隔内的像素数,h (2) 等于图像在[128, 255] 间隔内的像素数。

通过下列表达式就可以得到归一化的直方图:

p = imhist(f, b) /numel(f)      %numel (f) 函数可以给出数组f中元素的个数 (也就是图像中的像素数)

计算并绘制图像直方图

1. 最简便方法是利用没有输出规定的imhist 函数

函数公式:

imhist(f);

代码编写:

imread('D:\数字图像处理\第二章学习\blue.jpg');          %读取图片文件中的数据
f=imread('D:\数字图像处理\第二章学习\blue.jpg');  
imhist(f);

运行结果如下:

左:原图                右 :直方图(a)

2. 用条形图绘制直方图

函数公式:

bar(horz, z, width)       %horz的值给出了水平增量,z的值对应垂直量,width 的值默认值为 0.8,当值为1时,竖条较明显;当值为 0时,竖条是垂直线。

代码编写:

f=imread('D:\数字图像处理\第二章学习\blue.jpg'); 
h = imhist(f);                         %生成直方图  
h1=h(1:10:256);                        %垂直量
horz = 1:10:256;                       %水平增量
figure,bar(horz, h1);                  %绘制条状直方图  
axis([0 255 0 60000]) ;                %axis([horzmin horzmax vertmin vertmax])  设置坐标轴最大最小值  
set(gca,'xtick',0:50:255);             %gca获得当前轴  xtick 和 ytick设置显示水平轴和垂直轴标尺
set(gca,'ytick',0:20000:60000);        %设置坐标轴的标尺  

运行效果如下:

左:原图                右 :条状直方图(b)

对比:

b图垂直标度比a图中整个直方 图的跨度范围宽,这是因为每个条的高度都由某个范围的所有像素决定,而不是由单个值的所有像素决定。

3. 用杆状图绘制直方图

函数公式:

 stem(horz,h, 'r--p') 

代码编写:

f=imread('D:\数字图像处理\第二章学习\dog3.jpg'); 
h = imhist(f,25);                            %生成直方图  
horz = linspace(0, 255, 25);                 %linspace(x1,x2,n)是生成从x1到x2的n个等距向量
stem(horz, h, 'fill');                       %绘制杆状直方图,如果使用了 fill, 那么标记点用三元组中第一个元素指定的颜色填充。默认蓝色,实线,圆圈。
axis([0 255 0 60000]);                       %axis([horzmin horzmax vertmin vertmax])  设置坐标轴最大最小值
set(gca, 'xtick', [0:50:255]);               %gca获得当前轴  xtick 和 ytick设置显示水平轴和垂直轴标尺
set(gca, 'ytick', [0:20000:60000]);          %设置坐标轴的标尺  

运行效果如下:

左:原图                右 :杆状直方图(c)

4. 直线绘制直方图

函数公式:

 plot(horz, z, 'LineSpec')     %horz由所有输入点坐标的x值组成,z是由与horz中包含的x对应的y所组成的向量。LineSpec是用户指定的绘图样式。

代码编写:

f=imread('D:\数字图像处理\第二章学习\dog3.jpg'); 
h = imhist(f);                              %生成直方图   
plot(h);                                    %绘制直方图,使用默认值
axis([0 255 0 60000]);                      %axis([horzmin horzmax vertmin vertmax])  设置坐标轴最大最小值
set(gca, 'xtick', [0:50:255]);              %gca获得当前轴  xtick 和 ytick设置显示水平轴和垂直轴标尺
set(gca, 'ytick', [0:20000:60000]);         %设置坐标轴的标尺 

运行效果如下:

左:原图                右 :直方图(d)

3.2直方图均衡化

假设灰度级为归一化在[0,1]范围内的连续量,让 p r ( r ) p_r(r) 代表一幅给定图像的灰度级的概率密度函数(PDF),下标用来区分输入图像和输出图像的概率密度函数。假设我们对输入灰度进行下列变换,得到输出(处理后的)灰度级s:
在这里插入图片描述
可以看出,输出灰度级的概率密度函数是均匀的,也就是:
在这里插入图片描述
当灰度级为离散值时,我们利用直方图并采用前面介绍的直方图均衡化技术。一般来说, 虽然由于变量的离散特性,处理后的图像直方图也不会完全均匀。对于离散的灰度级,我们采用求和的方式,将均衡化变换成为下列形式:
在这里插入图片描述
式中,k=0,1 , 2, …, L-1, 且 s k s_k 是输出(处理后的)图像的灰度值,对应输入图像的灰度值为 r k r_k

直方图均衡化由工具箱中的 histeq 函数实现,

语法如下:

g=histeq(f,nlev)     %f为输入图像,nlev为输出图像设定的灰度级数。

代码编写:

f=imread('D:\数字图像处理\第二章学习\dog1.jpg');           %读取图像
imshow(f);                                               %显示图像
figure;                                                  %创建新窗口
imhist(f);                                               %直方化图像
ylim('auto');                                            %自动设定纵坐标轴的取值范围和刻度线
g=histeq(f, 256);                                        %均衡化图像
figure;                                                  %创建新窗口
imshow(g);                                               %显示图像
figure;                                                  %创建新窗口
imhist(g);                                               %直方化被均衡化的图像

运行效果如下:

左:原图                右 :原图直方图(e)
左:均衡化后的图(f)                右 :图f的直方图(g)

分析:

均衡化处理后的图象只能是近似均匀分布。均衡化图象的动态范围扩大了,但其本质是扩大了量化间隔,而量化级别反而减少了,因此,原来灰度不同的象素经处理后可能变的相同,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。

3.3直方图匹配化(规定化)

直方图均衡化通过把输入图像的灰度级扩展到较宽灰度范围来实现图像增强,但这种方法有时并不总能导致成功的结果。当图像中接近0的像素过多,进行直方图均衡的时候,会导致统计概率变大,直接映射到高灰度,直接导致图像整体变量,达不到原来想要的结果,此时就需要使用直方图匹配,让变化后的图像具有特定的直方图。有时候,我们为了使两幅图像的色调保持一致,也可以采用该方法。

这种方法在原理上很简单。考虑归一化之后在[0, 1]区间内的连续灰度级,令 r和z分别表 示输入图像与输出图像的灰度级。输入图像的灰度级有概率密度函数 p r ( r ) p_r(r) ,输出图像的灰度级具有规定的概率密度函数 p z ( z ) p_z(z) 。变换为:
在这里插入图片描述
得到的灰度级s具有均勻的概率密度函数 p s ( s ) p_s(s) 。假设定义的变量z具有下列特性:

在这里插入图片描述
我们要寻找的是灰度级为 Z 的图像,且具有特定的概率密度 p z ( z ) p_z(z) 。由前面的两个等式可得:
在这里插入图片描述
可以由输入图像得到 T r T_r (这是上面讨论的直方图均衡化变换),由此得出结论:只要找到 H-1, 就能利用前面的等式得到变换后的灰度级z,概率密度函数(PDF)为指定的 p z ( z ) p_z(z)

语法如下:

g = histeq(f,hspec)     %f 为输入图像,hspec为特定的直方图(某个特定值的行向量),g为输出图像。

histeq 的特性是当 length (hspec) 比图像 f 中的灰度级小很多时,图像 g 的直方图通常会较好地匹配 hspec。

代码编写:

f = imread('D:\数字图像处理\第二章学习\dog2.jpg');
g = imread('D:\数字图像处理\第二章学习\blue.jpg');
g1 = imhist(g);                                 %生成直方图  
match = histeq(f, g1);                          %得到匹配后的图像
figure;
subplot(2, 3, 1), imshow(f), title('原图像');
subplot(2, 3, 2), imshow(g), title('模板图像');
subplot(2, 3, 3), imshow(match), title('匹配后的图像');
subplot(2, 3, 4), imhist(f), title('原图像的直方图');
subplot(2, 3, 5), imhist(g), title('模板图像的直方图');
subplot(2, 3, 6), imhist(match), title('匹配后得到图像对应的直方图');

运行状态如下:
在这里插入图片描述

3.4 函数 adapthisteq

这个工具箱函数执行所谓的对比度受限的自适应直方图均衡。这个方法是由用直方图规定化方法处理图像的小区域(称为小片)组成。然后用双线性内插将相邻小片组合起来以消除人工引入的边界效应。特别是可以限制均匀亮度区域的对比度, 以免放大噪声。

语法如下:

g = adapthisteq(f, paraml, vail, param2, val2, ...)            %f是输入图像,g是输出图像

代码编写:

g= imread('D:\数字图像处理\第二章学习\dog2.jpg');
f = rgb2gray(imread('D:\数字图像处理\第二章学习\dog2.jpg'));
g1 = adapthisteq(f);
g2 = adapthisteq(f, 'NumTiles', [25 25]);
g3 = adapthisteq(f, 'NumTiles', [25 25], 'ClipLimit', 0.05);
figure;
subplot(2, 5, 1), imshow(g), title('彩色图像');
subplot(2, 5, 2), imshow(f), title('灰度图像');
subplot(2, 5, 3), imshow(g1), title('用默认值使用adapthisteq的效果');
subplot(2, 5, 4), imshow(g2), title('将参数NumTiles设置为[25 25]的效果');
subplot(2, 5, 5), imshow(g3), title('将参数ClipLimit设置为0.05的效果');
subplot(2, 5, 6), imhist(g), title('直方图(上)');
subplot(2, 5, 7), imhist(f), title('直方图(上)');
subplot(2, 5, 8), imhist(g1), title('直方图(上)');
subplot(2, 5, 9), imhist(g2), title('直方图(上)');
subplot(2, 5, 10), imhist(g3), title('直方图(上)');

纠结这个代码出错已经两个小时了,期间尝试过很多解决方案,都无果,后来认真理解了公式,这有一个很容易出错却很难发现的点,可能真的是我刚接触图像处理,这个函数adapthisteq(f)中的f是输入图像,但是f要求是二维矩阵,而这个在刚萨雷斯课本中并没有提到,二维矩阵只能表示灰度图片,所以,如果jpg是彩色的,要用rgb2gray 转换为灰度图片才可以,注意!注意!注意!

运行状态如下:
在这里插入图片描述
分析:

使用函数 adapthisteq 全部默认设置之后的结果:虽然结果显示的细节略有增加,但图像的重要部分仍然较暗。将小片大小谱加到[25 25]后的结果:清晰度略有增加,但并未出现新的细节。将参数ClipLimit设置为0.05的效果:与前两个结果相比,这幅图像在细节方面明显增强。通过比较这两幅图可以十分清楚地看到局部增强方法相对于全局增强方法的优势。

猜你喜欢

转载自blog.csdn.net/Dujing2019/article/details/89007022
今日推荐