第二章 灰度变换与空间滤波(续)
直方图处理与函数绘图
归一化直方图
公式:
p(rk)=h(rk)n=nkn其中 p(rk) 可以认为是灰度级 rk 出现的概率的估计。
表达式:p = imhist(f, b) / numel(f)
绘制直方图的函数(续)
- bar(horz, z, width) 绘制条形图
其中,z是一个包含被绘制的点的行向量;horz是一个与z同维数的向量(若horz省略,水平轴会从0至length(z)等分为若干单位);width是一个介于0和1之间的数(数值越接近与1竖条越明显,默认为0.8)。
注意:为了方便记忆,可以将 horz看成直方图的 水平增量,将 z看成 垂直轴的值,但 horz和z的长度要相同。
>> z = [1 4 5 6 2 3 9 10];
>> horz = [5 10 15 20 25 30 35 40];
>> bar(horz, z)
![自定义直方图](https://img-blog.csdn.net/20170623151647529?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgzMTEwNDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
axis([horzmin horzmax vertmin vertmax]) 函数可以设置水平轴和垂直轴的最小值和最大值。
常用语法:
axis tight ——将轴的上下限设置为数据范围
axis ij ——将坐标原点置于左上角
axis xy ——将坐标原点置于左下角xlabel(‘text string’, ‘fontsize’, size)
ylabel(‘text string’, ‘fontsize’, size)
其中text string是为水平轴和垂直轴添加的标记,size是以磅为单位的字体大小
text(xloc, yloc, ‘text string’, ‘fontsize’, size) 在图中指定位置添加文字
- title(‘titlestring’) 为图形添加标题
注意:设置轴值与标记的函数要在该函数已被绘制后使用
- stem(horz, z, ‘LineSpec’, ‘fill’) 绘制杆状图
其中,LineSpec是来自下表的一个三值数组。
![]()
>> h = imhist(f, 25);
>> horz = linspace(0, 255, 25);
>> stem(horz, h, 'fill')
- plot(horz, z, ‘LineSpec’) 绘制折线图,散点图
其中plot的默认值是不带标记点的蓝色实线。如果指定了一个三值数组且中间值为空或省略,则不会绘制出线条。
>> hc = imhist(f);
>> plot(hc)
- fplot(fhandle, limits, ‘LineSpec’) 处理函数句柄
其中,fhandle 是一个函数句柄,limits是一个指定x轴取值范围[xmin xmax]的一个向量。
>> fhandle = @tanh;
>> fplot(fhandle, [-2 2], ':')
直方图均衡
- g = histeq(f, nlev)
其中 ,f为输入图像, nelv是为输出图像设定的灰度级数。若nlev与L(输入图像中可能的灰度级总数)相等,则histeq直接执行变换函数。若nlev小于L,则hiseq试图分配灰度级,以便得到近似平坦的直方图。histeq中默认nlev = 64。一般将nlev赋值为灰度级最大可能数量(通常为256),因为这样能够得到较为正确的执行结果。
>> f = imread('D:\picture\images_chapter_03\Fig3.15(a)1top.jpg');
>> imhist(f)
>> ylim('auto')
>> g = histeq(f, 256);
>> figure, imshow(g)
>> figure, imhist(g)
>> ylim('auto')
adapthisteq函数
- g = adapthisteq(f, param1, val1, param2, val2, …)
其中, f是输入图像,g是输出图像, param/val是下表所列内容。
![]()
>> f = imread('D:\picture\images_chapter_03\Fig3.20(a).jpg');
>> g1 = adapthisteq(f);
>> g2 = adapthisteq(f, 'NumTiles', [25 25]);
>> g3 = adapthisteq(f, 'NumTiles', [25 25], 'ClipLimit', 0.05);
>> subplot(141),imshow(f);
>> subplot(142),imshow(g1);
>> subplot(143),imshow(g2);
>> subplot(144),imshow(g3);
空间滤波
线性空间滤波
- 大小为m×n的滤波模板w(x, y)与函数f(x, y)的相关,由w(x, y)☆f(x, y)表示:
w(x,y)☆f(x,y)=∑s=−aa∑t=−bbw(x,y)f(x+s,y+t)
该公式对所有的偏移变量x和y求值,以便w中的所有元素访问f中的每个像素,假定f已被进行了零填充。a和b由a = (m - 1) / 2和b = (n - 1) / 2给出。 - w(x, y)和f(x, y)的卷积由w(x,y)★f(x,y)表示:
w(x,y)★f(x,y)=∑s=−aa∑t=−bbw(x,y)f(x−s,y−t) - 通过函数imfilter实现线性空间滤波
g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中,f为输入图像,w为滤波模板,g为滤波后的结果,其他参数见下图:![]()
常用g = imfilter(f, w, ‘replicate’),如果希望执行卷积,则可以g = imfilter(f, w, ‘conv’, ‘replicate’)
注意:如果追求精度,要将f转换为浮点型。
>> f = zeros(500);
>> f(1:250,250:500) = 1;
>> f(250:500,1:250) = 1;
>> imshow(f)
>> w = ones(31);
>> gd = imfilter(f, w);
>> subplot(131), imshow(f)
>> subplot(132), imshow(gd, [ ])
>> gr = imfilter(f, w, 'replicate');
>> subplot(133), imshow(gr, [ ])
>> gs = imfilter(f, w, 'symmetric');
>> subplot(131), imshow(gs)
>> gc = imfilter(f, w, 'circular');
>> subplot(132), imshow(gc, [ ])
>> f8 = im2uint8(f);
>> g8r = imfilter(f8, w, 'replicate');
>> subplot(133), imshow(g8r, [ ])
由以上的实验可以看出每个参数所实现的功能。也证实了为什么要将f转化为浮点型图像。
非线性空间滤波
- colfilt函数
g = colfilt(f, [m n], ‘sliding’, fun)
其中,m和n表示滤波区域的维数,’sliding’表明处理过程是m×n区域>在输出图像f中逐像素的滑动,fun是一个函数句柄。
注:使用colfilt时,滤波前必须显式地填充输入图像。这会用到padarray函数:
fp = padarray(f, [r c], method, direction),其中,f为输入图像,fp为填充后的图像,[r c]表示用于填充f的行数和列数,其他参数见下图:
![]()
如果参数中不包含direction,则默认值为’both’,若不含method,则默认用0填充。
图像处理工具箱的标准空间滤波器
线性空间滤波器
- 生成滤波模板函数:
w = fspecial(‘type’, parameters)
类型 函数和参数 ‘average’ fspecial(‘average’, [r c])。大小为r x c的一个矩形平均滤波器。默认3x3。若用一个数代替,则为方形滤波器。 ‘disk’ fspecial(‘disk’, r)。一个圆形平均滤波器(包含在2r+1大小的正方形内),半径r默认为5。 ‘gaussian’ fspecial(‘gaussian’, [r c], sig)。一个大小r x c的高斯低通滤波器,标准偏差为sig(正)。默认值为3 x 3和0.5。若由一个数代替,则为方形滤波器。 ‘laplacian’ fspecial(‘laplacian’,35..alpha)。一个3x3的拉普拉斯滤波器,其形状由alpha指定,alpha是[0,1]内的一个数,默认0.2。 ‘log’ fspecial(‘log’, [r c], sig)。一个大小r x c的高斯-拉普拉斯滤波器,标准偏差sig(正),默认5x5和0.5。若用一个数代替[r c],则表示这是一个正方形滤波器 ‘motion’ fspecial(‘motion’, len, theta)。围绕一幅len个像素的图像线性运动时,输出一个滤波器。运动方向theta,单位为°,即为从水平方向逆时针转动的角度。默认9,0,表示沿水平方向9个像素的运动。 - 使用函数imfilter实现拉普拉斯滤波器
>> f = imread('D:\picture\images_chapter_03\Fig3.40(a).jpg');
>> w = [0 1 0; 1 -4 1; 0 1 0];
>> g1 = imfilter(f, w, 'replicate');
>> f2 = im2double(f);
>> g2 = imfilter(f2, w, 'replicate');
>> g = f2 - g2;
>> subplot(141), imshow(f)
>> subplot(142), imshow(g1, [ ])
>> subplot(143), imshow(g2, [ ])
>> subplot(144), imshow(g)
非线性空间滤波器
- 二维中值滤波器的实现
g = medfilt2(f, [m, n], padopt)
其中,[m n]定义为大小为m×n的邻域,’padopt’指定三个可能的边界填充选项之一:’zero’(默认值),’symmetric’指出f按照镜像反射方式对称地沿边界扩展,’indexed’表示若f是double类的则用1填充,否则用0填充。默认形式:g = medfilt2(f) 表示使用一个3×3大小的邻域并用0填充边界来计算中值。
>> f = imread('D:\picture\images_chapter_03\Fig3.37(a).jpg');
>> fn = imnoise(f, 'salt & pepper', 0.2);
>> gm = medfilt2(fn);
>> gns = medfilt2(fn, 'symmetric');