2019-04-21 18:25:59 Aoman_Hao 阅读数 238

边缘检测:
https://blog.csdn.net/tigerda/article/details/61192943

常见边缘检测算子:Roberts 、Sobel 、Prewitt、Laplacian、Log/Marr、Canny、Kirsch、Nevitia

一阶微分算子:Roberts 、Sobel 、Prewitt

模板:
Roberts  
|1, 0|
|0,-1|

sobel算子
|1, 0 , 1|
|1, 0 , 1|
|1, 0 , 1|

prewitt算子
|1, 0 , 1|
|1, 0 , 1|
|1, 0 , 1|

Sobel各向同性算子:

   |-1  ,0,  1|     |-1,-跟2,-1|
Gx=|-跟2,0,跟2| ,Gx=| 0,   0, 0|
   |-1  ,0,  1|     | 1, 跟2, 1|

Sobel各向同性算子的权值比普通Sobel算子的权值更准确。为什么?模板的权值是离中心位置越远则权值(看绝对值)影响越小

计算边缘幅值与方向?以Sobel算子为例。3*3Sobel两个方向的算子在图像上滑动,模板与其覆盖的图像3*3区域9个像素进行卷积,求和后得到此方向的边缘检测幅值。

   |-1,0,1|            |-1,-2,-1|
Gx=|-2,0,2|*f(x,y) ,Gx=| 0, 0, 0|*f(x,y)
   |-1,0,1|            | 1, 2, 1|

G^2=Gx^2+Gy^2

P=arctan(Gx/Gy)

f(x,y)为图像,Gx和Gy分别是水平和竖直方向算子的卷积结果,G则是最终得到的边缘幅值,θ值则是边缘方向。当然G的计算有时简化为
G=|Gx|+|Gy| 或者 G=max(|Gx|,|Gy|)

二阶微分算子:Laplacian、Log/Marr

Laplacian算子
   |-1,-1,-1|      
Gx=|-1, 8,-1|
   |-1,-1,-1|

   | 0,-1, 0|      
Gx=|-1, 4,-1|
   | 0,-1, 0|

   |-2,-4,-4,-4,-2|
   |-4, 0, 8, 0,-4|      
Gx=|-4, 8,24, 8,-4|
   |-4, 0, 8, 0,-4|
   |-2,-4,-4,-4,-2|
Log边缘检测则是先进行高斯滤波再进行拉普拉斯算子检测

非微分边缘检测算子:Canny

算 子 优缺点比较
Roberts 对具有陡峭的低噪声的图像处理效果较好,但利用 Roberts算子提取边缘的结果是边缘比较粗,因此边缘定位不是很准确。
Sobel 对灰度渐变和噪声较多的图像处理效果比较好, Sobel算子对边缘定位比较准确。
Kirsch 对灰度渐变和噪声较多的图像处理效果较好。
Prewitt 对灰度渐变和噪声较多的图像处理效果较好。
aplacian 对图像中的阶跃性边缘点定位准确,对噪声非常敏感,丢失一部分边缘的方向信息,造成一些不连续的检测边缘。
LoG 算 子 经 常 出 现 双 边 缘 像 素 边 界 , 而 且 该 检 测 方 法 对 噪 声 比铰 敏 感 , 所 以 很 少 用 LoG算 子 检 测 边 缘 , 而 是 用 来 判 断 边 缘 像素是位于图像的明区还是暗区。
Canny 此方法不容易受噪声的干扰,能够检测到真正的弱边缘。在edge函数中,最有效的边缘检测方法是 Canny方法。该方法的优点在于使用两种不同的阈值分别检测强边缘和弱边缘,并且汉当弱边缘与强边缘相连时,才将弱边缘包含在输出图像中。因此,这种方法不容易被噪声“填充”,跟容易检测出真正的弱边缘。
2017-09-22 19:41:43 u011271038 阅读数 522

简介

边缘检测是图像处理中使用频率很高的方法,在进行更复杂的图像处理之前,我们常常先对图像进行边缘检测,以去除图像一些无用的部分,并保留一些对我们有用的部分。

原理

边缘检测意在检测出图像的边缘,那何为边缘?简单的理解是,边缘是图像中明暗变化剧烈的地方。如果从图像的x轴方向抽出一列数据,绘出它的图像,并假设是连续的曲线,则曲线陡升或陡降出就代表边缘。从数学角度看,陡升或陡降意味着该处的斜率比较大。反过来说,斜率大的地方意味着是边缘。而斜率是曲线在该点的导数,因此求边缘的问题可以转换成求导数。
导数往往指二维平面上的曲线变化率,而图像实际是三维空间的。图像的长(x轴),宽(y轴),像素值(z轴)所组成的三维,像素值组成了一个曲面。对曲面在x轴方向求导数,叫做x方向的偏导数,同样的,也存在y方向的偏导数。而有x,y轴所围成的平面有无数个方向,所以存在无数个方向的导数,我们可以通过x,y方向的偏导数求得任意方向的导数。在这些方向的导数中,存在某一个方向,且该方向导数值最大,这个导数称作曲面在该点的梯度。
图像在该点的梯度意味着在该点的某方向灰度值变化最快,这就意味着边缘的存在。
我们用这里写图片描述代表曲面上a点的梯度。这里写图片描述为曲面上a点的方向导数,u代表方向。
则有这里写图片描述,当方向指向梯度方向(梯度方向用m表示)时,这里写图片描述
所以检测图像的边缘问题变成了求图像梯度。由梯度的数学求法可知,这里写图片描述

梯度算子

在计算机中我们常常用差分代替微分,用求和代替求平方,上式子可以简化为:
这里写图片描述其中,
这里写图片描述
这里写图片描述
对应的模板为:
这里写图片描述这里写图片描述

Roberts算子

该算子是另一种近似求梯度法。对应模板为:
这里写图片描述这里写图片描述

Prewitt算子

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

Sobel算子

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

这几个算子比较简单,下面看一下Sobel算子检测的结果:
这里写图片描述
这里写图片描述

canny检测

经上面几个算子处理后的图像,已经检测出了边缘,不过边缘显得有些模糊。下面简单说说canny算法:
1)用高斯平滑处理
2)算出梯度和梯度方向
3)对梯度值进行非极大值抑制
4)用双阈值算法检测和连接边缘
下面看看效果
这里写图片描述
这里写图片描述
网上谈canny算法的文章很多,不过大多是用opencv,这对我们从根本上理解该算法并无多大帮助,十分想用c/c++实现canny算法,但限于我的能力和时间,并没有完全实现canny,倒是实现了一小部分。

也许也不能称之为我的这个算法是未完成的canny,因为这是按照我的理解写的,也许并不符合canny的本意。但是先看看我的处理结果:
这里写图片描述

再来对比一下sobel算法的结果:
这里写图片描述

我的算法比canny保留了更多细节,同时比sobel的算法更加突出细节。这种结果对寻找图像中的小细节十分合适。

这里写图片描述

这里写图片描述

2018-06-02 09:54:01 saltriver 阅读数 6423

我们先看几幅简单的图像:
这里写图片描述

这3幅图像,都只有极其简单的线条,组成了物体的轮廓,我们“人”一看就知道是什么物体。也就是说,我们人类视觉通过物体边缘就能够做到识别物体。因此,物体边缘是图像中最基本也是最重要的特征,图像识别、理解的第一步就是边缘检测。

那么,什么是边缘呢?很遗憾,尽管边缘在图像处理中有着极其重要的作用,但好像并没有严格精确的定义。一般认为:两个具有不同灰度的均匀图像区域的边界称为边缘。沿边缘方向的灰度变化比较平缓,而边缘法线方向的灰度变化比较剧烈。

对于边缘检测,我们并不陌生,在前面的文章中,提到了图像的一阶微分和二阶微分。当时是用一阶微分和二阶微分来增强图像。但是,本质上,一阶微分和二阶微分计算的就是灰度的变化情况。而边缘恰恰也就是灰度变化的地方。

因此,这些传统的一阶微分算子如Robert、Sobel、prewitt等,以及二阶微分算子Laplacian等等本质上都是可以用于检测边缘的。这些算子都可以称为边缘检测算子。

我们动手感受下几个边缘检测算子的效果:

import cv2
lenna = cv2.imread("images\\lenna.png", 0)
sobel = cv2.Sobel(lenna, -1, 1, 1, ksize=5)
laplacian = cv2.Laplacian(lenna, -1)
canny = cv2.Canny(lenna, 100, 200)
cv2.imshow("sobel", sobel)
cv2.imshow("laplacian", laplacian)
cv2.imshow("canny", canny)
cv2.waitKey()

这里写图片描述

这里写图片描述
当然,sobel和laplacian只能算做是一种边缘检测算子,还算不上是一种边缘检测算法。canny与它们的区别在于,它是一个包含多个阶段的算法。

我们用上面的代码再看看有噪声的情况。
这里写图片描述

这里写图片描述

可以看出,当有噪声的时候,效果都很差。当然,这里都没有事先进行图像降噪。

2016-03-27 16:59:46 chongshangyunxiao321 阅读数 9801

在图像识别中,需要有边缘鲜明的图像,即图像锐化。图像锐化的目的是为了突出图像的边缘信息,加强图像的轮廓特征,以便于人眼的观察和机器识别。
在空间域进行图像锐化主要有以下几种方法:
1、梯度算子
图像的边缘最直观的表现就是边缘两侧的灰度值相差比较大,在微积分中我们学过梯度的概念

梯度是一个列向量,可表示为:这里写图片描述
而某点处梯度的模很好的反应了该点两侧的变化大小

所以,梯度值很大的点也就代表了图像的边缘

而在实际计算中,为了降低运算量,一般用一下两种方法来代替模运算
这里写图片描述

由于数字图像处理中处理的是数字离散信号

所以,我们用差分来等同于连续信号中的微分运算

典型的梯度运算有
这里写图片描述
而另一种称为Roberts梯度的差分运算可由下来表示:
这里写图片描述

Python测试代码如下:

__author__ = 'Administrator'
import cv

def Sharp(image,flag1=0,flag2=0):
    w = image.width
    h = image.height
    size = (w,h)
    iSharp = cv.CreateImage(size,8,1)
    for i in range(h-1):
        for j in range(w-1):
            if flag2 == 0:
                x = abs(image[i,j+1]-image[i,j])
                y = abs(image[i+1,j]-image[i,j])
            else:
                x = abs(image[i+1,j+1]-image[i,j])
                y = abs(image[i+1,j]-image[i,j+1])
            if flag1 == 0:
                iSharp[i,j] = max(x,y)
            else:
                iSharp[i,j] = x+y
    return iSharp



image = cv.LoadImage('18.jpg',0)
iMaxSharp = Sharp(image)
iAddSharp = Sharp(image,1)
iRMaxSharp = Sharp(image,0,1)
iRAddSharp = Sharp(image,1,1)
cv.ShowImage('iMaxSharp',iMaxSharp)
cv.ShowImage('image',image)
cv.ShowImage('iAddSharp',iAddSharp)
cv.ShowImage('iRAddSharp',iRAddSharp)
cv.ShowImage('iRMaxSharp',iRMaxSharp)
cv.WaitKey(0)

我们来看看运行结果:
这里写图片描述这里写图片描述
这里写图片描述

2013-12-11 16:54:41 jungleli3 阅读数 2115


边缘检测和图像分割的联系:         

边缘检测后的图像是二值图像,对二值图像可以运用形态学操作来分割目标,所以边缘检测是图像分割的一个前提。但分割不一定非要用边缘检测。


图像分割:

概念:

        图像分割是将图像划分成若干个互不相交的小区域的过程,所谓小区域是某种意义下具有共同属性的像素的连通集合。
        从集合的观点看:它应该是具有如下性质的一种点集,集合R代表整个区域,对R的分割可看作将R分成N个满足以下五个条件的非空子集R1,R2,…,RN:


目的:
无论是图像处理、分析、理解与识别,其基础工作一般都建立在图像分割的基础上;
将图像中有意义的特征或者应用所需要的特征信息提取出来;
图像分割的最终结果是将图像分解成一些具有某种特征的单元,称为图像的基元;
相对于整幅图像来说,这种图像基元更容易被快速处理。


图像分割的特征:
分割出来的各区域对某种性质例如灰度,纹理而言具有相似性,区域内部是连通的的且没有过多小孔。
区域边界是明确的
相邻区域对分割所依据的性质有明显的差异

图像分割的方法:

一、基于像素灰度值的分割方法:阈值(门限)方法
二、基于区域的分割方法:通过直接确定区域间的边界来实现分割的边界方法;
三、基于边缘的分割技术:首先检测边缘像素, 再将边缘像素连接起来构成边界形成分割。


图像分割包含的内容:
边缘检测

边缘跟踪 :
从图像中一个边缘点出发,然后根据某种判别准则搜索下一个边缘点以此跟踪出目标边界。
阈值分割 :
原始图像——f(x,y)
灰度阈值——T
阈值运算得二值图像——g(x,y)
区域分割:
阈值分割法由于没有或很少考虑空间关系,使多阈值选择受到限制
于区域的分割方法可以弥补这点不足,它利用的是图像的空间性质,该方法认为分割出来的属于同一区域的像素应具有相似的性质,其概念是相当直观的。
传统的区域分割算法有区域增长法和区域分裂合并法。该类方法在没有先验知识可以利用时,对含有复杂场景或自然景物等先验知识不足的图像进行分割, 也可以取得较好的性能。但是,空间和时间开销都比较大。
区域生长法主要考虑象素及其空间邻域象素之间的关系
开始时确定一个或多个象素点作为种子,然后按某种相似性准则增长区域,逐步生成具有某种均匀性的空间区域,将相邻的具有相似性质的象素或区域归并从而逐步增长区域,直至没有可以归并的点或其它小区域为止。
区域内象素的相似性度量可以包括平均灰度值、纹理、颜色等信息。

区域生长:

主要考虑像素及其空间邻域像素之间的关系
开始时确定一个或多个像素点作为种子,然后按某种相似性准则增长区域,逐步生成具有某种均匀性的空间区域,将相邻的具有相似性质的像素或区域归并从而逐步增长区域,直至没有可以归并的点或其它小区域为止。
区域内像素的相似性度量可以包括平均灰度值、纹理、颜色等信息。
主要步骤:

选择合适的种子点
确定相似性准则(生长准则)
确定生长停止条件

区域分裂:

条件:如果区域的某些特性不满足一致性准则
开始:从图像的最大区域开始,一般情况下,是从整幅图像开始
注意:
确定分裂准则(一致性准则)
确定分裂方法,即如何分裂区域,使得分裂后的子区域的特性尽可能都满足一致性准则值


图像分割的基本原理:

图像分割是将图像划分成若干个互不相交的小区域的过程,小区域是某种意义下具有共同属性的像素的连通集合。
如不同目标物体所占的图像区域、前景所占的图像区域等;
连通是指集合中任意两个点之间都存在着完全属于该集合的连通路径;
对于离散图像而言,连通有4连通和8连通之分。

    图像分割有三种不同的途径:
    1.是将各像素划归到相应物体或区域的像素聚类方法, 即区域法;
    2.是通过直接确定区域间的边界来实现分割的边界方法;
    3.是首先检测边缘像素,再将边缘像素连接起来构成边界形成分割。
   
    在图像分割技术中,最常用的是利用阈值化处理进行的图像分割。
    在图像的阈值化处理过程中,选用不同的阈值其处理结果差异很大;
    阈值过大,会提取多余的部分;
    阈值过小,又会丢失所需的部分;
    因此,阈值的选取非常重要。


边缘检测:

         在视觉计算理论框架中,抽取二维图像上的边缘、角点、纹理等基本特征,是整个系统框架中的第一步。这些特征所组成的图称为基元图。
         在不同“尺度”意义下的边缘点,在一定条件下包含了原图像的全部信息。
定义:
目前,具有对边缘的描述性定义,即两个具有不同灰度的均匀图像区域的边界,即边界反映局部的灰度变化。
局部边缘是图像中局部灰度级以简单(即单调)的方式作极快变换的小区域。这种局部变化可用一定窗口运算的边缘检测算子来检测。

边缘的描述:
1) 边缘法线方向——在某点灰度变化最剧烈的方向,与边缘方向垂直;
2) 边缘方向——与边缘法线方向垂直,是目标边界的切线方向;
3) 边缘强度——沿边缘法线方向图像局部的变化强度的量度。
 


        边缘检测的基本思想是通过检测每个像素和其邻域的状态,以决定该像素是否位于一个物体的边界上。如果一个像素位于一个物体的边界上,则其邻域像素的灰度值的变化就比较大。假如可以应用某种算法检测出这种变化并进行量化表示,那么就可以确定物体的边界。

 边缘检测算法有如下四个步骤:

滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能.需要指出,大多数滤波器在降低噪声的同时也导致了边缘强度的损失,因此,增强边缘和降低噪声之间需要折衷.

增强:增强边缘的基础是确定图像各点邻域强度的变化值.增强算法可以将邻域(或局部)强度值有显著变化的点突显出来.边缘增强一般是通过计算梯度幅值来完成的.

检测:在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点.最简单的边缘检测判据是梯度幅值阈值判据.

定位:如果某一应用场合要求确定边缘位置,则边缘的位置可在子像素分辨率上来估计,边缘的方位也可以被估计出来.

    在边缘检测算法中,前三个步骤用得十分普遍。这是因为大多数场合下,仅仅需要边缘检测器指出边缘出现在图像某一像素点的附近,而没有必要指出边缘的精确位置或方向.边缘检测误差通常是指边缘误分类误差,即把假边缘判别成边缘而保留,而把真边缘判别成假边缘而去掉.边缘估计误差是用概率统计模型来描述边缘的位置和方向误差的.我们将边缘检测误差和边缘估计误差区分开,是因为它们的计算方法完全不同,其误差模型也完全不同.


边缘检测的三个共性准则:
•好的检测结果,或者说对边缘的误测率尽可能低,就是在图像边缘出现的地方检测结果中不应该没有;另一方面不要出现虚假的边缘;
•对边缘的定位要准确,也就是我们标记出的边缘位置要和图像上真正边缘的中心位置充分接近;
•对同一边缘要有尽可能低的响应次数,也就是检测响应最好是单像素的。

几种常用的边缘检测算子主要有Roberts边缘检测算子,Sobel算子、Prewitt算子、Krisch边缘算子,高斯-拉普拉斯算子。


==================================

图像特征:

图像特征是指图像中可用作标志的属性,它可以分为统计特征和视觉特征两类。
图像的统计特征是指一些人为定义的特征,通过变换才能得到,如图像的直方图、矩、频谱等;
图像的视觉特征是指人的视觉可直接感受到的自然特征,如区域的亮度、纹理或轮廓等

轮廓提取:

二值图像轮廓提取的算法非常简单, 就是掏空内部点: 如果原图像中有一点为黑,且它的8个邻点都是黑色时,说明该点是内部点, 将该点删除(置为白色像素值255)。对图像中所有像素点执行该操作便可完成图像轮廓的提取。

模板匹配:
模板匹配是指用一个较小的图像,即模板与源图像进行比较, 以确定在源图像中是否存在与该模板相同或相似的区域, 若该区域存在, 还可确定其位置并提取该区域。

形状匹配:
        形状也是描述图像内容的一个重要特征, 利用形状进行匹配需要考虑三个问题。首先,形状常与目标联系在一起,所以相对于颜色, 形状特征可以看作是更高层次的图像特征。要获得有关目标的形状参数,常常要先对图像进行分割, 所以形状特征会受图像分割效果的影响。其次,目标形状的描述是一个非常复杂的问题,至今还没有找到能与人的感觉相一致的图像形状的确切数学定义。最后,从不同视角获取的图像中目标形状可能会有很大差别,为准确进行形状匹配,需要解决平移、 尺度、 旋转变换不变性的问题。
标的形状常常可以用目标的轮廓来表示,而轮廓是由一系列边界点所组成的。一般认为,在较大尺度下常常能较可靠地消除误检并检测到真正的边界点, 但在大尺度下对边界的定位不易准确。相反,在较小尺度下对真正边界点的定位常比较准确,但在小尺度下误检的比例会增加。所以,可考虑先在较大尺度下检测出真正的边界点,再在较小尺度下对真正边界点进行较精确的定位。小波变换和分析作为一种多尺度、 多通道分析工具,比较适合对图像进行多尺度的边界检测。

没有更多推荐了,返回首页