精华内容
下载资源
问答
  • 对于图像求一阶导数,就是求图像灰度曲线的导数,所以在灰度曲线中变化较大的区域,在导数曲线中体现出绝对值比较大的值,而灰度曲线中变化平坦的区域,在导数曲线中体现出接近零的值,通过求一阶导数的处理,能突出...

    本次笔记要整理记录一些常用的导数算子,包括一阶导数算子和二阶导数算子等,这些导数算子种类比较繁杂,统一记录起来会比较容易回顾。

    - 常见一阶导数算子
    对于图像求一阶导数,就是求图像灰度曲线的导数,所以在灰度曲线中变化较大的区域,在导数曲线中体现出绝对值比较大的值,而灰度曲线中变化平坦的区域,在导数曲线中体现出接近零的值,通过求一阶导数的处理,能突出图像中对象的边缘,并且还具有方向性。
    常用的一阶导数算子主要有:Robert算子、prewitt算子、sobel算子。
    下面分别给出这三个算子的代码实现:

    1. Robert算子
    	Mat robertx_image;
    	Mat robert_x = (Mat_<int>(2, 2) << 1, 0, 0, -1);				//robert_x
    	filter2D(image, robertx_image, CV_32F, robert_x);						
    	convertScaleAbs(robertx_image, robertx_image);								//将输入数组均转化为uchar类型
    
    	Mat roberty_image;
    	Mat robert_y = (Mat_<int>(2, 2) << 0, -1, 1, 0);			//robert_y
    	filter2D(image, roberty_image, CV_32F, robert_y);
    	convertScaleAbs(roberty_image, roberty_image);
    
    	Mat robert_image;
    	add(robertx_image, roberty_image, robert_image, Mat(), CV_16S);
    	convertScaleAbs(robert_image, robert_image);
    	imshow("robert_image", robert_image);
    

    其中,定义了robert算子的x方向和y方向,分别是Mat robert_x = (Mat_<int>(2, 2) << 1, 0, 0, -1)Mat robert_y = (Mat_<int>(2, 2) << 0, -1, 1, 0),然后通过filter2D这个API对图像和算子分别卷积,要注意图像求梯度后存在浮点数,需要使用浮点(如CV_32F)类型,最后将x和y方向的两个结果进行相加,并且转换到CV_8UC类型,就可以显示出输出图像了。
    效果如下(分别是x、y方向的梯度,以及完整图像梯度):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.prewitt算子

    	//prewitt算子
    	Mat prewitt_x_image, prewitt_y_image, prewitt_image;
    	Mat prewitt_x = (Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
    	filter2D(image, prewitt_x_image, CV_32F, prewitt_x);
    	convertScaleAbs(prewitt_x_image, prewitt_x_image);
    
    	Mat prewitt_y = (Mat_<int>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1);
    	filter2D(image, prewitt_y_image, CV_32F, prewitt_y);
    	convertScaleAbs(prewitt_y_image, prewitt_y_image);
    
    	add(prewitt_x_image, prewitt_y_image, prewitt_image, Mat(), CV_16S);
    	convertScaleAbs(prewitt_image, prewitt_image);
    	imshow("prewitt_image", prewitt_image);
    

    其中同样分别定义了prewitt算子的x、y方向:Mat prewitt_x = (Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1)Mat prewitt_y = (Mat_<int>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1),分别与图像计算卷积后再进行相加,转换数据类型后显示输出图像。
    效果如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    3.sobel算子

    	Mat x_grad, y_grad, image_grad;
    	//Sobel算子求梯度后的值为浮点型且超过[0,  255]
    	Sobel(image, x_grad, CV_32F, 1, 0, 3, 1, 0, 4);
    	Sobel(image, y_grad, CV_32F, 0, 1, 3, 1, 0, 4);
    
    	convertScaleAbs(x_grad, x_grad);			//转化至CV_8UC
    	imshow("x_grad", x_grad);
    	convertScaleAbs(y_grad, y_grad);			//转化至CV_8UC
    	imshow("y_grad", y_grad);
    	
    	add(x_grad, y_grad, image_grad, Mat(), CV_16S);		//两个[0,255]范围的值相加,输出深度为CV_16S(16位有符号整型)
    	convertScaleAbs(image_grad, image_grad);
    	imshow("image_grad", image_grad);
    

    Sobel算子的优势是,相比prewitt算子能更好的抑制噪声。而且不需要我们自定义卷积核,而是OpenCV提供了一个专门的APISobel(image, x_grad, CV_32F, 1, 0, 3, 1, 0, 4)
    其第一个参数是要计算梯度的输入图像;
    第二个参数是处理完的输出图像;
    第三个参数是输出图像的深度;
    第四个参数dx,为1时表示计算x方向梯度,为0表示不计算x方向梯度;
    第五个参数dy,为1时表示计算y方向梯度,为0表示不计算y方向梯度;
    第六个参数ksize是计算梯度的卷积核大小;
    后面几个参数分别是缩放量(输出图像相比输入图像的缩放)、增加常量(输出图像相比输入图像增加的常量)、边缘填充方式,如果没有特殊需求都选用默认值即可。
    效果如下:
    在这里插入图片描述

    - 常见二阶导数算子
    二阶导数算子是对图像灰度曲线的导数求导,也就是在一阶导数的基础上再次求导,对灰度值的剧烈变化敏感,能突出图像的纹理结构,并且不具有方向性。
    常见的二阶导数算子主要有拉普拉斯算子和canny边缘检测算子。

    1.拉普拉斯算子

    	//
    	//拉普拉斯算子
    	Mat gaussianBlur_image, laplacian_image_4, laplacian_image_8;
    	GaussianBlur(image, gaussianBlur_image, Size(), 1, 1);
    
    	Laplacian(gaussianBlur_image, laplacian_image_4, CV_32F, 1, 1, 127);			
    	convertScaleAbs(laplacian_image_4, laplacian_image_4);
    	Laplacian(gaussianBlur_image, laplacian_image_8, CV_32F, 3, 1, 127);			
    	convertScaleAbs(laplacian_image_8, laplacian_image_8);
    
    	imshow("laplacian_image_4", laplacian_image_4);
    	imshow("laplacian_image_8", laplacian_image_8);
    

    拉普拉斯算子对于噪声非常敏感,所以需要先对原图进行高斯模糊后再提取梯度,在某些场合下会将高斯模糊和拉普拉斯边缘提取合并起来,即为LOG算子。
    OpenCV中提供一个API实现拉普拉斯算子的运算:Laplacian(gaussianBlur_image, laplacian_image_4, CV_32F, 1, 1, 127)
    第一个参数是经过高斯模糊后的图像;
    第二个参数是输出图像;
    第三个参数是输出图像的深度;
    第四个参数是ksize,当ksize = 1 使用4邻域的拉普拉斯算子;当ksize > 1 使用8邻域的拉普拉斯算子;
    第五个参数是缩放值;
    第六个参数是输出图像加上的常量,因为二阶导数求得值很小,为了便于观察可以加上一个delta值来提高显示亮度。
    效果如下:
    在这里插入图片描述
    左边是四邻域的拉普拉斯算子,右边是八邻域的拉普拉斯算子提取,可见使用八邻域的拉普拉斯算子的纹理提取效果比四邻域要好得多,能看得到更多的细节,轮廓也更加清晰。

    2.Canny边缘检测
    Canny边缘检测的主要步骤:
    1、 高斯模糊 – 抑制噪声;
    2、梯度提取得到候选边缘;
    3、角度计算与非最大信号抑制;
    4、高低阈值链接、获取完整边缘;
    5. 输出边缘;
    其中,第一、二步骤可以采用LOG算子实现,或使用高斯模糊加Sobel算子实现;第三步计算每个像素点的边缘幅值和角度,并进行非最大信号抑制,主要目的是实现边缘细化,使得边缘像素进一步减少(个人对非最大信号抑制的理解:对已经提取出的离散的边缘像素,与其邻域内的像素进行比较,若不是邻域的最大值则将其从边缘像素中剔除,若为最大值则保留为边缘像素);第四步是在边缘像素点集中进行筛选,将小于低阈值的像素点除去,将大于高阈值的像素点保留,对介于高低阈值区间的像素点则进行判断:该像素点是否与位于高阈值及以上的像素点相连通,若有连通域则在边缘像素点集中保留该像素点,若没有连通域则剔除该像素点;最后第五步以二值图像输出边缘。
    当然了在OpenCV中已经封装好了这些功能,不需要我们自己实现,我们可以调用相关API即可,下面是代码:

    Mat image_canny;	
    	Canny(image, image_canny, 200, 500, 5, false);
    	imshow("image_canny", image_canny);
    	Mat image_and, image_add;
    	bitwise_and(image, image, image_and, image_canny);		
    	imshow("image_and", image_and);
    	addWeighted(image, 1, image_and, 0.2, 0, image_add, CV_16S);	
    	convertScaleAbs(image_add, image_add);
    	imshow("image_add", image_add);			
    

    主要APICanny(image, image_canny, 200, 500, 5, false)
    第一个参数是输入图像;
    第二个参数是输出图像;
    第三和第四个参数:参数threshold1表示低阈值,参数threshold2表示高阈值(上限尽量不超过500);经验值是设置threshold1:threshold2 = 1:2到1:3之间效果较好
    第五个参数apertureSize:进行梯度运算(Sobel算子)的窗口大小,默认值为3
    第六个参数L2gradient:布尔类型,表示是否使用L2计算梯度,即使用矢量和计算;默认为false,即默认使用平方和计算梯度。
    上述代码中,将canny边缘检测提取出的边缘与原图像进行求与(and)运算,得到有色彩的边缘,再将边缘和原图像按权重相加,最后的输出结果增强了原图像细节纹理,但视觉感受上存在撕裂感。效果如下:
    在这里插入图片描述
    最左边是进行canny提取后的边缘图像,中间是和原图像求与(and)运算后的彩色边缘,最右边是彩色和原图像按权重相加的结果,可见虽然纹理部分变得明显了,但是却显得很不自然。

    本次关于图像导数算子的整理就到此结束啦,谢谢~

    PS:本人的注释比较杂,既有自己的心得体会也有网上查阅资料时摘抄下的知识内容,所以如有雷同,纯属我向前辈学习的致敬,如果有前辈觉得我的笔记内容侵犯了您的知识产权,请和我联系,我会将涉及到的博文内容删除,谢谢!

    展开全文
  • 差分近似图像导数算子之Laplace算子

    万次阅读 2013-10-31 11:25:23
    图像处理,我们知道经常把Laplace算子作为边缘检测之一,也是工程数学中常用的一种积分变换。本节主要介绍Laplacian 算子相关的知识。首先,拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二维...

    背景简述

    在图像处理,我们知道经常把Laplace算子作为边缘检测之一,也是工程数学中常用的一种积分变换。本节主要介绍Laplacian 算子相关的知识。

    基本理论

    首先,拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二维图像函数的拉普拉斯变换是各向同性的二阶导数,定义为:


    用更加形象的图像来解释,假设我们有一张一维图形。下图(a)中灰度值的”跃升”表示边缘的存在.如果使用一阶微分求导我们可以更加清晰的看到边缘”跃升”的存在(这里显示为高峰值)图(b); 如果在边缘部分求二阶导数会出现什么情况?,图(c)所示。(其图片和定义公式来源于http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.html)。

     

    (a)                                                                                                          (b)

    (c)

    你会发现在一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。 但是, 二阶导数的0值不仅仅出现在边缘(它们也可能出现在无意义的位置),但是我们可以过滤掉这些点。

    为了更适合于数字图像处理,将该方程表示为离散形式:


    另外,拉普拉斯算子还可以表示成模板的形式,以便更好编程需要。如图1所示。


    图1(a)表示离散拉普拉斯算子的模板,图1(b)表示其扩展模板,图1(c)则分别表示其他两种拉普拉斯的实现模板。从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮。因为图像中的边缘就是那些灰度发生跳变的区域,所以拉普拉斯锐化模板在边缘检测中很有用。一般增强技术对于陡峭的边缘和缓慢变化的边缘很难确定其边缘线的位置。但此算子却可用二次微分正峰和负峰之间的过零点来确定,对孤立点或端点更为敏感,因此特别适用于以突出图像中的孤立点、孤立线或线端点为目的的场合。同梯度算子一样,拉普拉斯算子也会增强图像中的噪声,有时用拉普拉斯算子进行边缘检测时,可将图像先进行平滑处理

    图像锐化处理的作用是使灰度反差增强,从而使模糊图像变得更加清晰。图像模糊的实质就是图像受到平均运算或积分运算,因此可以对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。拉普拉斯锐化的基本方法可以由下式表示:


    这种简单的锐化方法既可以产生拉普拉斯锐化处理的效果,同时又能保留背景信息,将原始图像叠加到拉普拉斯变换的处理结果中去,可以使图像中的各灰度值得到保留,使灰度突变处的对比度得到增强,最终结果是在保留图像背景的前提下,突现出图像中小的细节信息但其缺点是对图像中的某些边缘产生双重响应。

    参考代码

    OpenCV版Laplace算子

    #include "cv.h"
    #include "highgui.h"
    
    using namespace cv;
    
    int main(int argc, char* argv[])
    {
            Mat src = imread("test.jpg");
            Mat dst;
        
            Laplacian(src,dst,src.depth());
            imwrite("laplacian.jpg",dst);
    
            imshow("dst",dst);
            waitKey();
    
            return 0;
    }

    OpenCV-Python版Laplacian

    #coding=utf-8  
    import cv2  
    import numpy as np    
      
    img = cv2.imread("test.jpg", 0)  
    gray_lap = cv2.Laplacian(img,cv2.CV_16S,ksize = 3)  
    dst = cv2.convertScaleAbs(gray_lap)  
      
    cv2.imshow('laplacian',dst)  
    cv2.waitKey(0)  
    cv2.destroyAllWindows() 

    OpenCV-Python版LaplaceOperater

    import cv2  
    import numpy as np  
          
    kernel_size = 3  
    scale = 1  
    delta = 0  
    ddepth = cv2.CV_16S  
          
    img = cv2.imread('test.jpg')  
    img = cv2.GaussianBlur(img,(3,3),0)  
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
          
    gray_lap = cv2.Laplacian(gray,ddepth,ksize = kernel_size,scale = scale,delta = delta)  
    dst = cv2.convertScaleAbs(gray_lap)  
          
    cv2.imshow('laplaceOperater',dst)
    cv2.waitKey(0)  
    cv2.destroyAllWindows()  
    

    输出测试

    原始图像所示:


    OpenCV-Python版Laplacian输出图像所示:


    OpenCV-Python版LaplaceOperater输出图像所示:

    由图可以看出,将原始图像通过拉普拉斯变换后增强了图像中灰度突变处的对比度,使图像中小的细节部分得到增强并保留了图像的背景色调,使图像的细节比原始图像更加清晰。基于拉普拉斯变换的图像增强已成为图像锐化处理的基本工具。

    参考文献

    [1] Milan Sonka ,Vaclav Hlavac, Roger Boyle, "Image Procssing ,analysis and Machine Vision".

    [2] Richard Szelisi,"Computer Vision Algorithms and Applications".


    关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博和新浪微博songzi_tea.


    展开全文
  • 差分近似图像导数算子之Sobel算子

    千次阅读 2013-11-05 17:57:23
    图像处理中,一个最基本并且最重要的卷积就是导数的计算,一般用来表达微分最常用的操作是Sobel算子,可以包含任意阶的微分以及融合偏导。主要用作边缘检测。Sobel算子的原始推导过程方面很少,根据(Heath et al. ...

    背景引言

    图像处理中,一个最基本并且最重要的卷积就是导数的计算,一般用来表达微分最常用的操作是Sobel算子,可以包含任意阶的微分以及融合偏导。主要用作为边缘检测。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。本节介绍Sobel算子知识,给出参考代码以及测试输出结果。

    基本理论

    Sobel算子的原始推导过程方面很少,根据(Heath et al. 1997) [1],最初Sobel算子是源自于一篇博士论文(Sobel, 1970 )[2]。当时可能用于计算大模板系数的理论基础很少被提到。一个可能的理论基础是考虑到均值计算和差分处理的最优方式。高斯平均已经被公认为最优的均值方法。二项展开式(binomial expansion)可求出级数的整数系数,在极限情况下近似于正态分布(normal distribution)。Pascal's Triangle[3]可计算出平滑算子的一组系数,在极限情况下这组系数与高斯平滑算子的系数大致相同。

    在图像处理中,Sobel算子的这个通用形式缩合了一条坐标轴上最优平滑和另一条坐标轴上的最优差分。换而言之,Sobel 算子有两个,一个是检测水平边缘的 ;另一个是检测垂直边缘的 。它对于象素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。但缺点就是Sobel算子并没有将图像的主体与背景严格地区分开来,即:Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意

    首先,我们定义一个3X3的模板,如下图1(a)所示,同时定义一个3X3一般算子模板系数表现形式,如下图1(b)所示:

        

    图1 (a) 3x3图像的模板   图1 (b) 3x3一般算子的模板系数

    所以,可以得出一般的算子的表示G为:

    G  = O1*Z1 + O2*Z2 + O3*Z3+O4*Z4+ O5*Z5

                  + O6*Z6 +O7*Z7+O8*Z8 + O9*Z9        ........   (1)

    根据给出不同算子模板,上式公式可以得出G表示形式。现在,我们给出Sobel算子中的用卷积模板来实现,此算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作卷积,即可分别得出横向及纵向的亮度差分近似值。如下图像所示:

    图(2) Sobel算子的3X3模板

    其次,根据公式(1)和图(2)给出Sobel算子的3x3模板,Gx和Gy分别表经横向及纵向边缘的图像灰度值,其所表示:

    梯度幅度值所表示为:


    上述所示Sobel算子基本理论,此时,给出Sobel算子算法的主要步骤如下:
    1. 分别将两个方向模板沿着图像从一个像素移动到另一像素,并将像素的中心与某个像素位置相重合;
    2. 将模板内的系数与其图像上相对应的像素值相乘;
    3. 将所有相乘的值相加;
    4. 将两个卷积的最大值赋给图像中对应模板中心位置的像素作为该像素新的灰度值;
    5. 选取合适的阈值TH,若新像素灰度值≥TH,则判断该像素点为图像边缘点。

    在此,贴出参考代码(仅作参考),若有误,请多多指出。

    参考代码

    OpenCV-Python版Sobel

    #coding=utf-8  
    import cv2  
    import numpy as np    
      
    img = cv2.imread("test.jpg", 0)  
      
    x = cv2.Sobel(img,cv2.CV_16S,1,0)  
    y = cv2.Sobel(img,cv2.CV_16S,0,1)  
      
    absX = cv2.convertScaleAbs(x)   
    absY = cv2.convertScaleAbs(y)  
      
    dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
    
    cv2.imshow("Orig",img)  
    cv2.imshow("absX", absX)  
    cv2.imshow("absY", absY)  
      
    cv2.imshow("Result", dst)  
      
    cv2.waitKey(0)  
    cv2.destroyAllWindows() 
    

    输出测试结果

    原始图像


    经Sobel算子的水平轴上处理后图像边缘检测如下所示:


    经Sobel算子的垂直轴上处理后图像边缘检测如下所示:


    经Sobel算子的水平轴和垂直轴处理后图像边缘检测,如下图所示:

    在博文【特征提取】差分近似图像导数算子之Laplace算子 , 介绍了Laplace算子相关原理,在此时,给出测试输出结果与本节介绍Sobel算子的提取图像边缘直观比较。经Laplace算子处理后图像边缘检测,如下图所示:


    补充

    扩展链接

    (2013年11月7日补充)

    [1] 博文  Phone Vision14 -Sobel Operators .

    [2] 博文Sobel Edge.

    [3] Feature Detectors-Sobel Edge Detectors.

    参考文献

    [1]  Heath,M.D.,Sarker,S.,Sanocki,T. and Bowyer,K.W."A Robust Visual Method fo Assessing the Relative Performance of Edge Detection Algorithms", IEEE Trans. PAMI,19(12),pp.1338-1359,1997.

    [2] I.E. Sobel, "Camera Models and Machine Perception",PhD thesis,Stanford Univ.1970.

    [3] Pascal's Triangle  From Wikipedia, the free encyclopedia.


    关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博和新浪微博songzi_tea.


    展开全文
  • ●边缘是灰度值不连续的结果,这种不连续常可利用求导数方便检测到,一般常用一阶和二阶导数来检测边缘。(河、岸存在落差) 常用的边缘剖面有三种: ●阶梯状:对应于图像中两个具有不同灰度值的相邻区域之间;...

    ★边缘(灰度过渡的地方)检测

    ●边缘检测是所有基于边界的分割方法的第一步(串行、并行)。

    ●两个具有不同灰度值的相邻区域之间总存在边缘。

    ●边缘是灰度值不连续的结果,这种不连续常可利用求导数方便检测到,一般常用一阶和二阶导数来检测边缘。(河、岸存在落差)


    常用的边缘剖面有三种:

    ●阶梯状:对应于图像中两个具有不同灰度值的相邻区域之间;(通过检测一阶导数的峰值或二阶导数的零值,可以找到边界)

    ●脉冲状:对应于细条状的灰度值突变区域的边缘;

    ●屋顶状:对应于上升下降沿都比较缓慢的边缘。(一阶导数和二阶导数分别对应脉冲导数一阶导数和二阶导数的拉伸)

    由于采样的缘故,数字图像中的边缘总有些模糊,所以在垂直上下的边缘剖面上都表示成有一定的坡度。


    ★边缘与导数

    (a)一阶导数:在图像由暗变明的位置处有一个向上的阶跃,而在其他位置为零。可用一阶导数的幅值来检测边缘的存在,幅度峰值一般对应边缘位置。

      二阶导数:在一阶导数的阶跃上升区有一个向上的脉冲,而在一阶导数的阶跃下降区有一个向下的脉冲。在这两个阶跃之间有一个零点,它的位置正对原图像中边缘的位置。可用二阶导数在过零点附近的符号确定边缘像素在图像边缘的暗区或明区。

    (b)这个图像是由明变暗,所以与(a)图比,剖面左右对换,一阶导数上下对换,二阶导数左右对称。

    (c)脉冲状的剖面边缘与(a)一阶导数形状相同。所以(c)的一阶导数形状与(a)的二阶导数形状相同。而它的二阶导数过零点正好分别对应脉冲的上升沿和下降沿。通过检测脉冲剖面的二阶导数过零点可确定脉冲的范围。

    (d)屋顶状边缘的剖面可看作是将脉冲边缘底部展开得到的,所以它的一阶导数是将(c)脉冲剖面的一阶导数的上升沿和下降沿展开得到的,而它的二阶导数的上升沿和下降沿拉开得到的。   通过检测屋顶状边缘剖面的一阶导数过零点可以确定屋顶位置。无法确定屋顶的宽度。


    ★微分算子

    1、梯度算子:梯度对应一阶导数,梯度算子是一阶导数算子。(矢量、x,y方向求导)

    ☞对一个连续函数f(x,y),它的位置(x,y)的梯度可表示为一个矢量:


    ●梯度矢量的幅度(常简称梯度):

    ●方向角:


    ☞离散用模板实现。

    ●偏导数需对每个像素位置计算,在实际中常用小区域模板卷积运算进行来近似计算。对GxGy各用一个模板(水平和垂直模板),所以需要两个模板组合起来以构成一个梯度算子。

    ●常用的有Roberts cross算子,Prewitt算子,Sobel算子,其中Sobel算子是效果比较好的一种。

    ●算子运算时是采取类似卷积的方式。

    ●在边缘灰度值过渡比较尖锐且图像中噪声比较小时,梯度算子工作效果较好。(白色表示大梯度,黑色表示小梯度)


    2、拉普拉斯(Laplacian)算子:是一种二阶导数算子(检测明暗)。

    ☞对一个连续函数f(x,y),它的位置(x,y)的拉普拉斯定义如下:



    ☞在数字图像中,计算函数的拉普拉斯值也可借助各种模板实现。

    ●拉普拉斯算子是一种二阶导数算子,所以对图像中的噪声相当敏感。

    ●它常产生双象素宽的边缘(由于二阶导数的两个峰值点(明和暗)造成的,中间过零点为真正的边界),且也不能提供边缘方向的信息。

    ●由于以上原因,拉普拉斯算子很少直接用于检测边缘(一般用一阶导数),而主要用于边缘像素后,确定该像素是在图像的暗区或明区一边。(过明点的正负位置)


    3、综合正交算子:边缘的存在是图像中灰度值不连续一般表现,图像中的孤立点和直线段也可看做边缘。直线段可看作两个相邻的边缘构成,所以也可很方便地用特殊设计的正交模板设计。综合算子是由9个模板组成的,既可以检测边缘,也可以检测直线。

          


    ★边界闭合—将边缘像素连接起来

    ●用梯度算子对图像处理可得到像素两方面的信息:

    (1)梯度的幅度(2)梯度的方向

    ●根据边缘像素梯度在这两方面的相似性可把它们连接起来。

    ●如果像素(s,t)在像素(x,y)的领域内且它们的梯度幅度和梯度方向分别满足以下两个条件(其中T是幅度阀值,A是角度阀值),那么就可将在(s,t)的像素与在(x,y)的像素连接起来。

    ●如对所有边缘像素都进行这样的判断和连接就有希望得到闭合的边界。

    ●边界连接可并行地完成。

    ●利用数学形态学的一些操作也可以连接或闭合边界,这里边界的连接也可并行地完成。



    展开全文
  • 神经网络学习之导数

    2021-02-28 18:36:06
    在神经网络中,有一个常用的激活函数sigmoid函数,这个函数在高等数学中应该是有的,只是当时没有理会。函数图像如下,本文主要主要梳理下相应的数学知识,具体的应用在后续的文章中会涉及。 本文涉及到数学公式,...
  • 常用传统图像处理方法总结

    千次阅读 2019-02-19 14:11:07
    1. 边缘提取 1.1 微分算子检测边缘 一阶算子:一阶导数的极大值点 二阶算子:二阶导数的过零点 一阶算子: Prewitt算子 , sobel算子(给...最常用的边缘检测方法。能够噪声抑制,边缘增强,边缘定位。 算法分为三步...
  • 图像处理中,导数和梯度的概念有点类似,或者说有些关联。梯度在图像处理中非常重要,可以有说,几乎所有的图像处理算法都与梯度有关。梯度包括方向和幅值两部分。最常见的利用梯度的算法就是边缘检测算法。如...
  • 表示微分最常用的算子是sobel导数算子,sobel算子可以实现任意阶导数和混合偏导数 src:源图像 dst:目标图像 ddepth:确定目标图像的深度或类型 xorder,yorder:求导顺序,x和y的取值为(0,1,2),不能同时取0 ...
  • sobel算子是一种常用的边缘检测算法,在各种论文或书籍中,我们常常能看到类似这样的话,被检测的对象存在大量的竖直边,所以可以采用sobel算子来找到第一个水平导数,它可以用来在图像中查找竖直边缘。 它在opencv...
  • 图像处理中,导数和梯度的概念有点类似,或者说有些关联。梯度在图像处理中非常重要,可以有说,几乎所有的图像处理算法都与梯度有关。梯度包括方向和幅值两部分。最常见的利用梯度的算法就是边缘检测算法。如...
  • 图像处理中,导数和梯度的概念有点类似,或者说有些关联。梯度在图像处理中非常重要,可以有说,几乎所有的图像处理算法都与梯度有关。梯度包括方向和幅值两部分。最常见的利用梯度的算法就是边缘检测算法。如...
  • 关注公众号的小伙伴数学都棒棒哒爸爸说函数图像题在国考卷中屡见不鲜,部分导数压轴题的命制,也是事先知道函数的图像,然后才着手命制的,函数的图像的重要性不言而喻!以下呈现的就是一些常见的函数的图像!公众号...
  • CNN图像处理常用损失函数

    千次阅读 2019-03-13 15:48:22
    假定噪声的影响和图像的局部特性是独立的。然而,人类的视觉系统对噪声的感知受局部照度、对比、结构的影响。 假定噪声接近高斯白噪声,然而这一假定并不总是成立。 SSIM损失函数 人眼对结构(structure)信息很敏感...
  • 图像边缘检测

    2019-01-28 14:44:49
    边缘检测基本思想 不同图像的灰度值不同,边界处一般会有明显的边缘 图像边缘:在图像中像素值有突变的...根据这一特点,描述和检测边缘常用一阶导数和二阶导数图像边缘及其导数曲线规律图 图像的边缘可以求...
  • 激活函数

    2020-08-05 11:55:10
    激活函数各种激活函数整理总结常用激活函数及其导数常用激活函数及其导数的图像为什么需要激活函数标准说法更形象的解释关于各个激活函数的比较和适用场景sigmoid 和softmax区别什么情况下 ReLU 的神经元会死亡?...
  • 05-VTK在图像处理中的应用(7)

    千次阅读 2013-01-31 16:44:50
    图像边缘一般常用图像一阶导数和二阶导数来检测。 5.12.1 梯度算子 梯度算子对应于图像一阶导数。图像一阶导数计算一般是通过差分运算来近似的。VTK中可以使用vtkImageGradient计算图像梯度。注意图像梯度是
  • 常用激活函数总结

    2021-03-10 19:57:29
    sigmoid经常用于隐层神经元输出,函数与导数图像如下 观察函数的图像,我们很容易发现其优点与缺点。 优点: 1.输出值再(0,1)之间,输出的范围在稳定的范围内,可以用作输出层。实际上sigmoid经常用作输出层
  • 锐化 锐化滤波器用于突出显示图像的边界和其他精细细节。 锐化是基于一阶导数和二阶导数的,一幅图像的一阶导数计算〔图像强度梯度〕的逼近,而二阶导数定义为该梯度的...用于获取导数的两种常用算子是Sobel和L...
  • VTK修炼之道32:边缘检测_梯度算子

    千次阅读 2017-01-26 22:16:27
    图像边缘一般常用图像一阶导数和二阶导数来检测。 梯度算子对应于图像一阶导数。图像一阶导数计算一般是通过差分运算来近似的。VTK中可以使用vtkImageGradient计算图像梯度。注意图像梯度是一个向量,具有方
  • 图像处理算法 面试题

    万次阅读 2018-09-03 16:56:10
    其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值, Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很...
  • 图像理论

    2018-10-19 20:21:58
    为什么边缘位置存在于一阶导数的极值点处和二阶导数的零点处 1.基于边缘检测的图像分割 常用微分算子进行边缘检测 常用的一阶微分算子有:Roberts、Prewitt和Sobel,常用用的二阶微分算子:Laplace、kirsh。微分...
  • 图像边缘检测原理

    千次阅读 2019-10-26 16:08:48
    导数:连续函数上某点斜率,导数越大表示变化率越大,变化率越大的地方就越是“边缘”,但是在计算机中不常用,因为在斜率90度的地方,导数无穷大,计算机很难表示这些无穷大的东西 微分:连续函数上x变化了dx,...
  • 图像锐化Windows源码

    2020-09-25 09:30:43
    图像锐化,是使图像边缘更清晰的一种图像处理方法,细节增强(detail enhancement)我理解也包含了图像锐化,常用的做法是提取图像的高频分量,将其叠加到原图上。图像高频分量的提取有两种做法,一种是用高通滤波器...
  • 图像锐化算法

    千次阅读 2019-07-18 11:41:53
    图像锐化,是使图像边缘更清晰的一种图像处理方法,细节增强(detail enhancement)我理解也包含了图像锐化,常用的做法是提取图像的高频分量,将其叠加到原图上。图像高频分量的提取有两种做法,一种是用高通滤波器...
  • 一、啥是激活函数?为啥用激活函数?常用的有哪些? 啥是激活函数?激活函数是上层节点的输出和下层节点的输入之间的一个非线性函数关系。 为啥用激活函数?要是不用激活函数,不管多少层的... Sigmoid的导数图像
  • 图像锐化算法-sharpen

    万次阅读 2018-09-11 23:11:38
    图像锐化,是使图像边缘更清晰的一种图像处理方法,细节增强(detail enhancement)我理解也包含了图像锐化,常用的做法是提取图像的高频分量,将其叠加到原图上。图像高频分量的提取有两种做法,一种是用高通滤波器...
  • 常用激活函数

    2020-08-06 17:51:51
    常见激活函数总结Sigmoid函数tanh函数Relu函数Leaky ReLU函数(PReLU)ELU (Exponential Linear Units) 函数 «深入浅出深度学习——原理剖析与Python实践»黄安埠Page220 ...导数图像: tanh函数 tanh读作Hyperbolic

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 158
精华内容 63
关键字:

导数常用图像