-
2021-04-26 11:03:12更多相关内容
-
python Canny边缘检测算法的实现
2020-09-17 12:27:07主要介绍了python Canny边缘检测算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
边缘检测(各类边缘算子)以及角点检测 python
2020-12-21 17:05:49边缘检测: 1.Roberts算子 2.Prewitt算子 3.Sobel算子 4.Laplacian算子 5.Canny函数 代码如下: import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('lenna.jpg', cv2.IMREAD_... -
opencv之Canny边缘检测实例下载
2020-01-03 16:41:08详细讲解了Canny算法,高斯模糊,灰度转换,计算梯度,非最大信号抑制以及相关API的使用,此工程是Demo,欢迎下载学习。 -
VC++ 边缘检测源码实例 带可执行文件
2021-05-11 16:30:48摘要:VC/C++源码,图形处理,边缘检测 边缘检测VC源码,带可执行文件和所需控件,在Win7、win7SP1下完成测试,Vista SP2(未测试)、Win8(未测试),本边缘检测程序不支持XP操作系统,注意:在Windows XP系统下不能... -
Android studio opencv环境配置及边缘检测实例
2017-05-02 18:24:23Android studio opencv环境配置及边缘检测实例 -
opencv边缘检测实例
2013-09-15 15:39:40opencv的边缘检测,直方图,霍夫变换,开闭运算等实例,注释详细,必备代码 -
VC++拉普拉斯图像边缘检测锐化实例包
2021-03-15 18:25:47内容索引:VC/C++源码,图形处理,拉普拉斯,边缘检测,图像锐化 VC++中使用拉普拉斯边缘检测法对BMP位图进行锐化的实例包。VC++处理图像的时候会用到,锐化功能会使一幅图片的轮廓更清淅,看上去图片也就更清淅,但有... -
边缘检测综合示例
2018-09-22 22:32:22本示例是《OpenCV3编程入门》中7.1.6的综合示例的C# + EMGU 3.4.1版,在这个示例程序中,分别演示了canny边缘检测、sobel边缘检测、Laplacian算子,scharr滤波器的使用。 -
边缘检测_matlab边缘检测_边缘检测matlab_边缘_边缘检测
2021-09-10 19:47:33matlab边缘检测实验,matlab边缘检测实例 -
Unity相机移动之屏幕边缘检测
2020-12-20 19:21:18本文实例为大家分享了Unity相机移动之屏幕边缘检测的具体代码,供大家参考,具体内容如下 功能: 类似LOL 红警 相机移动方式。 鼠标移动到屏幕边缘,相机随之移动。 当然还有可以加亿一点点细节,比如鼠标指针变化,... -
C#边缘检测实例
2011-12-21 11:51:27边缘检测,图像处理,程序代码,好东西大家一起分享吧 -
C#图像边缘检测(Roberts)的方法
2021-01-20 07:08:08本文实例讲述了C#图像边缘检测(Roberts)的方法。分享给大家供大家参考。具体如下: //定义roberts算子函数 private static Bitmap robert(Bitmap a) { int w = a.Width; int h = a.Height; try { Bitmap ... -
C#图像处理之边缘检测(Sobel)的方法
2021-01-20 07:00:09本文实例讲述了C#图像处理之边缘检测(Sobel)的方法。分享给大家供大家参考。具体如下: //定义sobel算子函数 private static Bitmap sobel(Bitmap a) { int w = a.Width; int h = a.Height; try { Bitmap ... -
边缘检测,边缘检测算子,matlab
2021-09-10 19:47:33matlab边缘检测实验,matlab边缘检测实例 -
图像处理-基于Zernike矩的亚像素边缘检测算法-MATLAB实现.zip
2021-11-29 16:27:541. 用MATLAB实现的基于Zernike矩的亚像素边缘检测算法,有图片实例,一键运行出结果 2. 包含理论资料,在本人博客也有介绍https://betterbench.blog.csdn.net/article/details/121612652 -
1.2--1.3卷积神经网络笔记—边缘检测实例
2018-03-01 08:27:16如何在图像中检测(垂直)边缘(计算过程):左图:灰度图像6*6矩阵,(彩色图像为6*6*3,灰度图像没有RGB三通道)中间图:为检测图形垂直边缘,构建3*3矩阵,称为过滤器(或核)右图:用3*3过滤器对6*6矩阵进行卷积...一.如何在图像中检测(垂直)边缘(计算过程):
左图:灰度图像6*6矩阵,(彩色图像为6*6*3,灰度图像没有RGB三通道)
中间图:为检测图形垂直边缘,构建3*3矩阵,称为过滤器(或核)
右图:用3*3过滤器对6*6矩阵进行卷积运算,输出结果是右图的4*4矩阵,可以理解为另一张图片。
卷积的计算过程:4*4矩阵的下标为(1,1)的值如下图所示:
将3*3矩阵与6*6矩阵相应元素相乘,再相加即可。3*1+1*1+2*1+0*0+5*0+7*0+1*-1+8*-1+2*-1=-5
4*4矩阵的下标为(1,2)的值即将3*3滤波器矩阵向右移:
其他值同样对3*3滤波器矩阵进行移动 :
如果用python实现这个过程用函数:conv_forward()
二.为什么上述过程可以做垂直边缘检测?
eg1垂直边缘检测输出结果矩阵的含义:
左图:图像矩阵,【白 灰】,中间有一条垂直的(由浅到深色)过渡线
中间图:滤波器矩阵 ,可视化成:【白 灰 黑】
右图:依据上述方法卷积所得结果。如果当成图像:【灰 白 灰】(矩阵数值越大,亮度越高)
卷积所得矩阵中间是高亮区,对应所检测图像(左图)中间有垂直边缘,但维数与原图像边缘不同,(检测到的结果太粗了)原因是图片维数(6*6)太小了。
eg2垂直边缘检测滤波器表示明暗变化:
图片矩阵左右翻转,滤波矩阵不便,得到的新图片矩阵中间值变成负值(原矩阵值得相反数),上图正值表示从亮到暗过渡,下图负值表示由暗到亮过渡。如果不想要这种正负提供的信息,可以将卷积所得到的矩阵取绝对值。
eg3水平边缘检测滤波器:
在相应边缘有明暗变化 1 1 1 -1 -1 -1
eg4略复杂输入图片水平检测的例子:
卷积所得输出矩阵数值与输入矩阵的绿、黄、紫(3*3)矩阵 块相互对应,输出矩阵的30,-30分别表示由亮到暗、由暗到亮的变化;10,-10是中间值(对应3*3矩阵块没有明显边缘变化)。但是当输入图片特别大的时候,不会出现10这么大的中间值。
eg5不同的边缘检测滤波器矩阵:
sobel filter :增加中间行权重,也就是图像中间的像素点,增加结果鲁棒性
将垂直边缘滤波器旋转90,得到水平边缘滤波器
eg6 复杂图像的边缘检测:
复杂图像的滤波器不再是简单的垂直或者水平边缘检测,可以将滤波器矩阵设置为9个参数,利用深度学习的反向传播算法得到滤波器的参数。可以检测任意角度的边缘。
-
图像边缘检测器的设计与 EDA技术综合应用实例与分析 PPT课件.pptx
2021-10-29 07:00:10图像边缘检测器的设计与 EDA技术综合应用实例与分析 PPT课件.pptx -
ffmpeg实例,edgedetect边缘检测
2019-11-21 19:33:04ffmpeg edgedetect Canny边缘检测算法
ffmpeg命令目录
原图,边缘图
Detect and draw edges. The filter uses the Canny Edge Detection algorithm. 边缘检测,使用canny边缘算法 The filter accepts the following options: 滤镜接收一下参数 low high Set low and high threshold values used by the Canny thresholding algorithm. 设置Canny阈值算法使用的低阈值和高阈值。 The high threshold selects the "strong" edge pixels, which are then connected through 8-connectivity with the "weak" edge pixels selected by the low threshold. 高阈值选择“强”边缘像素,然后通过8-连通性与低阈值选择的“弱”边缘像素连接 四连通区域是11011其中0代表中心点,4个1代表上下左右四个方向。 八连通区域是111101111也就是除了上下左右四个方向外,还有左上、右上、左下、右下。 low and high threshold values must be chosen in the range [0,1], and low should be lesser or equal to high. 必须在[0,1]范围内选择低阈值和高阈值,低阈值应小于或等于高阈值。 Default value for low is 20/255, and default value for high is 50/255. “低”的默认值为20/255,“高”的默认值为50/255 mode Define the drawing mode. 定义绘图模式 ‘wires’ Draw white/gray wires on black background. 如上图,黑白 ‘colormix’ Mix the colors to create a paint/cartoon effect. 最后生成图,类似油画效果,卡通效果 ‘canny’ Apply Canny edge detector on all selected planes. Default value is wires. planes Select planes for filtering. By default all available planes are filtered.
-
cuda 编程--图像边缘检测的实现.docx
2020-12-22 18:08:18cuda 编程--图像边缘检测的实现 -
图像边缘检测器的设计与EDA技术综合应用实例与分析谭会生学习教案.pptx
2021-11-06 08:43:55图像边缘检测器的设计与EDA技术综合应用实例与分析谭会生学习教案.pptx -
sobel算子 边缘检测
2015-09-25 23:18:28详细讲解sobel算子的原理,有程序与实例图像,sobel算子是边缘检测的基本算子之一。 -
基于Matlab的图像分割----边缘检测
2020-12-15 20:34:35在一幅图像中,人们往往只对其中的某些目标感兴趣,而这些目标通常占据一定的区域,并且在某些特性上(如灰度,轮廓,颜色及纹理等)上和周围的图像有差别。这些差别可能很明显也可能很微小,随着计算机图像处理技术...在一幅图像中,人们往往只对其中的某些目标感兴趣,而这些目标通常占据一定的区域,并且在某些特性上(如灰度,轮廓,颜色及纹理等)上和周围的图像有差别。这些差别可能很明显也可能很微小,随着计算机图像处理技术的发展,使得人们可以通过计算机来对图像进行某些方面的处理。其中,生活中最常见的就是图像识别技术(面部识别,指纹识别等),而图像识别的基础就是图像分割。所以讲,图像分割是后续高级图像处理学习的基础。
1.图像分割的基本知识
图像分割,就是图像中反应物体真实情况的,占据不同区域的,具有不同特性的目标区分开来,并形成数字特征。在现实生活的不同领域内,图像分割有着不同的叫法,但其核心是相同的。
1.1图像分割简单定义
(1)定义
图像分割是指将一幅图像分解为若干互不交叠的,有意义的,具有相同性质的区域。
(2)优秀的图像分割应具有的特点a.分割出来的各区域对某种特性(比如灰度)而言具有相似性,区域的内部是连通的,且没有过多小孔;
b.相邻区域对分割所依据的性质有明显的差异;
c.区域的边界是明显的。在实际的区域分割算法中,只能寻求较为满足上述特点的方法。因为,若是过于强调同一区域内性质一致性,则分割区域会产生很多小孔和一些不规整的边界;若是过于强调相邻区域显著的差异,则有很多分割区域就会合并到一起。所以,不同的分割技术总是在各种特点中寻求一种平衡。
(3)图像分割算法的共性
图像分割是图像处理和计算机视觉方便的经典难题,至今没有统一的标准进行评判,因此每年都会涌现出很多分割技术。然而,它们大多数遵循图像在像素级的两个性质:相似性和不连续性。属于同一目标的区域具有相似性,属于不同目标的区域在边界出现不连续性。
2.边缘检测
人们可能最先研究的就是基于边缘的图像分割方法,基于在图像的边缘灰度变化的往往比较剧烈,它试图通过检测图像中不同区域的边缘来实现对图像的分割。
2.1边缘检测概述
(1)概述
边缘检测技术非常重要,因为边缘时所要提取目标与背景的分界线,提取出边缘才能将目标与背景分隔开。
在图像中,边缘往往表征一个特征区域的终结和另一个特征区域的开始,边界所分开区域的内部特征或属性是一致的,而不同区域内部的特征或属性是不同的,边缘检测正是利用物体和背景在某种图像特征上的差异来实现的,这些差异包括灰度,颜色,纹理等。
边缘检测的实质就是检测图像特性发生变化的位置。
(2)基本内容由于图像中噪音和模糊的存在,检测的边界很可能变宽或在某些点发生间断。因此,边缘检测包括两大基本内容:
**a.**抽取出反映灰度变化的边缘点;
**b.**剔除某些边界点或填补边缘间断点,并将这些边缘连接成线。
(3)边缘的基本知识a.边缘
是指图像中像素灰度有阶跃变化或屋顶状变化的那些像素的集合。
b.边缘分类1.阶跃状边缘:阶跃状边缘位于两边的像素灰度值有明显不同的地方(跳变后保持不变);
2. 屋顶状边缘:屋顶状边缘位于灰度值从增加到减少的转折处(跳变后又恢复原状)。
阶跃状和屋顶状边缘其邻近灰度方向导数变化情况,见下图:2.2常见边缘检测算子
边缘检测算法中,通过边缘检测算子来检测图像的边缘是最为简单,也是最为经典的边缘检测方法。其基本思想是通过考察图像的每个像素点在某个邻域内灰度的变化,利用边缘邻近的一阶或二阶导数变化规律来判断该像素是否在图像区域的边界上。
2.2.1梯度算子检测边缘
最为简单的边缘检测算子就是梯度边缘算子,掌握了其边缘检测的方法,余下较复杂的边缘检测方法便能迎刃而解了。下面着重介绍利用梯度边缘算子检测边缘的算法。
(1)梯度定义式及简化计算
函数f(x,y)在(x,y)处的梯度为一个向量:
计算这一向量的大小:
模板表示:
(2)检测边缘点步骤- 计算梯度图像;
2)选取适当的阈值T,对梯度图像进行二值化;
当Grad[f (x,y)]≥T时,令f (x,y)=l,则为阶跃状边缘点。否则f (x,y)=0,形成一幅边缘二值图像。
(3)举例源代码:
%1.边缘检测 %(1)梯度算子法 mImg = imread('rice.png'); if size(mImg,3)>1%判读入图像是否为灰度图,不是,则转化成灰度图 mImg = rgb2gray(mImg); end mImg = im2double(mImg); mBlock = [-1 1];%梯度算子 mImgDy = imfilter(mImg, mBlock, 'replicate');%滤波函数imfilter mImgDx = imfilter(mImg, mBlock','replicate'); mImgDxy = sqrt(mImgDy.*mImgDy+mImgDx.*mImgDx); figure; subplot(221), imshow(mImg),title('灰度图'); subplot(222), imshow(mat2gray(abs(mImgDy))),title('横向偏导后图像'); subplot(223), imshow(mat2gray(abs(mImgDx))),title('纵向偏导后图像'); subplot(224), imshow(mat2gray(mImgDxy)),title('梯度图'); vThred = 0.3;%设定阈值 mImgDxy = mat2gray(mImgDxy);%根据阈值将灰度图转化成二值图像,以便更好地体现出边缘 mImgDxy(mImgDxy<vThred) = 0; mImgDxy(mImgDxy>=vThred) = 1; mImgDxy = bwmorph(mImgDxy, 'thin'); figure,imshow(mImgDxy),title('二值图像');
其中,若对函数imfilter有兴趣,请参见imfilter函数详解。
运行结果:
(3)效果分析梯度算子仅用最近邻像素的灰度计算,对噪声敏感,无法抑制噪声的影响。
2.2.2其他边缘检测算子
其他常见的边缘检测算子还有:罗伯特(Roberts)边缘算子,索贝尔(Sobel)边缘算子,Prewitt边缘算子,拉普拉斯(Laplacian)边缘算子,方向(Kirsch)算子,坎尼(Canny)边缘算子。
(1)Roberts边缘算子
Roberts边缘算子是一种斜向偏差分的梯度计算方法,梯度的大小代表边缘的强度,梯度的方向和边缘走向垂直。
a.差分表达式
b.模板表示
c.Roberts近似计算d.处理效果
Roberts边缘算子也不能很好的消除噪声的影响,但效果还是较梯度好。
(2)Prewitt边缘算子
a.算子思想
在检测边缘的同时减少噪声的影响,Prewitt从加大边缘检测算子的模板大小出发,由2×2扩大到3×3来计算差分算子。
b.模板表示
c.处理效果Prewitt算子检测边缘点的同时能抑制噪声的影响。
(3)Sobel边缘算子
a.算子思想
Sobel在Prewitt算子的基础上,对4—邻域采用带权的方法计算差分。
b.模板表示
c.处理效果Sobel算子检测边缘点的同时能进一步抑制噪声的影响,但检测的边缘较宽。
d.举例
源代码:
%(2)sobel边缘算子 mImg = imread('rice.png'); if size(mImg,3)>1 mImg = rgb2gray(mImg); end mImg = im2double(mImg); mBlock = fspecial('sobel'); mImgDy = imfilter(mImg, mBlock, 'replicate'); mImgDx = imfilter(mImg, mBlock','replicate'); mImgDxy = sqrt(mImgDy.*mImgDy+mImgDx.*mImgDx); figure; subplot(121), imshow(mImg),title('灰度图'); subplot(122), imshow(mat2gray(mImgDxy)),title('sobel梯度图');
运行结果:
(4)Kirsch边缘算子a.算子思想
利用一组模板分贝计算不同方向的差分值,取其中的最大值作为边缘强度,而将与之对应的方向作为边缘方向。
b.模板表示
Kirsch(3×3)八方向模板:各方向间的夹角为45°,见下图。
(5)Laplacian边缘算子
a.算子定义
二维函数的拉普拉斯变换是一个二阶的微分定义:
其差分形式有很多种表示形式,最常见的是:b.模板表示
拉普拉斯算子对应的模板形式要求,作用于中心像素的系数是一个正数,而且其周围像素的系数为负数,系数之和必为0。举例如下:
c.处理效果
优点 :各向同性,对细线和孤立点检测效果好(可以理解一下)。
缺点:对噪音敏感,会产生双像素的边缘,不能检测出边的方向。
适用场合:拉普拉斯算子不直接用于边的检测,通常只起第二位的角色。即检测一个像素是在边的亮的一边还是暗的一边;利用零跨越,确定边的位置。
注意事项:由于Laplacian算子和梯度算子一样都对噪声比较敏感,且Laplacian算子对噪声还有加强的作用,因此在实际的图像边缘检测中常常需要将待检测的图像先进行平滑除噪。
d.实例
源代码:
%(4)Laplacian算子边缘检测 mImg = imread('rice.png'); if size(mImg,3)>1 mImg = rgb2gray(mImg); end mImg = im2double(mImg); mImg = medfilt2(mImg,[5 5]);%中值滤波 mBlock = fspecial('laplacian')/8; mImgDxy = imfilter(mImg, mBlock,'replicate'); mImgDxy = abs(mImgDxy); subplot(121),imshow(mImg),title('灰度图'); subplot(122),imshow(mat2gray(mImgDxy)),title('Laplacian算子检测后的图像');
运行结果:
(6)Canny边缘算子
坎尼(Canny)算子检测法是一类比较成熟的边缘检测算子法中完善的边缘检测方法,因此,在实际的边缘检测实例中,坎尼算子检测方法是很常见的。
a.基本思想
先对图像选择一定的高斯滤波器进行平滑滤波,抑制图像中的噪声;然后求取梯度图像;接着采用一种“非极大值抑制”的技术,细化边缘;最后利用双门限制用两个阈值递归寻找边缘点,以实现边缘检测。
b.一般步骤
- 对图像进行高斯滤波平滑;
- 求取梯度图像;
- 对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非局部极大值点置零以得到细化的边缘;
- 滞后阈值化:使用两个阈值T1和T2(T1>T2),使得噪声造成的中断可以被连接。
c.独有特点
Canny算子与其他算子最大的不同体现在,其分别采用了两个不同的阈值对图像中的强边缘和弱边缘进行检测,并且当且仅当弱边缘和强边缘有连接时,才在最后的检测结果中将弱边缘显示出来。
d.Canny检测实例图片
2.3边缘检测函数介绍
在Matlab图像处理的工具箱中,edge函数提供了部分检测边缘的算法,详细参见Matlab中edge函数使用方法或者在matlab中查看帮助文档。
3.区域分割
一幅图像中属于同一区域的像素应具有相同的或相似的属性,不同区域的像素属性不同。因此,区域分割就是把相同属性归属同一区域的过程。
3.1阈值分割
当只利用一个属性进行分割时,区域分割就变成确定属性的阈值的问题。在数字图像处理中, 我们把只具有两类区域的图像称为最简单图像。
3.1.1阈值分割的定义
1.数学定义
设原始图像f(x,y),按照一定规则确定了一组阈值T1,T2,T3…Tn,其中n >= 1,将原始图像分割成几部分,分割过后的图像为:
2.阈值的类型
一般情况下,阈值运算可以看成针对图像中某一像素点的灰度,该点的某种局部特征以及该点的位置的一种函数,这种阈值函数可以表示为:
T(x,y,N(x,y),f(x,y))
其中,f(x,y)是该点的灰度值,N(x,y)是该点的局部邻域特征。根据对T的不同约束程度,可得到三种阈值:(1)全局阈值:T = T(f(x,y)),即阈值只与点的灰度有关;
(2)局部阈值:T = T(N(x,y),f(x,y)),即阈值和点的灰度和局部邻域特征有关;
(3)动态阈值:T = T(x,y,N(x,y),f(x,y)),即阈值和点的位置,灰度值以及局部邻域特征都有关系。3.阈值分割类型和假设
a.类型
根据选择阈值个数进行划分,阈值分割可分为单阈值分割与多阈值分割。
b.阈值分割的基本假设
全局阈值分割后的同一区域内相邻像素间灰度值应具有相似性,不同目标区域的像素间的灰度应有明显的差异,反映在直方图上就是不同的区域对应着不同的峰。
3.1.2人工阈值选择方法
阈值分割实现简单,但如何去选择合适的阈值这对最终的处理效果影响很大。其中最简单的就是人工选择法,即人通过自己的观察,在分析直方图的基础上,去选择较为合适的阈值。
下面有两种基于对最简单图像阈值分割的人工判断策略:
(1)状态法(峰谷法)
(2)判断分析法3.1.3自动阈值选择方法
虽然人工法可以选择出令人满意的阈值,但是在无人为介入如选择合适的阈值是在很多应用中所需要的,为此这里简单介绍几种自动选择阈值的方法,迭代式阈值选择,Otsu法阈值选择法,最小误差阈值选择法。
3.1.4综合举例
源代码:
%2.区域分割---阈值分割 %(1)综合举例 image = imread('peppers.png'); image = rgb2gray(image); image = im2double(image); %类型转换 %全局阈值 Th = 0.5 * (min(image(:)) + max(image(:))); done = false; while ~done %迭代处理 indc = image >= Th; %indc为索引值 Tn = 0.5 * (mean(image(indc)) + mean(image(~indc)));%Tn为迭代阈值 done = abs(Th - Tn) < 0.1; Th = Tn; end display('Threshold(Th)---Iterative');%在命令窗口显示文字 iterative(迭代) Th image1 = im2bw(image,Th);%根据阈值Th将图像转化为二值图像 subplot(221),imshow(image),title('Original image'); subplot(222),imshow(image1),title('Global interative processing image'); Ts = graythresh(image);%Global image threshold using Otsu's method display('Threshold(Ts)---Otsu method '); Ts image2 = im2bw(image,Ts); subplot(223),imshow(image2),title('Global Otsu method processing image'); se = strel('disk',10);%生成形态结构元素 image3 = imtophat(image,se);%顶帽过滤 Tl = graythresh(image3);%生成局部阈值Tl display('Threshold(Tl)---Local thresholding'); Tl image4 = im2bw(image,Tl); subplot(224),imshow(image4),title('Global local threshold processing image');
运行结果:
figure窗口:
命令行窗口:
3.2分水岭算法
3.2.1基本思想
分水岭算法是一种借鉴了形态学图像处理的算法,在该方法中,将图像看成一个拓扑地形图,其中灰度值f(x,y)对应地形高度图。高灰度值对应着山峰,地灰度值对应着山谷。水总是朝地势低的地方流动,直到在某一局部低洼处才会停下来,此低洼处称作吸水盆地,最终水会分聚在不同的吸水盆地中,吸水盆地之间的山脊就叫做分水岭。水从分水岭流过时,它朝不同的吸水盆地流向的可能性是相同的。于是,将这种思想应用到图像分割中,就是要在灰度图像中找到不同的“吸水盆地”和“分水岭”,而这些分水岭和吸水盆地就组成了我们要分割得到的区域。
在Matlab中,提供了函数**watershed**可用于显示分水岭算法。
3.2.2应用举例
下面通过一个简单的例子直观感受一下,分水岭算法的处理效果。
例子:使用距离变换和分水岭算法实现对图像分割
源代码:
%3.分水岭算法实现图像分割 %(1)分水岭算法 f = imread('peppers.png'); bw = im2bw(f,graythresh(f));%转化成二值图像 bwc = ~bw;%图像反色 dst = bwdist(bwc);%二值图像距离变换 % 计算二值图像BW的欧氏距离变换。对于BW中的每个像素,距离变换指定一个数字 % 即该像素与BW中最近的非零像素之间的距离。 ws = watershed(-dst); w = ws==0; rf = bw&~w; figure; subplot(221),imshow(f),title('原图像'); subplot(222),imshow(bw),title('二值图像'); subplot(224),imshow(rf),title('距离变换与二值图像结合图'); subplot(223),imshow(ws),title('分水岭距离变换的图像'); subplot(224),imshow(rf),title('距离变换与二值图像结合图'); h = fspecial('sobel');%生成sobel滤波模板 fd = im2double(f);%类型转换 sq = sqrt(imfilter(fd,h,'replicate').^2 + imfilter(fd,h','replicate').^2);%求取sobel梯度模板处理后的梯度幅值 sqoc = imclose(imopen(sq,ones(3,3)),ones(3,3));%图像闭合运算 wsd = watershed(sqoc); wg = wsd == 0; rfg = f; rfg(wg) = 255; figure; subplot(221),imshow(wsd),title('分水岭梯度图'); subplot(222),imshow(rf),title('距离变换与二值图像结合图'); im = imextendedmin(f,20);%扩展极小值变换,输出是二值图像 Lim = watershed(bwdist(im)); subplot(223),imshow(Lim),title('分水岭标记控制'); em = Lim == 0; rfmin = imimposemin(sq,im|em); % I2=imimposemin(I,BW)使用形态学重建来修改强度图像I,因此它只有当BW % 不为零时的区域最小值。BW是一个与I大小相同的二进制图像。 wsdmin = watershed(rfmin); subplot(224),imshow(rfmin),title('分水岭梯度与标记控制结合图'); rfgm = f; rfgm(wsdmin == 0) = 255; figure; imshow(rfgm),title('分水岭算法处理过后分割的图像');
运行结果:
相关函数补充:1.分水岭算法函数:watershed;
2.二值图像距离变换函数:bwdist;
3.形态学处理函数:imclose与imopen;
4.扩展极小值变换函数:imextendedmin;
5.形态重构修改强度图像函数:imimposemin.4.区域增长
4.1基本思想
区域增长是从图像的一个像元或一个邻域出发,比较相邻部分的特征,按照事先定义好了的相似原则不断合并直到不能合并为止的分割方法。也称作区域扩张。
区域增长处理的基本任务:
1)确定区域的数目;
2)选择有判断意义的特征;
3)确定相似性准则。其中,确定相似性准则最为重要。
4.2常见增长算法
根据邻域性质和相似性准则的不同,常见的区域增长算法可分为:
1)单一型区域增长-------------像素与像素;
2)质心型区域增长-------------像素与区域;
3)混合型区域增长-------------区域与区域。
下面详细介绍这三种策略:
1.单一型区域增长
单一型区域增长是像素级的区域增长,又称为简单图像扩张法,详细参见如下:
上图的例子中,选择起始灰度值为‘9’的像素点,与它周围的像素点进行比较,若灰度差值小于设定的阈值T = 1.5,这将该相邻像素点的灰度值设为‘9’,反之,不变,以此类推,扫描整个图像区域。处理特点:方法简单,但如果区域之间的边缘灰度变化很平缓时,两个区域会合并起来(致命缺点)。
2.质心型区域增长
质心型增长则略微改善了简单区域扩张法,它是使用已存在区域的像素灰度平均值与邻像素灰度值进行比较。其它步骤与上述相同。
缺点:区域增长的结果非常依赖起始像素点,当起始像素点不同时,区域增长的结果会有很大差异。
3.混合型区域增长
a.基本思想
将图像分成若干小块,根据相似准则比较每一小块,若它们之间满足相似性条件,则合并到一块。
b.处理步骤
1)设灰度差的阈值为0,用单一型增长合并像素,得到初始分割图像(简单分块处理);
2)从一个小区域开始,比较相邻区域的灰度差,将最小的相邻区域合并(比较合并);
3)重复步骤2。
c.特点
- 优点:不依赖于起点;
- 缺点:必须指定合并次数,否则整幅图像将被合并。
d.常用的相似性判断准则
根据区域内的灰度分布相似性进行合并。
步骤:
注:上图直方图为累积直方图。 -
图像处理(7) : 边缘检测
2021-05-26 16:11:33边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域,在一维空间中,类似的操作被称作步长检测(step detection... -
Halcon表面划伤检测实例
2014-05-12 09:22:51Halcon表面划伤检测实例,机器视觉图像处理检验塑料表面划伤。 -
OpenCV基础(11)基于OpenCV的边缘检测
2021-09-24 10:57:13边缘检测是一种图像处理技术,用于识别图像中目标或区域的边界(边缘)。边缘是图像中最重要的特征之一。我们通过图像的边缘来了解图像的基本结构。因此,计算机视觉处理管道在应用中广泛地使用边缘检测。 1.如何检测... -
灰度自适应边缘检测在煤矸石分选中的应用
2020-07-06 01:05:55针对煤和矸石灰度的不同,本文介绍了一种基于灰度的自适应边缘检测法,首先对图像进行灰度增强预处理,然后采用迭代算法求出图像分割的最佳阈值,结合形态学的腐蚀算法从而实现图像的精确边缘检测,并给出了仿真实例。... -
【图像边缘检测】基于matlab GUI神经网络算法边缘检测(带面板)【含Matlab源码 1346期】
2021-04-17 19:04:01神经网络是所谓深度学习的一个基础,也是必备的知识点,他是以人脑中的神经网络作为启发,最著名的算法就是backpropagation算法,这里就简单的整理一下神经网络相关参数,和计算方法。 1 多层向前神经网络... -
基于FPGA的Sobel边缘检测应用
2020-10-20 17:40:01针对目前数字图像处理速度慢的问题, 提出了一种基于 FPGA器件的 Sobel 边缘检测实现方案。Sobel 边缘检测分别在FPGA和MATLAB上仿真实现,仿真结果表明,该...最后列举了一个基于FPGA器件的Sobel边缘检测的应用实例。 -
,TI DSP DM642下对图像做拉普拉斯边缘检测的使用实例
2012-05-20 10:28:23TI DSP DM642下对图像做拉普拉斯边缘检测的使用实例,有很强的参考价值