目录
- 第二章 灰度变换与空间滤波(续)
- 直方图处理与函数绘图
- 生成直方图
- 直方图均衡
- 直方图匹配
- 空间滤波
- 线性空间滤波
- 非线性空间滤波
- 图像处理工具箱的标准滤波器
- 线性空间滤波器
- 非线性空间滤波器
- 直方图处理与函数绘图
第二章 灰度变换与空间滤波(续)
直方图处理与函数绘图
生成直方图
应用函数 imhist
语法如下
h = imhist(f,b)
h为生成的直方图,f为输入图像,b为"容器"的数目。
以下面这幅图像的灰度级分布直方图为例
运行如下代码生成直方图
>> bar(h,0)
>> f = imread('2-3-1.jpg');
>> imhist(f)
为了便于观察,将灰度级分为十个级别,使用bar函数绘制条形图
>> f = imread('2-3-1.jpg');
>> h = imhist(f,10);
>> bar(h,1);
直方图均衡
观察上面两个直方图的分布,灰度级主要集中在较暗区域。现在通过直方图均衡来改变图像的对比度。
运行代码
>> f = imread('2-3-1.jpg');
>> g = histeq(f,256);
>> imshow(g)
>> imhist(g)
获得均衡后的图像
其灰度分布直方图为
可以看到,灰度值的动态范围增加了。
直方图匹配
直方图匹配应用histeq函数,可以用规定的函数映射图像的灰度值。格式如下
g = histeq(f, hspec)
f为输入图像,hspec为一个规定的行向量。
同时还可以应用adapthisteq处理图像,这个函数可以通过直方图匹配方法逐个处理图像的一部分,最后用双线性内插的方法将其组合起来,从而消除人工引入的边界。
>> f=imread('2-3-3.jpg');
>> imshow(f);
>> g3=adapthisteq(f,'NumTiles',[25 25],'ClipLimit',0.05);
>> figure,imshow(g3)
原始图像
处理后的图像
可以看到,图像的细节变多了。
空间滤波
线性空间滤波
线性空间滤波的操作是将邻域中的每个像素乘以相应的系数,然后求和,从而得到点(x,y)处的响应。
处理方式包括相关和卷积,其中卷积需要将模板旋转180°,其余操作完全相同。关于像素的边界处,有不同的填充方法,同时得到不同的结果。
在MATLAB中,处理线性空间卷积的函数是imfilter,格式如下
g = imfilter(f,w,filtering_mode,boundary_options,size_options)
其中后三个属性设置了滤波模式,边界选项和大小选项。
分别运行一下代码
f = ones(512);
for i = 1:256for j = 1:256f(i,j)=0;end
end
for i = 257:512for j = 257:512f(i,j)=0;end
end>> gd=imfilter(f,w);
>> gr=imfilter(f,w,'replicate');
>> gs=imfilter(f,w,'symmetric');
>> gc = imfilter(f,w,'circular');
>> g8r = imfilter(im2uint8(f),w,'replicate');
生成一幅512×512的图像,并进行线性操作,可得以下图像。
非线性空间滤波
非线性空间滤波与线性空间滤波机理相同。而线性滤波基于计算乘积和,非线性空间滤波则进行非线性操作,例如,让响应为最大像素值。
非线性操作的语法为
g = colfilt(f,[m n], 'sliding', fun)
其中f是输入图像,m和n是滤波器维数,sliding表明处理过程,fun是函数句柄。
填充边界的问题可以用padarray函数来解决。
fp = padarray(f, [r c], method, direction)
其中,f为输入图像,fp为填充后的图像,[r c]表示用于填充f的行和列数,method和direction代表了填充的方法和方向。
对以下图像进行操作
>> f = imread('2-4-2.jpg');
>> g = colfilt(f,[5 5],'sliding',@mean);
>> g = uint8(g);
>> imshow(g);
处理结果如下
图像处理工具箱的标准滤波器
线性空间滤波器
>> f= imread('2-4-3.jpg');
>> w4 = fspecial('laplacian',0);
>> w8 = [1 1 1;1 -8 1;1 1 1];
>> f = tofloat(f);
>> g4 = f - imfilter(f,w4,'replicate');
>> g8 = f - imfilter(f,w8,'replicate');
>> imshow(f);
>> figure,imshow(g4);
>> figure,imshow(g8);
原始图像
g4
g8
非线性空间滤波器
>> f=imread('2-4-4.jpg');
>> fn = imnoise(f,'salt & pepper',0.2);
>> gm = medfilt2(fn);
>> gms = medfilt2(fn,'symmetric');
>> subplot(221),imshow(f)
>> subplot(222),imshow(fn)
>> subplot(223),imshow(gm)
>> subplot(224),imshow(gms)