精华内容
下载资源
问答
  • 关于ECG信号的形态学滤波原理

    千次阅读 2019-08-01 14:02:38
    形态学滤波是数学形态学中发展而来的一类 非线性滤波技术 , 广泛应用于信号处理、图像分 析等多个领域. 数学形态学建立在严格的数学理论 基础之上, 主要以积分几何、集合代数及拓扑论为 理论基础. 传统的时频域变换...

    传统的基线漂移去除方法主要有自适应滤波法、卡尔曼滤波法、小 波变换法等。

    形态学理论:

    形态学滤波是数学形态学中发展而来的一类 非线性滤波技术 , 广泛应用于信号处理、图像分 析等多个领域. 数学形态学建立在严格的数学理论 基础之上, 主要以积分几何、集合代数及拓扑论为 理论基础. 传统的时频域变换方法处理信号可能 会破坏信号特征, 而形态学通过选择适当的结构元 素, 能极大保留信号的形态特征. 形态滤波中最重要的概念是相当于“探针”的 结构元素, 通过移动结构元素考察图像各部分关 系, 采用不同结构元素分析会得到不同结果.

    膨胀 与腐蚀是数学形态学中两个基本运算 . 有关形 态学去除基线漂移的研究包括. 由于ECG是一维 信号, 膨胀与腐蚀定义如下:

    设信号序列为f : F = {0, 1, · · · , N − 1},

    结构 元素k : K = {0, 1, · · · , M − 1}, 且N > M.

    信号 f(n)关于结构元素k(m)的膨胀运算定义为 (f ⊕ k)(n) = {f(n − m) − k(m)}, (n = M − 1, M, · · · , N − 1).

    信号f(n)关于结构元素k(m)的腐蚀运算定义为 (fΘk)(n) = {f(n + m) − k(m)}, (n = 0, · · · , N − M).

    将两种运算级联可推演出开运算(opening operation)和闭运算(closing operation).

    开运算定 义为信号被结构元素腐蚀后再进行膨胀运算记 为“◦”, 即 (f ◦ k)(n) = (fΘk ⊕ k)(n).

    闭运算定义为信号被结构元素膨胀后再进行腐蚀 运算, 记为“•”, 即 (f • k)(n) = (f ⊕ kΘk)(n).

    开运算和闭运算变换是基本的形态学滤波器, 用于探查在信号上方和下方的信息, 其中开运算用 于抑制信号的正脉冲, 闭运算则抑制信号的负脉 冲. 由上式可以看出形态滤波运算由一组简单的加 减、比较等运算组成, 计算量小, 耗时短.

    注意:

    结构元素是形态学中最重要的滤波参数, 而不 同的形状和尺寸影响结构元素移动所产生的形态变换的性能. 形状、高度及宽度决定了结构元素的 形态特征. 经过验证分析, 提出几个选取结构元素 的基本原则:

    1) 形状: 选择的结构元素需尽量匹配处理信 号的几何形状, 常见的结构元素形状是一些简单的 几何形状, 如圆盘形、正方形、菱形等, 对于较为复 杂的信号处理, 也可通过对这些简单几何形状进行 组合.

    2) 尺寸: 结构元素的尺寸包括高度与宽度. 其 中宽度是滤波器设计尺寸最主要参数, 由被滤除信 号与有用信号的宽度所决定. 参数的选择应大于被 滤除信号尺寸, 但小于保留信号的尺寸. 或大或小,

    1) 第一级形态学滤波.

    原始心电信号f0 通过 结构元素k1 进行先闭后开及先开后闭的形态运算,

    采用公式f0•k1◦k1 与f0 ◦ k1 • k1,

    取二者算术平均 得信号f1.

    下式表示算法第一步: f1 = 1 2 [OC(f0, k1) + CO(f0, k1)].

    结构元素的设计使得心电信号的波形不被滤 除. 设计形状类似于QRS波波形, 即三角形, 如 图3 (a). 宽度根据采用频率Fs (360 Hz)和特征 波形(QRS 波群)的时间宽度T 来设定, 如表1所 示, QRS 波群为0.06—0.10 s, 结构元素的设计 要小于QRS波信号, 即0.1Fs, 小于被滤除信号. 因原始信号包含一些肌电干扰, 主要为高频信 号, 时间宽度为2—13 ms. 故将结构元素定位为 0.015Fs = 0.015 × 360 ≈ 5 个采样单位, 即结构元 素的宽度M = 5 个采样单位. 因此三角形结构元 素的表达式为 k(n) = H ( 1 − |n| L ) , 其中L与结构元素的宽度M 有关, M = 2L + 1, 所 以L = 2, n = −L, · · · , 0, · · · , L, H 为三角形高度

    根据心电信号幅度设置H 值为2, 故所选三角形结 构元素为k1 = {0, 1, 2, 1, 0}.

    2) 形态学第二级滤波.

    为了矫正心电信号基 线漂移, 需要较大结构元素k2 对信号进行处理. 将 结构元素k2 对f1 进行上述类似运算, 可得到基线 漂移有关信号分量f2, 即 f2 = 1 2 [OC(f1, k2) + CO(f1, k2)]. 结构元素k2 的宽度由心电信号的采样频率Fs 和特征波形的时间宽度T (QRS波群约0.1 s) 所 决定. 用闭运算滤除因开运算加大的负脉冲, 结 构元素宽度要大于脉冲宽度, 需设计较大, 设为 k2 = 1.5Fs · T = 1.5 × 360 × 0.1 = 54, 得到ECG特征波形被滤除, 剩下基线漂移信号, 与原始信号 相减后得到去除基漂的心电信号.

    3) 将信号中f1 减去基线漂移信号f2,

    得到滤 除噪声后需要的信号f3, 即 f3 = f1 − f2.

    完事进行形态学编程。。。。。。

     

     

    展开全文
  • LiDAR数据形态学滤波原理

    千次阅读 2015-06-02 22:50:52
    数学形态学:简称形态学,被定义为一种分析空间结构的理论,之所以称为...数学形态学理论用于LiDAR点云数据滤波时一般采用两个复合算子,即“开”算子和“关”算子。为了提取地面点,本文对传统的数学形态学“开”算子
    数学形态学:简称形态学,被定义为一种分析空间结构的理论,之所以称为形态学是因为其目的在于分析目标的形状和结构。
    形态学滤波器:是由数学形态学的基本运算构成的滤波器叫做形态学滤波器。有选择的抑制图像的结构,那些结构可以是噪声,也可以是不相关的图像目标。
    
    
    数学形态学理论用于LiDAR点云数据滤波时一般采用两个复合算子,即“开”算子和“关”算子。为了提取地面点,本文对传统的数学形态学“开”算子进行了改进,并按照下列流程进行处理:
    1.离散点腐蚀处理。遍历LiDAR点云数据,以
    任意一点为中心开w×w大小的窗口,比较窗口内各点的高程,取窗口内最小高程值为腐蚀后的高程。
    2.离散点膨胀处理。再次遍历LiDAR点云数
    据,对经过腐蚀后的数据用同样大小的结构窗口做膨胀。即以任意一点为中心开w×w大小的窗口
    
    此时,用腐蚀后的高程值代替原始高程值,比较窗口内各点的高程,取窗口内最大高程值为膨胀后的高程。
    3.地面点提取。设zp是p点的原始高程,t为阈值。在每点膨胀操作结束时,对该点是否是地面点作出判断。如果p点膨胀后的高程值和其原始高程值zp之差的绝对值小于或等于阈值t,则认为p点为地面点,否则为非地面点。
    
    展开全文
  • 基于FPGA的图像形态学滤波算法及实现 ,马佳艺,宋欢,本文分析传统的形态学滤波原理,并根据现有的顺序滤波方法,提出改进的形态学滤波算法,在合理地利用硬件资源的基础上,有效地挖
  • 【计算机视觉】形态学滤波

    万次阅读 2015-11-28 16:30:59
    说明:本文主要想弄清楚形态学滤波在图象处理和信号处理中的应用,图像处理中非常直观的通过腐蚀膨胀获得开闭运算的效果,而在数据实时滤波中,形态学滤波也是可以使用的。形态学滤波基本知识 原理:在特殊领域运算...

    【计算机视觉】形态学滤波

    标签(空格分隔): 【图像处理】 【信号处理】

    版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/lg1259156776/


    说明:本文主要想弄清楚形态学滤波在图象处理和信号处理中的应用,图像处理中非常直观的通过腐蚀膨胀获得开闭运算的效果,而在数据实时滤波中,形态学滤波也是可以使用的。


    形态学滤波基本知识

    原理:在特殊领域运算形式——结构元素(Sturcture Element),在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑运算性质。

    膨胀、腐蚀、开、闭运算是数学形态学最基本的变换。

    结构元素简单地定义为像素的结构(形状)以及一个原点(又称为锚点),使用形态学滤波涉及对图像的每个像素应用这个结构元素,当结构元素的原点与给定的像素对齐时,它与图像相交部分定义了一组进行形态学运算的像素。原则上,结构元素可以是任何形状,但通常使用简单的形状,比如方形、圆形和菱形,而原点位于中心位置(基于效率的考虑)。

    腐蚀和膨胀两个滤波操作也运算在每个像素周围像素集合上(邻域),这是由结构元素定义的。当应用到一个给定的像素时,结构元素的锚点与该像素的位置对齐,而所有与他相交的像素都被包括在当前像素集合中。腐蚀替换当前像素为像素集合中找到的最小的像素值,而膨胀则替换为像素集合中找到的最大像素值。当然,对于二值图像,每个像素只能被替换为白色像素或黑色像素。

    这一段的论述,可以参考Opencv计算机视觉 编程手册。对于腐蚀和膨胀的差别,可以通过想象,腐蚀呢, 如果给定像素的结构元素触碰到背景,那么该像素被设置为背景,而在膨胀的情况下,如果触碰到前景,该像素被设置为前景,所以很明显,腐蚀操作后物体的尺寸会减小,而膨胀操作后物体的尺寸会增大,同时内部的一些洞被填满。

    事实上,腐蚀一副图像两次,就像是让结构元素对自己进行膨胀后再去腐蚀同一幅图像;反过来对膨胀也是合适的。

    有下面两种说法:

    1. 对图像的腐蚀操作等于对图像负片的膨胀操作的负片;
    2. 对图像的膨胀操作等于对图像负片的腐蚀操作的负片;

    实际上说的是对目标进行的腐蚀,等效于对背景进行的膨胀;反之亦然。

    腐蚀的最简单的应用是从图中消除不相关的细节,而膨胀的最简单的应用是将裂缝桥接起来。开运算是先腐蚀再膨胀,开运算一般断开狭窄的间断和消除细的突出物,而闭操作通常消弥狭窄的间断和长细的鸿沟,消除小的孔洞,并填充轮廓线中的断裂。开运算与闭运算的结合使用能使作用对象的轮廓变得光滑

    开运算是先腐蚀再膨胀,而闭运算是先膨胀再腐蚀;
    在检验闭滤波器的结果时,可以看到白色前景物体中的小洞被填充,该滤波器同时连接多个相邻物体,基本上,无法完全包含结构元素的洞洞或者缝隙都将被滤波器移除。反过来,开滤波器则是移除掉场景中比较小的物体,因为它门无法完全包含结构元素。

    这些滤波器通常在物体检测中应用,闭滤波器将误分割为碎片的物体重新连接起来,而开滤波器则去除掉图像噪声点引起的小像素块(Blob)。因此,在视频序列中使用他们很有帮助,如果测试的二值图像相继使用闭、开操作,获得图像将只显示场景中的主要物体。如果优先处理噪点,也可以先进行开运算,再进行闭运算,但是有可能去除掉一些分散的物体。

    需要注意的是,对于对于一幅图像多次使用相同的开运算或者闭运算是没有效果的,因为在第一次闭(开)运算填充图像中的洞洞后,再次应用相同的滤波,不会对图像产生任何变化。用数学的术语讲,这些运算是等幂的。

    使用形态学滤波对图像进行边缘及角点检测

    形态学滤波可以用于检测图像中指定的特征。
    一种比较形象的方法是将灰度图像看做是“等高线”(比如分水岭图像分割算法):亮的区域代表山峰,而暗的区域代表山谷,图像的边沿就对应于峭壁。如果腐蚀一幅图像,会导致山谷被扩展,而峭壁减少了。相反的,如果膨胀一幅图像,峭壁则会增加。但是这两种情况下,中间的部分(大片的谷底和高原)基本保持不变。

    在上述理解的基础上,如果我们对图像的腐蚀和膨胀的结果做差,就能提取图像的边界:因为边界区域,二者完全不同。(实际上,我们也可以用腐蚀或者膨胀的结果与源图像做差得出类似结果,但提取的边界会比较细)。可以看出,结构元越大,边界越粗。在OpenCV中,将形态学操作函数morphologyEx 的第4个参数设为MORPH_GRADIENT,就能完成上述工作。

    利用形态学操作获取角点稍微有一些复杂,它试用了四种不同的结构元素,基本方法是对一幅图像先腐蚀,在膨胀但是这两次操作使用的结构元却不同。这些结构元的选取使得直线保持不变,但是由于他们各自作用的效果,角点处的边沿被影响了。我们结合一幅图来说明:

    此处输入图片的描述

    第一幅图是原图。在被十字形元素膨胀后,方块的边缘被扩张,而由于十字形元素没有击中角点,此处不受影响。中间的方块描述了这个结果;膨胀后的图像接着被菱形元素腐蚀,这次运算将大多数的边缘恢复到原始位置,但之前没有膨胀过的角点被向内推动,之后得到了左边的方块,可以看到,他缺少明显的角点。同样的处理过程通过X形与方形元素得到重复。这两个元素结构是先前元素的旋转版本,捕获的将是45°旋转后的角点。最后,对两次过程的结果做差值,提取角点特征。

    代码可以参考参考文献3.

    形态学滤波之图象处理

    一般腐蚀操作对二值图进行处理,腐蚀操作如下图,中心位置的像素点是否与周围领域的像素点颜色一样(即是否是白色点,即值是否为255),若一致,则保留,不一致则该点变为黑色(值即为0)
    此处输入图片的描述
    opencv中的腐蚀操作:

    CVAPI(void)  cvErode( const CvArr* src, CvArr* dst,
                          IplConvKernel* element CV_DEFAULT(NULL),
                          int iterations CV_DEFAULT(1) );
    

    前两个参数比较熟悉,第三个参数是用于传递模板的信息,默认是(NULL),即为3*3的模板,第四个参数是迭代的次数(即该腐蚀操作做几次);

    opencv中的膨胀操作其实就是腐蚀的反操作:

    CVAPI(void)  cvDilate( const CvArr* src, CvArr* dst,
                           IplConvKernel* element CV_DEFAULT(NULL),
                           int iterations CV_DEFAULT(1) );
    

    测试代码:
    #include “stdafx.h”
    #include “cv.h”
    #include “highgui.h”

    int main(){
        IplImage *img= cvLoadImage("C:/fu.jpg");//读取图片
        cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);
    
        cvShowImage("Example1",img);//在Example1显示图片
        //    cvCopy(img,temp);
        IplImage* temp=cvCreateImage( //创建一个size为image,三通道8位的彩色图
            cvGetSize(img),
            IPL_DEPTH_8U,
            3
            );
    
        cvErode(img,temp,0,1);//腐蚀
        cvShowImage("Example2",temp);
    
        cvDilate(img,temp,0,1);//膨胀
        cvShowImage("Example3",temp);
    
    
        cvWaitKey(0);//暂停用于显示图片
    
    
        cvReleaseImage(&img);//释放img所指向的内存空间并且
        cvDestroyWindow("Example1");
        cvDestroyWindow("Example2");
        cvDestroyWindow("Example3");
    
        return 0;
    }
    

    此处输入图片的描述
    以上都是在模板3*3的情况下处理的,要是我们期望使用自己定义的模板时候,就需要自己做模板。

    CVAPI(IplConvKernel*)  cvCreateStructuringElementEx(
                int cols, int  rows, int  anchor_x, int  anchor_y,
                int shape, int* values CV_DEFAULT(NULL) );
    

    前两个参数是定义模板的大小,后两个参数是参考点的坐标(比如默认3*3模板的参考点坐标是2*2),第五个参数是模板的类型(可以是矩形,十字形,椭圆形,甚至是用户自己定义形状),最后一个参数是在使用自自定义形状的时候,通过value传递模板的形状。

    模板的类型:
    此处输入图片的描述

    CVAPI(void)  cvReleaseStructuringElement( IplConvKernel** element ); //释放模板所占用的内存
    

    自定义5*5,参考点(3,3)的矩形模板的测试代码:

    #include "stdafx.h"
    #include "cv.h"
    #include "highgui.h"
    
    int main(){
        IplImage *img= cvLoadImage("C:/fu.jpg");//读取图片
        cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);
    
        cvShowImage("Example1",img);//在Example1显示图片
        //    cvCopy(img,temp);
        IplImage* temp=cvCreateImage( //创建一个size为image,三通道8位的彩色图
            cvGetSize(img),
            IPL_DEPTH_8U,
            3
            );
    
        IplConvKernel * myModel;
        myModel=cvCreateStructuringElementEx( //自定义5*5,参考点(3,3)的矩形模板
            5,5,2,2,CV_SHAPE_RECT
            );
    
        cvErode(img,temp,myModel,1);
        cvShowImage("Example2",temp);
    
        cvDilate(img,temp,myModel,1);
        cvShowImage("Example3",temp);
    
    
        cvWaitKey(0);//暂停用于显示图片
    
        cvReleaseStructuringElement(&myModel);
        cvReleaseImage(&img);//释放img所指向的内存空间并且
        cvDestroyWindow("Example1");
        cvDestroyWindow("Example2");
        cvDestroyWindow("Example3");
    
        return 0;
    }
    

    效果图:
    此处输入图片的描述

    形态学滤波之信号处理

    数学形态学的方法可以理解为一个具有一定直径的小球滚过一段特定的路径,各种信号可以看作是路径上的小坑。由于所有的噪声都有个共同特征一一高频低峰(它们构成非常复杂,由各种混合在眼电信号中的其他成份或眼球快速、微小、空间大小不超过1“的运动导致),这些小坑的径长明显小于小球直径,因此小球球心的滚动轨迹不会受噪声的干扰一一小球球心滚动轨迹即可以看成数学形态学处理后的信号。本系统中用到的数学形态学算子包括腐蚀运算、膨胀运算、开操作、闭操作。

    腐蚀的最简单的应用是从图中消除不相关的细节,而膨胀的最简单的应用是将裂缝桥接起来。开运算是先腐蚀再膨胀,开运算一般断开狭窄的间断和消除细的突出物,而闭操作通常消弥狭窄的间断和长细的鸿沟,消除小的孔洞,并填充轮廓线中的断裂。开运算与闭运算的结合使用能使作用对象的轮廓变得光滑

    #include <stdio.h>
    #include <fcntl.h>
    //#include <sys/types.h>
    //#include <sys/stats.h>
    #include <time.h>
    #define N 5  //结构元素。大小设置根据滤除波形一个周期中点个数来定。例如:采样率250,滤除50hz,
                                                                     //因为50hz一个周期中有5个点,所以N设为5。          
    
    
    float x[3*N+2]={0.0};
    
    void openoperate(float input[],float dilation[]) //开运算:先腐蚀再膨胀
    {
        int i,k,t;
        float tmp;
        t=2*N+3;
        float erosion[2*N+3];
        for(k=0;k<t;k++){
            tmp=input[k];
            for(i=k+1;i<k+N;i++){
                if(tmp>input[i])
                    tmp=input[i];
            }
            erosion[k]=tmp;
        }
        t=t-3;
        for(k=0;k<t;k++){
            tmp=erosion[k];
            for(i=k+1;i<k+N;i++){
                if(tmp<erosion[i])
                    tmp=erosion[i];
            }
            dilation[k]=tmp;
        }
    }
    
    float closeoperate(float input[]) //闭运算:先膨胀再腐蚀
    {
        int i,k,t;
        float tmp;
    
        t=N*2-1;
        float dilation[N];
    
        for(k=0;k<N;k++){
            tmp=input[k];
            for(i=k+1;i<k+N;i++){
                if(tmp<input[i])
                    tmp=input[i];
            }
            dilation[k]=tmp;
        }
    
        tmp=dilation[0];
        for(k=1;k<N;k++){
            if(tmp>dilation[k])
                tmp=dilation[k];
        }
        return tmp;
    }
    
    int main()
    {
        clock_t start,end;
        double duration;
        FILE *fd,*m_fd;
        float buffer;
        float filter_data;
        float openresult[2*N-1];
    
        m_fd=fopen("D:/data.txt","r+");
        if(m_fd==NULL){
            perror("open error!");
            return -1;
        }
    
        fd=fopen("D:/data1.txt","w+");  
        if(fd==NULL){
            perror("open error!");
            return -1;
        }
        start=clock();
        while(fscanf(m_fd,"%f",&buffer)!=EOF){
              x[3*N+1]=buffer;
    
              openoperate(x,openresult);
              filter_data=closeoperate(openresult);
              fprintf(fd,"%f ",filter_data);
    
              for(int y=0;y<3*N+1;y++)
                   x[y]=x[y+1];
        }
        end=clock();
        duration=(double)(end-start)/CLOCKS_PER_SEC;
        printf("%f seconds\n",duration);
        fclose(fd);
        fclose(m_fd);
        return 0;
    }
    

    结果如下图所示,对有干扰原始眼电数据进行形态学滤波处理,其中结构元素17个,窗宽5.有图可以看到,形态学对于尖峰的滤波效果特别明显。
    此处输入图片的描述

    图二,将形态学滤波算法加入Qt中,对眼电进行实时滤波处理,效果如图:

    此处输入图片的描述

    【引】这部分内容主要来自参考文献2

    总结

    以前认为形态学滤波只在图像处理中有所应用,现在看了参考文献2,才发觉自己实在有点固步自封,对知识的来龙去脉掌握的不够清楚,一言以蔽之,囫囵吞枣,并不清楚思考方向,而只掌握具体的技巧细节,不注重顶层设计,所以才会有此感慨。

    在进行数据处理中,常常用到的滤波方法有中值滤波,均值滤波,FIR,IIR,卡尔曼滤波,自适应滤波等。而很多知识都是相符相通的,切不可死学死记。

    参考文献:
    1. http://blog.csdn.net/thefutureisour/article/details/7574819
    2. http://m.blog.csdn.net/blog/gylltq/33799347
    3. OpenCV 2 计算机视觉编程手册


    2015-11-28 学习笔记 张朋艺

    展开全文
  • 形态学滤波角点提取

    2018-06-04 09:48:12
    形态学滤波角点提取 形态学边缘检测的原理是利用膨胀与腐蚀变化区域特征来完成边缘检测,膨胀操作是将目标物体向周围领域扩展,而腐蚀操作是将目标物体向领域收缩,图像的边缘恰好反应在形态学腐蚀与膨胀中变化的...

    形态学滤波角点提取

    形态学边缘检测的原理是利用膨胀与腐蚀变化区域特征来完成边缘检测,膨胀操作是将目标物体向周围领域扩展,而腐蚀操作是将目标物体向领域收缩,图像的边缘恰好反应在形态学腐蚀与膨胀中变化的区域,因此只需要将膨胀得到的结果图与腐蚀的得到的结果图进行差运算,就可以得到物体的边缘。形态学边缘检测可以形态学梯度操作函数morphologyEx直接得到,具体是通过计算形态学膨胀结果图与腐蚀结果图之差,在进行相应阈值化操作实现的。
    具体过程如下:
    这里写图片描述
    示例代码如下:

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <iostream>
    using namespace cv;
    int main()
    {
        cv::Mat srcImage = cv::imread("..\\images\\sea.jpg");
        if (!srcImage.data)
            return 1;
        cv::Mat srcGray;
        cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
        // 定义结构元素
        Mat CrossMat(5, 5, CV_8U, Scalar(0));
        Mat diamondMat(5, 5, CV_8U, Scalar(1));
        Mat squareMat(5, 5, CV_8U, Scalar(1));
        Mat x(5, 5, CV_8U, Scalar(0));
        //  十字形形状  
        for (int i = 0; i<5; i++)
        {
            CrossMat.at<uchar>(2, i) = 1;
            CrossMat.at<uchar>(i, 2) = 1;
        }
        // 菱形形状
        diamondMat.at<uchar>(0, 0) = 0;
        diamondMat.at<uchar>(0, 1) = 0;
        diamondMat.at<uchar>(1, 0) = 0;
        diamondMat.at<uchar>(4, 4) = 0;
        diamondMat.at<uchar>(3, 4) = 0;
        diamondMat.at<uchar>(4, 3) = 0;
        diamondMat.at<uchar>(4, 0) = 0;
        diamondMat.at<uchar>(4, 1) = 0;
        diamondMat.at<uchar>(3, 0) = 0;
        diamondMat.at<uchar>(0, 4) = 0;
        diamondMat.at<uchar>(0, 3) = 0;
        diamondMat.at<uchar>(1, 4) = 0;
        // X形状
        for (int i = 0; i<5; i++){
            x.at<uchar>(i, i) = 1;
            x.at<uchar>(4 - i, i) = 1;
        }
        // 第1步:十字形对原图进行膨胀
        Mat result;
        dilate(srcGray, result, CrossMat);
        // 第2步:菱形对上步进行腐蚀
        erode(result, result, diamondMat);
        Mat result2;
        // 第3步:X形对原图进行腐蚀
        dilate(srcGray, result2, x);
        // 第4步:正方形对上步进行腐蚀
        erode(result2, result2, squareMat);
        // 第4步:计算差值
        absdiff(result2, result, result);
        threshold(result, result, 40, 255, THRESH_BINARY);
        // 绘图
        for (int i = 0; i < result.rows; i++)
        {
            // 获取行指针
            const uchar* data = result.ptr<uchar>(i);
            for (int j = 0; j < result.cols; j++)
            {
                // 如果是角点 则进行绘制圆圈
                if (data[j])
                   circle(srcImage, Point(j, i), 8, 
                    Scalar(0, 255, 0));
            }
        }
        cv::imshow("result", result);
        cv::imshow("srcImage", srcImage);
        cv::waitKey(0);
        return 0;
    }
    展开全文
  • 基本形态学滤波

    2019-09-25 13:24:09
    对图像进行形态学变换。变换对象一般为灰度图或二值图,功能函数放在morphology子模块内。 一 膨胀(dilation) 原理:一般对二值图像进行操作。找到像素值为1的点,将它的邻近像素点都设置成这个值。1值表示白,0...
  • 我们为什么要用形态学滤波 消除噪声 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。 寻找图像中的明显的极大值区域或极小值区域 求出图像的梯度 目录膨胀,腐蚀二级目录三级目录 膨胀,腐蚀 ...
  • 对图像进行形态学变换。变换对象一般为灰度图或二值图,功能函数放在morphology子模块内。 1、膨胀(dilation) 原理:一般对二值图像进行操作。找到像素值为1的点,将它的邻近像素点都设置成这个值。1值表示白,0值...
  • 1. 概述本设计采用FPGA技术,实现CMOS视频图像的Tophat形态学滤波,并通过以太网传输(UDP方式)给PC实时显示。2. 硬件系统框图CMOS采用MT9V011(30万像素),FPGA采用ALTERA公司的CYCLONE IV,以太网卡采用REALTK公司的...
  • 对图像进行形态学变换。变换对象一般为灰度图或二值图,功能函数放在morphology子模块内。 1、膨胀(dilation) 原理:一般对二值图像进行操作。找到像素值为1的点,将它的邻近像素点都设置成这个值。1值表示白,0值...
  • 版权声明:本文为CSDN博主「tiankong19999」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。...原理       程序 #include<opencv2/opencv.hpp...
  • 对图像进行形态学变换。变换对象一般为灰度图或二值图,功能函数放在morphology子模块内。 1、膨胀(dilation) 原理:一般对二值图像进行操作。找到像素值为1的点,将它的邻近像素点都设置成这个值。1值表示白,0...
  • 形态学边缘检测的原理是利用膨胀与腐蚀变化区域特征来完成边缘检测,膨胀操作是将目标物体向周围邻域进行扩展,而腐蚀操作则是将目标物体像邻域进行收缩 因此图像的边缘恰好反映在形态学腐蚀与膨胀中变化的区域,...
  • 对图像进行形态学变换。变换对象一般为灰度图或二值图,功能函数放在morphology子模块内。1、膨胀(dilation)原理:一般对二值图像进行操作。找到像素值为1的点,将它的邻近像素点都设置成这个值。1值表示白,0值表示...
  • 它背后的原理是,将图像视为拓扑结构的地图, 那么均质区域对应的是被陡峭边缘包围的平坦盆地。 实现方法:  分水岭分割的结果是通过watershed()函数获取。  我们将图片中已知属于某个区域的像素进行标记,...
  • 原理         程序    #include&lt;opencv2/opencv.hpp&gt; using namespace std; using namespace cv; Mat g_srcImage, g_dstImage; //原始图和效果图 int g_nTrackbarNumber = 0; //0表示...
  • 原理       程序 #include&lt;opencv2/opencv.hpp&gt; using namespace std; using namespace cv; /* 宏定义 */ #define ORIGINAL_WINDOW_NAME "【原始图】" #define OPEN_...
  • 第一篇文章啦,写一下笔记记一下到的东西,从这开始吧 ps:就是自己的学习笔记,借鉴了好多大神的文章。。 第五章的第一个内容是腐蚀和膨胀,腐蚀和膨胀都是对图像白色部分进行运算。也就是二值化之后的白色部分...
  • 在一幅灰度图像中,我们可以把亮的那一部分比作山,暗的那一部分比作山谷,而边缘就是山和山谷的相接的地方,这部分的灰度值会急剧...利用这个原理我们就可以找到图像的边缘。也就是找出腐蚀和膨胀后的图像的不同,结果
  • 根据数学形态学滤波的基本原理,证明了改进形态开运算的可行性。详细阐述了所提算法的基本步骤及流程,并分析了其性能特点。利用仿真数据和公开测试数据,对所提算法进行了实验验证。实验结果表明,所提算法对存在大...
  • 根据混合图像结构元素选取流程,分析不同混合图像结构元素尺寸,当元素尺寸被选定后,结合均值滤波原理,分析最大结构元素尺寸变化内的各种形态,在去除噪声同时保留完整图像边缘。依据形态学均值滤波处理过程,引入...
  • 在一幅灰度图像中,我们可以把亮的那一部分比作山,暗的那一部分比作山谷,而边缘就是山和山谷的相接的地方,这部分的灰度值会急剧的...利用这个原理我们就可以找到图像的边缘。也就是找出腐蚀和膨胀后的图像的不同,
  • (1)模糊原理 Smooth/Blur是图像处理中最简单和常用的操作之一,使用该操作的原因之一就为了给图像预处理时候减低噪声。 使用Smooth/Blur操作其背后是数学的卷积处理: G(I,j)=k,Ifi+k,j+Ih(k,I) 通常这些卷积...
  • 基于中值滤波和数学形态学的图像边缘检测,李秀峰,苏兰海,本文对数学形态学中的腐蚀和膨胀的原理和中值滤波除噪应用进行研究,并针对二值化图像把中值滤波与腐蚀相结合研究一种边缘检测的

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 194
精华内容 77
关键字:

形态学滤波原理