Matlab图像处理系列3———空间域锐化滤波器

注:本系列来自于图像处理课程实验,用Matlab实现最基本的图像处理算法

1.锐化滤波器

锐化滤波,是将图像的低频部分减弱或去除,保留图像的高频部分,即图像的边缘信息。

图像的边缘、轮廓一般位于灰度突变的地方,也就是图像的高频部分,通常用灰度差分提取边缘轮廓。

图像中边缘轮廓通常是任意方向的,因此我们的差分运算需要具有方向性。各向同性的边缘检测算子对任意方向的边缘轮廓都有相同的检测能力,那么什么是算子

算子是一个函数空间到函数空间上的映射O:X→X。广义上的算子可以推广到任何空间,如内积空间等。

我们主要学习以下四种差分算子:

  • Roberts算子
  • Sobel算子
  • Prewitt算子
  • Laplace算子

2.Roberts算子锐化滤波

(1)Roberts算子

设图像函数为F(x,y),点(x,y)的梯度定义为:

G[F(x,y)]=????????F?x?F?y???????

梯度的幅值定义为:

G[F(x,y)]=(?F?x)2+(?F?y)2 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄√

对于离散图像,我们需要用差分近似表示微分,那么得到近似梯度幅度为:

G[F(x,y)]=[F(x,y)?F(x+1,y)]2+[F(x,y)?F(x,y+1)]2 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄√=|F(x,y)?F(x+1,y)|+|F(x,y)?F(x,y+1)|

交叉一阶差分,得到Roberts算子:

G[F(x,y)]=|F(x,y)?F(x+1,y)|+|F(x,y)?F(x,y+1)|

(2)代码实现

Roberts算子涉及绝对值运算,我们不方便提取出模版来做模版卷积运算,那么直接遍历所有点求出其近似梯度幅值:

function [ edge ] = RobertsOperator( pic )
    edge = uint8(zeros(size(pic)));

    h = size(pic, 1);
    w = size(pic, 2);

    for i = 1 : h - 1
        for j = 1 : w - 1
            edge(i, j) = uint8(abs(pic(i, j) - pic(i + 1, j + 1)) + abs(pic(i, j + 1) - pic(i + 1, j)));
        end
    end

end

边界点无法按照Roberts算子求交叉差分,这里采取直接忽略边界的方式。需要注意的是把类型强制转换为uint8(abs默认返回double)。

(3)运行结果

3.Sobel算子锐化滤波

(1)Sobel算子

Roberts算子是基于2*2窗口计算近似梯度,而Sobel算子是基于3*3窗口计算近似梯度的,并且Sobel算子并不是各向同性的算子,它分为:

  • 水平边缘检测Sobel算子gx
  • 垂直边缘检测Sobel算子gy

先给出模版再说明近似梯度的原因:

gx=?????1 0 1?202?101????

gy=?????1 ?2 ?1000121????

gx之所以近似表示水平梯度,是因为它直接求的是3*3窗口内模版中心像素点附近的像素点水平差分之和,中间元素差分乘以了权重系数2表示和模版中心关联度更高。gy可以类似理解。

运用模版卷积运算,可以快速求出水平梯度:

Gx=gx?F3×3

Sobel算子考虑权重,因此抗噪能力优于无权重的Prewitt算子(见后)。

在求出了水平梯度Gx和垂直梯度Gy后,可以得到梯度幅值为:

G=(Gx)2+(Gy)2 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄√

(2)代码实现

为了节约运算量,一般在实现Sobel算子时不直接使用求模运算(平方和再开方),而是比较Gx和Gy中绝对值较大者(水平差分和垂直差分较大者),也就是选取边界轮廓更加明显的方向。

使用模版卷积,直接忽略边界:

function [ edge ] = SobelOperator( pic )
    edge = uint8(zeros(size(pic)));

    h = size(pic, 1);
    w = size(pic, 2);

    gx = [-1, -2, -1; 0, 0, 0; 1, 2, 1];
    gy = gx‘;

    for i = 2 : h - 1
        for j = 2 : w - 1
            sub = double(pic(i - 1 : i + 1, j - 1 : j + 1));
            g1 = abs(sum(sum(sub .* gx)));
            g2 = abs(sum(sum(sub .* gy)));
            if g1 > g2
                edge(i, j) = uint8(g1);
            else
                edge(i, j) = uint8(g2);
            end
        end
    end
end

还是需要注意:

  • 做卷积时用Matlab点乘
  • uint8类型转换

(3)运行结果

相比Roberts算子,使用Sobel算子得到的边缘线条更粗,但能一定程度上反映边缘在原始图像中的强度。

4.Prewitt算子锐化滤波

(1)Prewitt算子

前面提到过,Prewitt是Sobel算子的无权重版本,模版如下:

gx=?????1 0 1?101?101????

gy=?????1 ?1 ?1000111????

(2)代码实现

直接修改模版即可:

    gx = [-1, -1, -1; 0, 0, 0; 1, 1, 1];
    gy = gx‘;

(3)运行结果

Prewitt算子边缘检测和Sobel算子结果相似,但不如其细节丰富。

5.Laplace算子锐化滤波

(1)Laplace算子

之前的三个算子都是一阶梯度算子,最后介绍一个二阶梯度算子: Laplace算子,二维空间的laplace算子定义为各向同性的二阶导数和:

?2F=?2F?x2+?2F?y2

图像中用二阶差分来近似二阶梯度:

?2F?x2=(F(x+1,y)?F(x,y))?(F(x,y)?F(x?1,y))=F(x+1,y)?2F(x,y)+F(x?1,y)

?2F?y2=(F(x,y+1)?F(x,y))?(F(x,y)?F(x,y?1))=F(x,y+1)?2F(x,y)+F(x,y?1)

所以有

?2F=F(x+1,y)+F(x?1,y)+F(x,y+1)+F(x,y?1)?4F(x,y)

由此得到laplace算子的模版:

L=????0 1 01?41010????

(2)代码实现

同样用模版卷积并且忽略边界:

function [ edge ] = LaplaceOperator( pic )
    edge = uint8(zeros(size(pic)));

    h = size(pic, 1);
    w = size(pic, 2);

    l = [0, 1, 0; 1, -4, 1; 0, 1, 0];

    for i = 2 : h - 1
        for j = 2 : w - 1
            sub = double(pic(i - 1 : i + 1, j - 1 : j + 1));
            d = sum(sum(sub .* l));
            edge(i, j) = uint8(d);
        end
    end
end

(3)运行结果

Laplace算子的边缘检测效果并不如一阶算子的效果,观察一阶导数和二阶导数的图像就可以明白:

二阶导数增强域不是频率最高的部分(边缘),而有一定偏差,并且增强幅度并不如一阶导数。如果求绝对值,图像负y轴部分翻正,会产生双边缘。

书上总结的Laplace算子做锐化滤波的特点

  • 对噪声敏感
  • 产生双边源
  • 缓慢区域产生暗背景
时间: 2024-11-06 13:50:58

Matlab图像处理系列3———空间域锐化滤波器的相关文章

Matlab图像处理系列2———空间域平滑滤波器

注:本系列来自于图像处理课程实验,用Matlab实现最基本的图像处理算法 本文章是Matlab图像处理系列的第二篇文章,介绍了空间域图像处理最基本的概念----模版和滤波器,给出了均值滤波起和中值滤波器的Matlab实现,最后简要讨论去躁效果. 1.空间域增强 (1)模版运算 图像处理中,模版可以看作是n*n(n一般是奇数)的窗口,模版连续地运动于整个图像中,对模版窗口范围内的像素做相应处理. 模版运算主要分为: 模版卷积 模版排序 模版卷积是把模版内像素的灰度值和模版中对应的灰度值相乘,求平均

Matlab图像处理系列4———图像傅立叶变换与反变换

注:本系列来自于图像处理课程实验,用Matlab实现最基本的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内可以加工处理图像以外,我们还可以将图像变换到其他空间后进行处理,这些方法称为变换域方法,最常见的变换域是频域. 使用Fourier变换把图像从空间域变换到频域,在频域内做相应增强处理,再从频域变换到空间域得到处理后的图像. 我们这里主要学习Fourier变换和FFT变换的算法,没有学过通信原理,我对信号.时域分析也不是很清楚. 2.FFT算法 (1)离散Fourier变

Matlab图像处理系列1———线性变换和直方图均衡

注:本系列来自于图像处理课程实验,用Matlab实现最基本的图像处理算法 图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境.灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对灰度值分布的变换. 1.灰度线性变换 (1)线性变换函数 原图向灰度值为g,通过线性函数f(x)=kx+b转换为f(g)得到灰度的线性变换. (2)代码实现 Matlab中支持矩阵作为函数参数传入,定义一个线性转换函数,利用Matlab矩阵操作,用一行代

图像增强之空间域锐化

1.图像锐化理论 图像锐化的目的是使图像变得清晰起来,锐化主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反.锐化提高图像的高频分量,增加灰度反差增强图像的边缘和轮廓,以便后期图像识别. 在图像增强过程中,常用平滑算法来消除噪声,平滑属于低通滤波,图像的能量主要集中在低频部分,噪声所在频段主要在高频部分,同时图像的边缘也集中在高频部分,这意味着图像平滑后,高频被衰减轮廓会出现模糊.图像锐化就是为了减少这种现象,通过高通滤波使图像边缘和轮廓变得清晰. 2.一阶微分图像增强--

空间域图像增强和边缘检测

半夜起来做了WY的笔试题,感觉知识掌握的很不好. 其中有一问答题关于边缘检测算子,虽然都知道这几种算子,但是说不上来它们各自的有缺点及应用,现在来总结一下网上的资料. 图像增强的过程中,通常利用各种平滑滤波算法来消除噪声.而通常在图像中,图像的主要能量集中在低频部分,噪声和边缘往往集中在高频部分.所以平滑滤波不仅使噪声减少,图像的边缘信息也会损失,图像的边缘也会变的模糊.为了减少这种不利的效果,通常利用图像锐化来是边缘变得清晰.锐化的目的是让图像的边缘及细节变得清晰.平滑后的图像变得模糊,主要原

空间域平滑滤波器

原文:https://www.cnblogs.com/zfyouxi/p/5144068.html 1.空间域增强 (1)模版运算 图像处理中.模版能够看作是n*n(n通常是奇数)的窗体.模版连续地运动于整个图像中,对模版窗体范围内的像素做相应处理. 模版运算主要分为: 模版卷积 模版排序 模版卷积是把模版内像素的灰度值和模版中相应的灰度值相乘,求平均值赋给当前模版窗体的中心像素.作为它的灰度值: 模版排序是把模版内像素的灰度值排序,取某个顺序统计量作为模版中心像素灰度值. Matlab中做模版

2_Matlab图像的空间域变换操作

1. 目的:为了达到某种视觉效果,变换输入图像的像素位置,通过把输入图像的像素位置映射到一个新的位置以达到改变原图像显示效果的目的. 2. 操作包括: ? 图像插值(Interpolation) ? 图像缩放(Resizing) ? 图像旋转(Rotation) ? 图像剪切(Cropping) 3.图像差值操作 1)原因:在处理图像的过程中,比如对图像进行缩放及旋转,这时图像中每个像素的值都要发生变化.数字图像的坐标是整数,经过这些变换之后的坐标不一定是整数,使得输入图像的像素点经过空间域变换

MATLAB图像处理基础

MATLAB图像处理基础 2.2.1 图像文件格式及图像类型 1.MATLAB支持的几种图像文件格式: ⑴JPEG(Joint Photogyaphic Expeyts Group):一种称为联合图像专家组的图像压缩格式. ⑵BMP(Windows Bitmap):有1位.4位.8位.24位非压缩图像,8位RLE(Run length Encoded)的图像.文件内容包括文件头(一个BITMAP FILEHEADER数据结构).位图信息数据块(位图信息头BITMAP INFOHEADER和一个颜

matlab图像处理

matlab图像处理 转自:http://www.cnblogs.com/lovebay/p/5094146.html 1. 图像和图像数据 缺省情况下,MATLAB将图像中的数据存储为双精度类型(double),64位浮点数,所需存储量很大:MATLAB还支持另一种类型无符号整型(uint8),即图像矩阵中每个数据占用1个字节. 在使用MATLAB工具箱时,一定要注意函数所要求的参数类型.另外,uint8与double两种类型数据的值域不同,编程需注意值域转换. 从uint8到double的转