Matlab 数字图像的滤波及边缘检测

目录
  • 一、图像滤波
    • 1.1 线性滤波器
      • 1.1.1 均值滤波
      • 1.1.2 高斯滤波
    • 1.2 非线性滤波器
      • 1.2.1 中值滤波器
      • 1.2.2 双边滤波器
    • 1.3 滤波器的 Matlab 代码实现
  • 二、图像边缘检测
    • 2.1 一阶边缘检测算子
      • 2.1.1 Sobel 算子
      • 2.1.2 Canny 算子
    • 2.2 二阶边缘检测算子
      • 2.2.1 拉普拉斯算子
    • 2.3 边缘检测的 Matlab 代码实现
    • 2.4 边缘检测算法总结
  • 三、参考资料

一、图像滤波

图像滤波的主要目的就是在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制。图像滤波其主要分为线性滤波器和非线性滤波器。

1.1 线性滤波器

1.1.1 均值滤波

原理:在图像上,对待处理的像素给定一个模板,该模板包括了其周围的邻近像素。将模板中的全体像素的均值来替代原来的像素值的方法。以  的均值滤波器的模板为:

模板所覆盖的图像的像素为:

因此,模板中心点所对应的像素值可以表示为:

在进行滤波之前,一般会先对原图像进行填充,填充的像素大小为:r = floor(模板宽度/2),不然的话始终无法对图像边缘的像素进行滤波。

均值滤波的特点:均值滤波能够降低图像中的尖锐变化,去除图像中的噪声,且滤波窗口越大,去噪效果越好同时图像也会变得越模糊

1.1.2 高斯滤波

原理:其实高斯滤波和均值滤波的原理差不多,都是用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。区别就在于,高斯滤波中模板的数值是通过高斯函数生成的。还是以3×3的模板为例,以模板的左上角为坐标原点,模板中心的坐标为 (1,1),则生成的高斯模板为:

因此,模板中心点所对应的像素值可以表示为:

高斯滤波的特点:根据公式可以得到,在计算高斯滤波模板时,高斯滤波模板的值由中间向四周递减,且标准差越小,二维高斯图像越窄小,平滑效果不明显;标准差越大,而为高斯图像越矮宽,滤波效果比较明显。下图展示了不同 的7×7高斯模板的差别:

1.2 非线性滤波器

1.2.1 中值滤波器

原理:中值滤波器就是取模板覆盖区域的排序之后的中间值作为该模板区域内中心的像素值。还是以 3×3 中值滤波器模板为例,此时覆盖的像素为:

那么,中值滤波后的像素值为:

中值滤波器的特点:中值滤波器很适合处理椒盐噪声。

1.2.2 双边滤波器

设计原因:在均值滤波器和高斯滤波器时,滤波器的模板值仅仅考虑到了像素的空间位置,潜在的假设为:离模板中心点越近,那么他们的像素值也越接近。但是在纹理比较复杂的区域,这种假设很难成立,因此采用上述滤波器进行滤波时,图像的边缘信息保持不够理想。那么能不能设计一款滤波器,能够识别纹理复杂的区域,从而实现更好的边缘保持i效果?

原理:双边滤波器分为两个部分,首先采用高斯滤波器生成只跟像素位置相关的模板,然后根据像素值,生成另外一个跟像素值相关的模板。两个模板逐像素点击就形成了双边滤波模板。具体描述如下:

因此,最终的双边滤波模板为:

在双边滤波器中多考虑了值域模板,当两个位置像素越接近,那么 w2对应位置的权重就越大,否则就会越小。因此通过 w2我们在滤波器中保护了图像的边缘信息。其模板的图像如下:

双边滤波器的特点:双边滤波器是一种可以保边缘信息的去噪滤波器。

1.3 滤波器的 Matlab 代码实现

clear all
clc
image = imread('../测试图像/2.bmp');
[H,W,C] = size(image);  %记录读入图像的长宽

H_win = 7;  %定义模板窗口的宽度
image_input = double(rgb2ycbcr(image)); %转换成Ycbcr颜色空间
image_input = image_input(:,:,1); %取Y通道来进行处理

paddle = floor(H_win/2);    %计算需要填充的像素宽度
image_data = zeros(H+2*paddle, W+2*paddle); %0填充

Start = paddle+1;   %计算图像的开始和结束位置
End = H+paddle;
image_data(Start:End, Start:End) = image_input(:,:);%将图像放在填充图像的中间

%生成高斯滤波模板
sigma_g = 3;
sigma_r = 6;
[x,y] = meshgrid(-paddle:paddle,-paddle:paddle);
k_gaussian1=exp(-(x.^2+y.^2)/(2*sigma_g^2));     %以距离作为自变量高斯滤波器

k_gaussian=k_gaussian1/sum(k_gaussian1(:));%归一化
Map_X = 1:H_win; Map_Y = 1:H_win; %作3维图的横坐标
surf(Map_X,Map_Y,k_gaussian)    %绘制高斯滤波核的图

for i=Start:1:End
    for j=Start:1:End
        image_window = image_data(i-paddle:i+paddle, j-paddle:j+paddle);

        Mean_image(i-paddle,j-paddle) = mean(mean(image_window));   %均值滤波
        Median_image(i-paddle,j-paddle) = median(image_window(:));  %中值滤波

        Gaussian_image(i-paddle, j-paddle) = sum(sum(image_window.*k_gaussian));  %高斯滤波

        double_w = exp(-(image_window-image_data(i,j)).^2/(2*sigma_r^2)); %以周围和当前像素灰度差值作为自变量的高斯滤波器
        double_w = k_gaussian1 .* double_w;
        double_w = double_w/sum(double_w(:));

        Double_image(i-paddle, j-paddle) = sum(sum(image_data(i-paddle:i+paddle, j-paddle:j+paddle).*double_w));  %双边滤波
    end
end
figure, imshow(uint8(image_input)), title('原图')
subplot(2,2,1), imshow(uint8(Mean_image)), title('5*5均值')
subplot(2,2,2), imshow(uint8(Median_image)), title('中值滤波')
subplot(2,2,3), imshow(uint8(Gaussian_image)), title('5*5,1.5 高斯')
subplot(2,2,4), imshow(uint8(Double_image)), title('5*5,1.5 双边')

代码输出结果如下:

二、图像边缘检测

边缘检测是为了将其周围像素灰度有阶跃变化的像素检测出来,这些像素组成的集合就是该图像的边缘。比较常用的边缘检测方法就是考察每个像素在某个领域内灰度的变化,然后利用边缘临近一阶或二阶方向导数变化规律检测边缘,即边缘检测局部算法

2.1 一阶边缘检测算子

2.1.1 Sobel 算子

原理:Sobel 算子包括两组3×3的矩阵,左边的表示垂直,右边的表示水平。将它与图像作平面卷积,即可分别得出垂直及水平的亮度差分近似值。

假设 Ox 和 Oy 分别用来表示被模板 Gx 和 Gy 卷积后的结果,那么最终的输出图像边缘可以表示为:

Sobel算子的特点:Soble算子在水平和垂直两个方向上求导,得到的是图像在X方法与Y方向梯度图像。但是比较敏感,容易受影响,要通过高斯模糊(平滑)来降噪。

2.1.2 Canny 算子

原理:Canny算子是由计算机科学家John F. Canny于1986年提出的一种边缘检测算子,是目前理论上相对最完善的一种边缘检测算法。主要包括以下几个步骤:

  1. 高斯滤波对图像进行预处理,提前弱化噪声,增加边缘提取准确度
  2. Sobel 算子进行像素梯度计算,得到梯度强度矩阵
  3. 非极大值抑制:非极大值像素梯度抑制起到将边缘“瘦身”的作用。其基本方法是将当前像素梯度强度与沿正负梯度方向上的相邻像素的梯度强度进行比较,若其最大(即为极值),则保留该像素为边缘点,若不是最大,则对其进行抑制,不将其作为边缘点。
  4. 滞后阈值处理:定义一个高阈值和一个低阈值。梯度强度低于低阈值的像素点被抑制,不作为边缘点;高于高阈值的像素点被定义为强边缘,保留为边缘点;处于高低阈值之间的定义为弱边缘,留待进一步处理。
  5. 孤立弱边缘抑制:通常而言,由真实边缘引起的弱边缘像素点将连接到强边缘像素点,而噪声响应则未连接。通过查看弱边缘像素及其8个邻域像素,可根据其与强边缘的连接情况来进行判断。一般,可定义只要其中邻域像素其中一个为强边缘像素点,则该弱边缘就可以保留为强边缘,即真实边缘点。

Canny检测的特点:Canny 算子对于滤波参数和高、低阈值的选取还是较为敏感,使得实际应用过程中需要反复调试。

2.2 二阶边缘检测算子

2.2.1 拉普拉斯算子

原理:拉普拉斯算子是二阶微分算子,实际上就是图像梯度的散度:

然而:

所以,卷积的模板可以写为:

拉普拉斯算子的特点:Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。

2.3 边缘检测的 Matlab 代码实现

clear all
clc
image = imread('../测试图像/2.bmp');
[H,W,C] = size(image);  %记录读入图像的长宽

H_win = 21;  %定义模板窗口的宽度
image_input = double(rgb2ycbcr(image)); %转换成Ycbcr颜色空间
image_input = image_input(:,:,1); %取Y通道来进行处理

%定义sobel算子
G_x = [-1,0,1;-2,0,2;-1,0,1];
G_y = [1,2,1;0,0,0;-1,-2,-1];
%定义拉普拉斯算子
L = [-1,-1,-1;-1,8,-1;-1,-1,-1];
image_data = mat2gray(image_input); %图像归一化

for i=2:1:H-1
    for j=2:1:W-1
        image_win = image_data(i-1:i+1, j-1:j+1);
        Gx = sum(sum(image_win .* G_x));
        Gy = sum(sum(image_win .* G_y));
        Sobel_image(i, j) = sqrt(Gx^2 + Gy^2);
        Lapla_image(i, j) = image_data(i,j+1)+image_data(i,j-1)+image_data(i+1,j)+image_data(i-1,j)-4*(image_data(i,j));
    end
end
subplot(131), imshow(image_data), title('原图')
subplot(132), imshow(Sobel_image), title('Canny边缘检测')
subplot(133), imshow(Lapla_image), title('拉普拉斯检测')

代码输出结果如下:

2.4 边缘检测算法总结

  1. Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素;当对精度要求不是很高时,是一种较为常用的边缘检测方法。
  2. Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。
  3. Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉, Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。

三、参考资料

https://zhuanlan.zhihu.com/p/355263110

https://www.cnblogs.com/wangguchangqing/p/6416401.html

https://www.cnblogs.com/yibeimingyue/p/10878514.html

https://zhuanlan.zhihu.com/p/99959996

https://www.cnblogs.com/yibeimingyue/p/10878514.html

https://www.jianshu.com/p/2a06c68f6c14

以上就是数字图像的滤波及边缘检测的详细内容,更多关于滤波和边缘检测的资料请关注我们其它相关文章!

(0)

相关推荐

  • 如何利用Python 进行边缘检测

    为何检测边缘? 我们首先应该了解的问题是:"为什么要费尽心思去做边缘检测?"除了它的效果很酷外,为什么边缘检测还是一种实用的技术?为了更好地解答这个问题,请仔细思考并对比下面的风车图片和它的"仅含边缘的图": 可以看到,左边的原始图像有着各种各样的色彩.阴影,而右边的"仅含边缘的图"是黑白的.如果有人问,哪一张图片需要更多的存储空间,你肯定会告诉他原始图像会占用更多空间.这就是边缘检测的意义:通过对图片进行边缘检测,丢弃大多数的细节,从而得到&q

  • python实现ROA算子边缘检测算法

    python实现ROA算子边缘检测算法的具体代码,供大家参考,具体内容如下 代码 import numpy as np import cv2 as cv def ROA(image_path, save_path, threshold): img = cv.imread(image_path) image = cv.cvtColor(img, cv.COLOR_RGB2GRAY) new = np.zeros((512, 512), dtype=np.float64) # 开辟存储空间 widt

  • opencv3/C++图像滤波实现方式

    图像滤波在opencv中可以有多种实现形式 自定义滤波 如使用3×3的掩模: 对图像进行处理. 使用函数filter2D()实现 #include<opencv2/opencv.hpp> using namespace cv; int main() { //函数调用filter2D功能 Mat src,dst; src = imread("E:/image/image/daibola.jpg"); if(!src.data) { printf("can not l

  • opencv 图像滤波(均值,方框,高斯,中值)

    为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作.信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没.因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响. 如下图,左图带有椒盐噪声,右图为使用中值滤波处理后的图片. 图像滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声. python +opencv讲解 均值滤波 含义 如图:如果我们想对红色点进行处理,则它

  • Python图像滤波处理操作示例【基于ImageFilter类】

    本文实例讲述了Python图像滤波处理操作.分享给大家供大家参考,具体如下: 在图像处理中,经常需要对图像进行平滑.锐化.边界增强等滤波处理.在使用PIL图像处理库时,我们通过Image类中的成员函数filter()来调用滤波函数对图像进行滤波,而滤波函数则通过ImageFilter类来定义的. 下面先直接看一个样例: #-*- coding: UTF-8 -*- from PIL import Image from PIL import ImageFilter def image_filter

  • Matlab 数字图像的滤波及边缘检测

    目录 一.图像滤波 1.1 线性滤波器 1.1.1 均值滤波 1.1.2 高斯滤波 1.2 非线性滤波器 1.2.1 中值滤波器 1.2.2 双边滤波器 1.3 滤波器的 Matlab 代码实现 二.图像边缘检测 2.1 一阶边缘检测算子 2.1.1 Sobel 算子 2.1.2 Canny 算子 2.2 二阶边缘检测算子 2.2.1 拉普拉斯算子 2.3 边缘检测的 Matlab 代码实现 2.4 边缘检测算法总结 三.参考资料 一.图像滤波 图像滤波的主要目的就是在尽量保留图像细节特征的条件

  • python数字图像处理之基本形态学滤波

    目录 引言 1.膨胀(dilation) 2.腐蚀(erosion) 3.开运算(opening) 4.闭运算(closing) 5.白帽(white-tophat) 6.黑帽(black-tophat) 引言 对图像进行形态学变换.变换对象一般为灰度图或二值图,功能函数放在morphology子模块内. 1.膨胀(dilation) 原理:一般对二值图像进行操作.找到像素值为1的点,将它的邻近像素点都设置成这个值.1值表示白,0值表示黑,因此膨胀操作可以扩大白色值范围,压缩黑色值范围.一般用来

  • python之OpenCV的作用以及安装案例教程

    OpenCV的作用及安装 OpenCV简介 OpenCV是一个开源的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.提供了Python.Ruby.MATLAB等语言的接口,并且实现了图像处理和计算机视觉方面的很多通用算法,可以给开发者调用. OpenCV应用领域 计算机视觉领域方向 人机互动 物体识别 图像分割 人脸识别 动作识别 运动跟踪 机器人 运动分析 机器视觉 结构分析 汽车安全驾驶 OpenCV涉及的技术 图像数据的操作: 分配.释放.

  • Python实现边缘提取的示例代码

    目录 复习 一.边缘提取 1.什么是边缘 2.什么是边缘提取 二.Sobel算子 三.Canny边缘检测算法 1.算法步骤 2.高斯平滑 3.非极大值抑制 4.双阈值检测 四.相关代码 复习 (1)梯度: 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模) (2)线性滤波 可以说是 图像处理 最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果 一.边缘提取 1.什么是边缘 图象

  • 使用OpenCV检测图像中的矩形

    本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下 前言 1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现. 2.我这里使用的OpenCV版本是3.30. 矩形检测 1.得到原始图像之后,代码处理的步骤是: (1)滤波增强边缘. (2)分离图像通道,并检测边缘. (3) 提取轮廓. (4)使用图像轮廓点进行多边形拟合. (5)计算轮廓面积并得到矩形4个顶点. (6)求轮廓边缘之间角度的最大余弦. (7)画出矩形. 2.代码 //检测矩形 //

  • Matlab实现图像边缘检测

    为了在一幅图像 f 的(x,y)位置寻找边缘的强度和方向,所选择的工具就是梯度,梯度使用向量来表示: 该向量指出了图像 f 在位置(x,y)处的最大变化率的方向,梯度向量的大小表示为: 它是梯度向量方向变化率的值. 梯度向量的方向表示为: 梯度算子 roberts算子: sobel算子: prewitt算子: Matlab实现 function output = my_edge(input_img,method) if size(input_img,3)==3 input_img=rgb2gra

  • 关于matlab图像滤波详解(二维傅里叶滤波)

    目录 matlab图像滤波详解(二维傅里叶滤波) 第一步:读取图像并对图像进行傅里叶变换 第二步:滤波 第三步:傅里叶逆变换 总结 matlab图像滤波详解(二维傅里叶滤波) 在matlab中,图像滤波有很多中 比如平滑滤波(smooth()函数) 中值滤波medfilt2()函数) 这些相对简单,可以直接参考函数解释,不做详细解说 这里重点讲解一下傅里叶滤波,在matlab中,常用的为快速傅里叶变换.进行滤波的难点就在于如何将图像转换到频率域以及如何将频率域的图像逆变换为空间域中的图像 第一步

  • 基于Matlab图像处理的公路裂缝检测实现

    目录 一.简介 1案例背景 2理论基础 3程序实现 二.部分源代码 三.运行结果 一.简介 1 案例背景 随着国家对公路建设的大力投入,我国的公路通车总里程己经位居世界前列,这样进一步促进了我国经济建设的发展.随着公路的大量投运,公路日常养护和管理已经成为制约公路运营水平提高的瓶颈,特别是路面状态采集.检测维护等工作更是对传统的公路运维模式提出了挑战.路面裂缝是公路日常养护管理中最常见的路面损坏,也是影响公路状态评估和进行必要的公路维修的重要因素!.一般而言,如果路面裂缝能够在被恶化成坑槽之前得

  • C#简单数字图像处理程序

    C#编写的简单数字图像处理程序,数字图像处理的平时成绩和编程作业竟然占50%,那就把最近做的事写个札记吧. 先放个最终做成提交的效果看看: 1.直方图均衡化 2.算子锐化 3.空域增强 一.要达到的目的和效果 1.打开,保存图片: 2.获取图像灰度值,图像坐标: 3.进行线性变换,直方图均衡化处理: 4.直方图变换增强,以及各种滤波处理: 5.图像锐化(Kirsch,Laplace,sobel等算子). 二.编程环境及语言 C#-WindowsForm-VS2015 三.图标 最近发现了一个完全

  • python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号,微分运算就变成计算差分或梯度.图像处理中有多种边缘检测(梯度)算子,常用的包括普通一阶差分,Robert算子(交叉差分),Sobel算子等等,是基于寻找梯度强度.拉普拉斯算子(二阶差分)是基于过零点检测.通过计算梯度,设置阀值,得到边缘图像. Canny边缘检测算子是一种多级检测算法.1986年由J

随机推荐