第二章 灰度变换与空间滤波(续)

第二章 灰度变换与空间滤波(续)

直方图处理与函数绘图

归一化直方图

公式:

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是来自下表的一个三值数组。
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')

花粉1
直方图1
花粉2
直方图2

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);

stone

空间滤波

线性空间滤波


  • 大小为m×n的滤波模板w(x, y)与函数f(x, y)的相关,由w(x, y)☆f(x, y)表示:
    w(x,y)f(x,y)=s=aat=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=aat=bbw(x,y)f(xs,yt)
  • 通过函数imfilter实现线性空间滤波

g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中,f为输入图像,w为滤波模板,g为滤波后的结果,其他参数见下图: imfilter
常用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, [ ])   

box1
box2
由以上的实验可以看出每个参数所实现的功能。也证实了为什么要将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)

moon

非线性空间滤波器


  • 二维中值滤波器的实现
    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');

这里写图片描述
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值