-
2021-04-27 05:58:43
上一讲小白为小伙伴们带来了如何使用自编函数和自带函数对图像进行滤波,去除图像的噪声。这次小白为大家带来滤波的新用处——边缘提取。
什么是图像边缘
所谓图像边缘(Edlge)是指图像局部特性的不连续性,例如,灰度级的突变,颜色的突变,纹理结构的突变等。边缘广泛存在于目标与目标、物体与背景、区域与区域(含不同色彩)之间,它是图像分割所依赖的重要特征。
小白今天主要介绍几种典型的图像灰度值突变的边缘检测方法,其原理也适用用于其他特性突变的边缘检测。图像的边缘通常与图像灰度的一阶导数的不连续性有关。图像灰度的不连续性可分为两类:阶跃不连续,即图像灰度在不连续处的两边的像素灰度有明显的差异。线条不连续,即图像灰度突然从一个值变化到另一个值,保持一个较小的行程又返回到原来的值。但是在实际中,阶跃和线条边缘图像是较少见的,由于空间分辨率(尺度空间)、图像传感器等原因会使阶跃边缘变成斜坡形边缘,线条边缘变成房顶形边缘。它们的灰度变化不是瞬间的而是跨越一定距离的。几种边缘类型,可以通过下面的图片有个更清晰的认识。
Sobel算子
在前面的关于图像滤波的讲解中,小白为大家介绍了sobel算子模板,但是没有讲解其具体作用。这次的讲解中,小白将为大家讲解什么是sobel算子。
sobel算子是一阶的梯度算子,也就是对信号求取一阶导数,对噪声具有平滑作用,提供较为精确的边缘方向信息,但是边缘定位精度不够高;但是该种方法比较简单,容易实现,也比较容易理解。
对一个连续函数求导是一件比较容易的事情,但是图像中的数据都是数字化之后的数据,是离散的,因此对于求导就需要使用差分方式:前面的像素灰度值减去后面像素的灰度值,并将结果大于一定阈值的设为边缘,否则就不是边缘。我们用数学公式表示就是:I(x,y)-I(x-n,y)。公式给出的是两个像素在同一行中,两个像素也可以在同一列中,而且方向也可以更改。
根据之前的模板来看的话,只有一个维度的求导可以用如下的模板表示:
可以用上面两个模板分别对原图像求取横着和竖着边缘,之后对两者求并集,便是图像整体的边缘。但是细心的小伙伴肯定会发现,模板之后两个元素,以哪个元素作为模板的中心呢?为了解决这个问题,研究者将其进行了扩展,变为以下的模板:
模板长度变为奇数便可以解决模板没有“中心”的问题。后续经过各种演化,最终变为前面几讲中提到的模板的样子。小伙伴在使用的过程中可以直接使用其模板就可以,而且Matlab也是带有sobel边缘提取的函数,不需要小伙伴自己编写复杂的程序。
常用的sobel边缘提取模板
Roberts算子
其实很多种算子都借鉴了sobel方法的思想,Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。我们直接给出Roberts算子的模板:
通过模板我们也能看出来,该算法是采用检测斜着方向的梯度变化来判定图像的边缘。
Canny算子
Canny算子是目前边缘检测最常用的算法,效果也是最理想的。但是Canny边缘检测算法不是简单的模板卷积而已,通过梯度方向和双阈值法来检测边缘点,具体算法讲解,可以通过点击”原文阅读“来了解更多:
Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。
Matlab边缘提取
Matlab提供多种边缘检测方法,通过函数edge(image,'method')来实现图像的边缘提取,通过修改参数‘method’来实现不同滤波方法。具体的边缘检测代码如下:
I=imread('lena.bmp');% 提取图像
I=rgb2gray(I);%将彩色图转换灰度图
BW1=edge(I,'sobel'); %用SOBEL算子进行边缘检测
BW2=edge(I,'roberts');%用Roberts算子进行边缘检测
BW3=edge(I,'prewitt'); %用prewitt算子进行边缘检测
BW4=edge(I,'log'); %用log算子进行边缘检测
BW5=edge(I,'canny'); %用canny算子进行边缘检测
subplot(2,3,1), imshow(BW1);
title('sobel edge check');
subplot(2,3,2), imshow(BW2);
title('roberts edge check');
subplot(2,3,3), imshow(BW3);
title('prewitt edge check');
subplot(2,3,4), imshow(BW4);
title('log edge check');
subplot(2,3,5), imshow(BW5);
title('canny edge check');
将上述代码复制到Matalb里,把图像地址改成自己想要提取边缘的图像,运行之后便可的得到图像边缘。小白在自己的电脑上运行程序的结果如下图。在程序里也利用其他算子提取了边缘,方便小伙伴的对比。
总结
图像的边缘提取是对像素灰度值连续性、变化大小的检测,不同边缘检测的方法各有优缺点,需要根据实际的情况来选择提取边缘的方法。
相关阅读:
更多相关内容 -
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2021-01-01 00:55:18实现思路: 1,将传进来的图片矩阵用算子进行卷积求和(卷积和取绝对值) 2,用新的矩阵(与原图一样大小)去接收每次的卷积和的值 3,卷积图片所有的像素点后,把新的矩阵数据类型转化为uint8 ... -
基于改进忆阻细胞神经网络的彩色图像边缘提取
2021-03-27 12:34:03抗噪性检测, 与传统边缘提取算法对比分析, 并计算各算法边缘提取结果的FOM (figure of merit) 值和峰值信噪比(PSNR),验证了基于像素空间分布的阈值自适应忆阻细胞神经网络在彩色图像边缘提取中的有效性 -
图像边缘提取算法分析_快速边缘提取算法
2020-03-06 01:09:48图像边缘提取算法的分析;概述;Roberts算子;抗噪性能;性能分析;Sobel算子;抗噪性能;Prewitt算子;抗噪性能;性能分析;Kirsch算子;抗噪性能;Robinson算子;抗噪性能;二阶算子检测;抗噪性能;性能分析;LOG算子;抗噪性能;... -
阈值自适应CNN的彩色图像边缘提取 (2014年)
2021-06-15 03:10:38细胞神经网络用于彩色图像边缘提取已经有很多人做了研究。现有的大部分工作都根据经验选取固定阈值来设计CNN模板。但这种阈值的选取方法忽略了人眼最小分辨差具有自适应性的特点。在设计图像边缘提取CNN模板选取阈值... -
_图像边缘提取方法研究,图像处理,小波变换,图像边缘检测
2022-03-31 22:12:16该文对传统的具有代表性的各种图像边缘提取方法进行了阐述、对比和分析了各自的优缺点,为了更清楚地看出各种算法的效果,给出了一些常用算法对同一副标准测试图像进行边缘提取的实验结果。本文对现代的一些边缘检测... -
EDGE_边缘提取_高通滤波_middle3cb_图像边缘提取_
2021-09-29 10:21:04通过构造函数,构造高通滤波器,用于图像的边缘提取 -
结合高斯加权距离图的图像边缘提取
2021-03-05 13:27:31边缘提取的连续性与抗噪性显得尤为重要,其可通过区域增长等算法提取目标区域,为抠图、统计测量提供必要的支持,本文以实现目标轮廓的有效提取为目的,提出一种结合高斯加权距离图的图像边缘提取方法。方法 首先... -
嵌入式系统/ARM技术中的红外图像边缘提取设计与应用
2020-10-23 09:10:45摘 要: 提出了一种基于人眼微动机理的边缘提取算法。...各国学者提出了许多图像边缘提取算法,如经典的Sobel、Prewitt、LOG、Canny等算法[1]。这些算法原理简单易于实现,但是由于它们大多都是基于局部窗口的 -
opencv3/C++图像边缘提取方式
2020-08-25 07:19:13今天小编就为大家分享一篇opencv3/C++图像边缘提取方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
基于c+++Opencv的图像边缘提取及拟合
2018-03-24 15:25:51基于c+++Opencv的图像边缘提取及拟合。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。... -
蚁群算法在图像边缘提取中的研究 (2010年)
2021-05-19 12:58:29文章对蚁群算法在图像边缘的提取中进行研究,对蚁群算法在图像边缘提取中采用蚂蚁访问不同邻域策略与不同的启发信息公式进行MATLAB仿真,得到最佳的邻域策略与启发信息公式,并利用得到的最佳方式对不同图像进行边缘的... -
canny_canny算子图像边缘提取_图像提取_
2021-10-03 08:21:28利用canny算子进行图像处理,提取图像的边缘信息,方便后续的图像处理 -
snake_边缘提取_snake图像分割_Snake!_snake分割_图像边缘提取_
2021-10-01 12:31:26实现snake分割 通过snake方法 对图像边缘进行提取 -
基于形态学梯度矢量的图像边缘提取算法 (2005年)
2021-05-13 05:08:33文章提出了一种新的图像边缘提取算法:在边缘检测部分提出了具有方向估计的形态学梯度算子,且从理论和实际应用两个方面给予证明。并将模糊处理加入该系列算子,使这些算子在噪声抑制和提高边缘清晰度两方面均有较好... -
fast-guided-filter-code-v1_边缘提取_导向滤波_图像边缘提取_纹理_图像特征提取
2021-09-11 16:00:41导向滤波,用于图像边缘检测,提取空间纹理特征 -
S_边界纹理_变化检测_图像边缘提取、纹理分析_颜色特征值_差异图像特征_
2021-09-29 15:49:50图像边缘提取、纹理分析。在图像中,边界表明一个特征区域的终结和另一个特征区域的开始,边界所分开区域的内部特征或属性是一致的,而不同的区域内部的特征或属性是不同的,边缘检测正是利用物体和背景在某种图像... -
图像边缘提取和周长计算
2018-05-25 22:18:13Matlab 代码,该程序功能实现对图像进行边缘提取,计算周长。 -
数字图像边缘提取
2017-07-01 16:55:54利用傅里叶描述子复原图像 傅里叶描述子逆变换重建边界 对边界进行二次取样源码 进行边缘提取,得到包络数据信息等等。 -
图像边缘提取进行锐化处理
2020-12-15 21:08:38对已有图片进行导入,无论是彩色图片还是灰度图片都可以直接操作。进行边缘提取,再进行锐化操作,增强图像的特征。 -
OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)
2020-10-21 17:11:00OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)一、图像梯度1.1 梯度1.2 图像梯度二、梯度图与梯度算子2.1模板卷积2.2 梯度图2.3 梯度算子2.3.1 Roberts交叉算子2.3.2 Prewitt算子2.3.3 Sobel算子三、...OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)
这次笔记简单介绍图像梯度、梯度图以及梯度算子的概念,并详细介绍三种基本的梯度算子,然后简单的介绍Canny检测的原理与代码实现(因为Canny检测中有很重要的一步用到了Sobel算子计算梯度,所以先介绍前面的内容)。
一、图像梯度
1.1 梯度
先来看梯度的概念:
梯度是一个向量,梯度方向指向函数变化最快的方向,大小就是它的模,也是最大的变化率,对于二元函数z=f(x,y),它在点(x,y)的梯度记为:
或:
梯度的计算公式为:
梯度向量的幅值和方向角为:
有了梯度是最大变化率这么一个认识,下面我们拓展到图像梯度的概念上来。1.2 图像梯度
图像梯度即图像中灰度变化的度量,求图像梯度的过程是二维离散函数求导过程。
因为图像边缘上的像素值变化非常剧烈,所以图像的边缘其实就是图像上灰度级变化很快的点的集合。
下图展示了一个灰度图的数学化表达,像素点(x,y)的灰度值是f(x,y),它有八个邻域(有时使用四邻域):
图像在点(x,y)的梯度为:
分别对应图像的水平方向和竖直方向,可见图像梯度的求法只是像素值之间的差,而无需求导(因为数字图像是离散的)。二、梯度图与梯度算子
2.1模板卷积
要理解梯度图的生成,就要先了解模板卷积的过程,模板卷积是模板运算的一种方式,其步骤如下:
- 将模板在输入图像中漫游,并将模板中心与图像中某个像素位置重合;
- 将模板上各个系数与模板下各对应像素的灰度相乘;
- 将所有乘积相加(为保持灰度范围,常将结果再除以模板系数之和,后面梯度算子模板和为0的话就不需要除了);
- 将上述运算结果(模板的响应输出)赋给输出图像中对应模板中心位置的像素。
其实就是现在的卷积运算干的事。2.2 梯度图
梯度图的生成和模板卷积相同,不同的是要生成梯度图,还需要在模板卷积完成后计算在点(x,y)梯度的幅值,将幅值作为像素值,这样才算完。
注意: 梯度图上每个像素点的灰度值就是梯度向量的幅度,生成梯度图需要两个模板(求图像梯度需要两个方向),右图为水平和竖直方向最简单的模板:
所以水平方向和竖直方向上的梯度为:
2.3 梯度算子
梯度算子是一阶导数算子,是水平G(x)和竖直G(y)方向对应模板的组合,也有对角线方向,即是上述卷积模板的组合。
常见的一阶算子:Roberts交叉算子, Prewitt算子, Sobel算子,下面将分别介绍。
2.3.1 Roberts交叉算子
Roberts交叉算子其本质是一个对角线方向的梯度算子,对应的水平方向和竖直方向的梯度分别为:
优点:边缘定位较准,适用于边缘明显且噪声较少的图像。
缺点:- 没有描述水平和竖直方向的灰度变化,只关注了对角线方向,容易造成遗漏。
- 鲁棒性差。由于点本身参加了梯度计算,不能有效的抑制噪声的干扰。
2.3.2 Prewitt算子
Prewitt算子是典型的3*3模板,其模板中心对应要求梯度的原图像坐标(x,y), (x,y)对应的8-邻域的像素灰度值如下表所示:
通过Prewitt算子的水平模板M(x)卷积后,对应的水平方向梯度为:
通过Prewitt算子的竖直模板M(y)卷积后,对应的竖直方向梯度为:
输出梯度图在(x,y)的灰度值为:
优点:Prewitt算子引入了类似局部平均的运算,对噪声具有平滑作用,较Roberts算子更能抑制噪声。2.3.3 Sobel算子
Sobel算子其实就是是增加了权重系数的Prewitt算子,其模板中心对应要求梯度的原图像坐标,对应的8-邻域的像素灰度值如下表所示:
通过Sobel算子的水平模板M(x)卷积后,对应的水平方向梯度为:
通过Sobel算子的竖直模板M(y)卷积后,对应的竖直方向梯度为:
输出梯度图在(x,y)的灰度值为:
优点:Sobel算子引入了类似局部加权平均的运算,对边缘的定位比要比Prewitt算子好。因为Sobel算子的效果较好,实际使用中相比于另外两种更多,所以我们只看一下Sobel算子的例子。
函数:
dst = cv2.Sobel( src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]] )
参数:
-
src:输入图像。
-
ddepth:输出图像位深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
-
dx:x导数的阶数,0表示这个方向上没有求导,一般为0、 1、 2;
-
dy:y导数的阶数,0表示这个方向上没有求导,一般为0、 1、 2;
-
ksize:Sobel算子的尺寸,必须是1,3,5或7。还可以是一个特殊值,
ksize = FILTER_SCHARR (-1)
,那么将会使用scharr算子,在x方向的算子为:
在y方向上是这个算子的转置。 -
scale:(可选)计算的导数值的比例因子;默认情况下,不应用缩放。
-
delta:(可选)在将结果存储到dst中之前添加到结果中的增量值。
看个例子:
import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('./image/girl2.png', 0) sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5) plt.subplot(1, 3, 1), plt.imshow(img, cmap = 'gray') plt.title('Original'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 3, 2), plt.imshow(sobelx, cmap = 'gray') plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 3, 3),plt.imshow(sobely, cmap = 'gray') plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) plt.show()
得到的就是该图像在x方向上和y方向上的梯度图:
从这个效果中我们也可以看出,梯度图能够突出图像中的边缘或明暗变化剧烈的地方。三、Canny边缘检测算法(代码实现)
Canny算法是先平滑后求导数的方法。 John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标:
- 好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低;
- 高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;
- 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制。
步骤:
- 彩色图像转换为灰度图像(以灰度图单通道图读入)
- 对图像进行高斯模糊(去噪)
- 计算图像梯度(这里用到了Sobel算子来计算图像梯度),根据梯度计算图像边缘幅值与角度
- 沿梯度方向进行非极大值抑制(边缘细化)
- 双阈值边缘连接处理
- 二值化图像输出结果
在OpenCV中的函数为:
edges = cv2.Canny( image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]] )
参数:
- image:输入图像,灰度图。
- threshold1:双阈值边缘连接处理的第一个阈值。
- threshold2:双阈值边缘连接处理的第二个阈值。
- apertureSize:Sobel算子的尺寸。
- L2gradient:是否使用L2正则化更精确地计算梯度,还是使用L1。
看个例子:
# 加载 opencv 和 numpy import cv2 import numpy as np # 以灰度图形式读入图像 img = cv2.imread('./image/canny.png', 0) v1 = cv2.Canny(img, 80, 150, (3, 3)) v2 = cv2.Canny(img, 50, 100, (5, 5)) # np.vstack():在竖直方向上堆叠 # np.hstack():在水平方向上平铺堆叠 ret = np.hstack((v1, v2)) cv2.imshow('img', ret) cv2.waitKey(0) cv2.destroyAllWindows()
原图如下所示:
通过canny检测得到该图的边缘信息,设置了两组参数,得到的结果分别为:
不同的参数设置可能得到不同的结果,很明显第一种参数使得检测得到的边缘信息更少更干净,而第二种得到的更多更全面,实际使用中可以自己调节。Canny检测作为传统的图像边缘提取算法,虽然效果上不如现在大火的深度学习的各种网络,但是对于一些边缘信息较为明显单一的图像来说任然有使用价值,我们将输入图像换一下:
再用Canny检测(上述代码,换一下输入图像即可),得到的结果为:
可以看到检测效果已经非常不错了,更重要的是,它不需要训练,所以速度非常的快,这是它很大的一个优点,所以现在还是会使用到Canny检测。 -
canny算法的图像边缘提取毕业设计答辩.ppt
2020-07-26 07:27:59研究课题的必要性和意义 常见的边缘检测算法 传统的 canny 算子边缘检测 对传统算法进行改进 结论 目 录 第一章 研究课题的必要性和意义 图像边缘提取是图像处理和计算机视觉中的基本问题 是数字图像分析的前提 提 ... -
动态图像边缘提取
2018-08-31 11:06:57摄像头提取到的视频信息被处理过程中,或许需要边缘的信息提取,以进行下一步的处理 -
基于数学形态学的焊缝图像边缘提取 (2010年)
2021-05-18 10:49:23焊缝图像的边缘提取是实现焊缝视觉跟踪的一个重要环节.用抗噪膨胀腐蚀型形态学算子对单边V型坡口横...结果表明,抗噪膨胀腐蚀型算子具有非常强的抗噪性,可以有效地提取出焊缝图像边缘,更利于后续的焊缝特征点提取. -
数字图像处理课程设计(基于matlab的Hough变换检测图像边缘提取,包含完整代码)
2022-01-12 17:30:25数字图像处理课程设计,基于matlab appdesigner设计的Hough变换检测的图像边缘提取小程序基于matlab的图像Hough边缘提取
一、课程设计要求
“0-4房屋图像1.jpg”和“0-5房屋图像2.jpg”是房屋立面的图像。请利用Hough变换检测,计算获得矢量化的房屋边缘特征。
二、设计思路
首先先将彩色图片进行灰度处理,然后通过边缘检测算子,如Roberts算子,Prewitt算子,LoG算子……对目标图像边缘进行检测。
其次,用均值滤波或者中值滤波对边缘检测后的图像进行去噪处理,去掉图像上的一些影响图像边缘提取的噪点。(这里有个小问题,最好先对原图像进行滤波处理再将处理过的图像进行边缘检测,因为没时间了就不做修改了,还有算子的话最好自己再加个canny算子提取效果会更好)
接着,将图像进行二值化处理,转化为黑白图片
最后,通过Hough变换检测,将边缘描绘出来得出最终的提取效果。三、总体设计
使用matlab app进行图形界面化设计,要求能够从文件夹中读取文件并在界面上展示,设计多种边缘检测算子与滤波处理和二值化处理,能够在界面上显示处理效果。并能将最后的效果保存到指定的文件夹中。
四、代码实现
1.文件的打开与读取
打开文件夹,将内容显示在UIAxes的框框内
function ButtonPushed(app, event) [filename,filepath]=uigetfile({'*.jpg','*.png'},'选择图片'); if isequal(filename,0)||isequal(filepath,0) errordlg('没有选中的文件','错误'); else file=strcat(filepath,filename); end im=imread(file); app.originimg = im; app.gim=rgb2gray(im); app.gim = im2double(app.gim); imshow(im,'Parent',app.UIAxes); end
2.边缘检测算子的实现
①LoG算子
function log = log_margin(app,img) [m,n]=size(img); log=zeros(m,n); for i=3:m-2 for j=3:n-2 log(i,j) = -img(i-2,j)-img(i-1,j-1)-2*img(i-1,j)-img(i-1,j+1)-img(i,j+2)-2*img(i,j-1)+16*img(i,j)-2*img(i,j+1)-img(i,j+2)-img(i+1,j-1)-2*img(i+1,j)-img(i+1,j+1)-img(i+2,j); end end end
②Prewitt算子
function pre = prewitt_margin(app,f) [m,n]=size(f); pre=zeros(m,n); for i=2:m-1 for j=2:n-1 pre(i,j)=abs(f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-f(i,j+1)-f(i+1,j+1))+abs(f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)-f(i-1,j-1)-f(i-1,j)-f(i-1,j+1)); end end end
③Sobel算子
function sob = sobel_margin(app,image) [m,n]=size(image); sob=zeros(m,n); for i=2:m-1 for j=2:n-1 sob(i,j)=abs(image(i-1,j-1)+2*image(i,j-1)+image(i+1,j-1)-image(i-1,j+1)-2*image(i,j+1)-image(i+1,j+1))+abs(image(i+1,j-1)+2*image(i+1,j)+image(i+1,j+1)-image(i-1,j-1)-2*image(i-1,j)-image(i-1,j+1)); end end end
④Roberts算子
function rob = roberts_margin(app,image) [m,n]=size(image); rob=zeros(m,n); for i=2:m-1 for j=2:n-1 rob(i,j)=abs(image(i+1,j+1)-image(i,j))+abs(image(i,j+1)-image(i+1,j)); end end end
3.滤波处理算法
①均值滤波
function [smooth] = average_filter(app,image) [m,n]=size(image); smooth=zeros(m,n); for i=2:m-1 for j=2:n-1 smooth(i,j) = image(i-1,j-1)+image(i-1,j)+image(i-1,j+1)+image(i,j-1)+image(i,j)+image(i,j+1)+image(i+1,j-1)+image(i+1,j)+image(i+1,j+1); smooth(i,j) = smooth(i,j)/9; end end end
②中值滤波
function [ x2 ] = median_filter(app,image, m ) n = m; [ height, width ] = size(image); x1 = double(image); x2 = x1; for i = 1: height-n+1 for j = 1:width-n+1 mb = x1( i:(i+n-1), j:(j+n-1) ); mb = mb(:); mm = median(mb); x2( i+(n-1)/2, j+(n-1)/2 ) = mm; end end end
4.图像二值化处理
function [binary_img] = binary(app,image,T) binary_img = im2uint8(image);% 将均值滤波后的图像转换为uint8类型图像,即图像色彩范围[0,255] [m,n]=size(binary_img); for i=1:m for j=1:n if binary_img(i,j)>T % 设置二值化的阈值 binary_img(i,j) = 255;% 超过阈值的设为白点 else binary_img(i,j) = 0;%小于阈值的设为黑点 end end end end
5.Hough变换检测
function [origin_img] = hough_tram(app,binary_img,origin_img,T) angle = 180; [m,n]=size(binary_img); distance = round(sqrt(m^2+n^2)); number_ap = zeros(angle,2*distance); coordinate = cell(angle,2*distance); for i = 1:m for j = 1:n if(binary_img(i,j) == 255) for k = 1:angle p = round(i*cos(pi*k/180)+j*sin(pi*k/180)); if(p > 0) number_ap(k,distance+p) = number_ap(k,distance+p)+1; coordinate{k,distance+p} = [coordinate{k,distance+p},[i,j]]; else ap = abs(p)+1; number_ap(k,ap) = number_ap(k,ap)+1; coordinate{k,ap} = [coordinate{k,ap},[i,j]]; end end end end end for i = 1:angle for j = 1:distance*2 if(number_ap(i,j)>T)%提取直线的阈值 point = coordinate{i,j};%提取对应点坐标 [m,n] = size(point); for k = 1:number_ap(i,j) origin_img(point(2*k-1),point(2*k),1) = 0; origin_img(point(2*k-1),point(2*k),2) = 255; origin_img(point(2*k-1),point(2*k),3) = 0; end end end end end
6.文件的保存
function reserve(app,image,sz) path = 'F:/matlab/work/hough transform/'; prefix = 'hough_'; format = 'jpg'; suffix = strcat('.',format); imwrite(image,strcat(path,prefix,num2str(sz),suffix)); msgbox('图像保存成功'); end
五、运行结果展示
1.主界面
2.边缘检测
3.噪声处理
4.二值化处理
5.边缘提取
6.效果对比
原图:(边缘不平整)
处理图:
原图:(边缘平整)
处理图:
六、分析与总结
图像的Hough变换是一种图像特征提取的技术,通过投票法检测特定形状并提取,其方法是在参数空间中通过投票累加获得局部最大值,从而通过值得到符合特定形状的集合,该集合即为Hough变换结果。
在Hough变换中,主要是利用图像的特殊形状,按照指定的函数进行参数空间点的累加,每取到函数形状上的点则进行投票累加,最后通过参数限制获得需要统计的点并组成点的集合,此时即可得到最终的边界点。Hough变换多用于对直线、圆、椭圆形状的检测和提取。Hough变换算法适用于所有能够用方程表达出的图像特征,而其算法的复杂度也随着图像特征方程的复杂度变化。
根据检测结果可以总结出以下几点。
(一)Hough变换是通过函数拟合来完成边缘选择的,对于具有单一颜色、简单边缘以及已知函数的图像而言,Hough变换能够更好地选择边缘,例如上图的小车;
(二)Hough变换不适合用于复杂颜色、复杂边缘的图像,例如上图的房屋,这种图像都不适合进行函数拟合,Hough变换会使得最终的效果较差。参考文献:
【1】CSDN博客 无限遐想计划 https://blog.csdn.net/qq_43571150/article/details/103544472
【2】数字图像处理(MATLAB版))第二版 冈萨雷斯 -
论文研究-一种新的保留细节信息的噪声图像边缘提取算法.pdf
2019-07-22 20:31:17一种用于噪声图像边缘提取的算法首先对噪声图像进行小尺度高斯滤波,使用新型边缘检测算子获取引导信息(边缘检测算子在定位精度、抑制噪声和虚假边缘方面具有很好的性能),然后对各搜索轨迹进行分段自增强,最后...