精华内容
下载资源
问答
  • 矢量自对偶形态学滤波算子
  • 滤波算子

    千次阅读 2012-11-14 16:23:27
     极大值滤波就是选取像素点领域的最大值作为改点的像素值,有效率去了灰度值比较低的噪声,也可作为形态学里面的膨胀操作。  极大值滤波可以表示为: Maximum(A)=max[A(x+i,y+j)] (x,y)属于M  注:(x+i,y+j)...



    1.极大值滤波

       极大值滤波就是选取像素点领域的最大值作为改点的像素值,有效率去了灰度值比较低的噪声,也可作为形态学里面的膨胀操作。

              极大值滤波可以表示为: Maximum(A)=max[A(x+i,y+j)]      (x,y)属于M

     注:(x+i,y+j)是定义在图像上的坐标,(i,j)是定义在模板M上的坐标。M即为运算的模板。

    2.极小值滤波(与极大值滤波相反)

    3.中点滤波

      中点滤波常用于去除图像中的短尾噪声,例如高斯噪声和均匀分布噪声。终点滤波器的输出时给定窗口内灰度的极大值和极小值的平均值;

         Midpoint(A)=(max[A(x+i,y+j)]+min[A(x+i,y+j)])/2          (x,y)属于M

     注:(x+i,y+j)是定义在图像上的坐标,(i,j)是定义在模板M上的坐标。M即为运算的模板。

    4.中值滤波

         中值滤波可以消除图像中的长尾噪声,例如负指数噪声和椒盐噪声。在消除噪声时,中值滤波对图像噪声的模糊极小(受模板大小的影响),中值滤波实质上是用模板内所包括像素灰度的中值来取代模板中心像素的灰度。中值滤波在消除图像内椒盐噪声和保持图像的空域细节方面,其性能优于均值滤波。

    Median(A)=Median[A(x+i,y+j)]              (x,y)属于M

     注:(x+i,y+j)是定义在图像上的坐标,(i,j)是定义在模板M上的坐标。M即为运算的模板。

    5.加权中值滤波(中值滤波的改进)

       加权中值滤波是在中值滤波的基础上加以改进,其性能在一定程度上优于中值滤波。

    下面是自己在算法上的改进:以例子说明

    若说选模板的大小为5,那么这个模板就唯一确定为:

            

           

            

           

            

    上图中的数字表式改点像素在序列中出现的次数。然后根据模板平滑图像。实验证明该方法好于传统中值滤波。当然还有其他方法;


    展开全文
  • 形态学滤波

    2015-06-06 08:59:21
    基于VISUAL STUDIO 2008和OPENCV实现形态学滤波
  • 图像形态学滤波是图像滤波的一个重要分支,与之前介绍过的空间域滤波(方框滤波、高斯滤波、中值滤波)以及图像边缘提取过程中的滤波相同的是,他们都是通过滤波算子掩膜计算图像(中心)像素点的过程...

    一、前言

    图像形态学滤波是图像滤波的一个重要分支,与之前介绍过的空间域滤波(方框滤波、高斯滤波、中值滤波)以及图像边缘提取过程中的滤波相同的是,他们都是通过滤波算子掩膜计算图像(中心)像素点的过程,不同的是滤波算子(内核)和计算方式,概括如下:

    • 形态学滤波:采用结构元素(Structure element)作为内核,中心像素是通过内核区域集合运算得到的。
    • 空域平滑、锐化滤波:采用卷积元素(Convolution element)作为内核,中心像素通过内核区域算数运算(有积分、微分等)得到的。

    总体来说,图像的形态学操作是基于形状的一系列图像处理操作,在OpenCV中对图像的形态学变换提供了方便快捷的函数,包括基本形态学操作和高级形态学操作。

    二、形态学概述

    图像形态学,也叫做数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论,在图像处理中占有相当重要的地位。

    在图像处理中,对于图像形态学的应用相当的广泛,主要应用在对于图像的预处理操作当中,尤其是在对二值图像的预处理和分析方面。

    结构元素
    形态学滤波最主要特征在集合运算,而集合运算是通过由0/1组成的不同形态的结构元素实现的,首先明确结构元素的概念:
    结构元素是由元素为1或者0的矩阵组成,结构元素为1的区域定义了图像的邻域,领域内的像素在进行态学操作时要进行考虑。一般来说,二维或者平面结构的结构元素要比处理的图像小得多。结构元素的中心像素,即结构元素的原点,与输入图像中感兴趣的像素值(即要处理的像素值)相对应。

    OpenCV中获取结构元素的函数为getStructuringElement,原型为:

    Mat getStructuringElement(int shape,  //内核的形状
    						  Size esize,  //内核的尺寸
    						  Point anchor = Point(-1, -1) //锚点的位置						  )
    

    内核的形状,有三种形状可以选择。

    • 矩形:MORPH_RECT;
    • 交叉形:MORPH_CROSS;
    • 椭圆形:MORPH_ELLIPSE;

    三、基本形态学操作

    基本形态学操作有腐蚀和膨胀,在腐蚀和膨胀上面通过不同运算方式可得到高级形态学操作,其主要作用有:

    • 消除噪声(低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点)
    • 分割出独立的图像元素(腐蚀),在图像中连接相邻的元素(膨胀)
    • 寻找图像中明显的极大值区域或极小值区域
    • 求出图像的梯度
    • 图像轮廓提取、图像分割、寻找图像中的明显的极大值区域或极小值区域等

    【注】:OpenCV里面的腐蚀和膨胀操作是针对白色目标区域

    3.1腐蚀

    腐蚀:用结构元素的中心点对准当前正在遍历的这个像素,然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最小值,用这个最小值替换当前像素值,删除对象边界的某些像素,使二值图像减小一圈

    腐蚀是一种最大值滤波,即用结构元素内的最大值去替换锚点的像素值,具体操作为:

    1. 用结构元素,扫描图像的每一个像素

    2. 用结构元素与其覆盖的二值图像做 “与”操作

    3. 如果都为1,结果图像的该像素为1。否则为0,也就是查找被处理图像中能不能找到和结构元素相同的矩阵。如果存在那么中心点所对应的点就为1,否则为0

    简单来说,就是腐蚀图像白色边缘(像素值为1)缩小一圈,图示如下:
    在这里插入图片描述
    若图中原始图像边界点像素为src(x,y),采用结构元素element(x’,y’)处理后得到dst(x,y),公式表述为:
    d s t ( x , y ) = m a x ( x ′ , y ′ ) : e l e m e n t ( x ′ , y ′ ) ≠ 0 s r c ( x + x ′ , y + y ′ ) dst(x,y)=\underset{(x',y'):element(x',y')\neq 0}{max}src(x+x',y+y') dst(x,y)=(x,y):element(x,y)=0maxsrc(x+x,y+y)

    在OpenCV中进行腐蚀操作可以采用函数erode(),或者采用morphologyEx() 函数并输出需要进行的形态学操作类型。如下为erode()函数原型:

    void erode(InputArray src,  //原始图像
        	   OutputArray dst, //目标图像,和源图片有一样的尺寸和类型
       		   InputArray kernel, //内核,可以使用getStructuringElement来创建结构元素
               Point anchor=Point(-1,-1), //锚点的位置,其有默认值(-1,-1),表示锚位于中心
               int iterations=1,  //迭代使用该函数的次数,默认值为1
               int borderType=BORDER_CONSTANT,  //用于推断图像外部像素的某种边界模式,默认值BORDER_DEFAULT
               const Scalar& borderValue=morphologyDefaultBorderValue()  //当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),
                )
    

    3.2膨胀

    膨胀:用结构元素的中心点对准当前正在遍历的这个像素,然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值,用这个最大值替换当前像素值,给图像中的对象边界添加像素,使图像扩大一圈

    膨胀是一种最小值滤波,即用结构元素内的最小值去替换锚点的像素值,具体操作:

    1. 用结构元素,扫描图像的每一个像素

    2. 用结构元素与其覆盖的二值图像做 “与”操作

    3. 如果都为0,结果图像的该像素为0。否则为1
      也就是在结构元素覆盖范围下,只要有一个像素符和结构元素像素相同,那么中心点对应点就为1,否则为0

    简单来说,就是膨胀图像边缘白色(像素值为1)扩大一圈,图示如下:
    在这里插入图片描述
    类似上,公式表述为:
    d s t ( x , y ) = m i n ( x ′ , y ′ ) : e l e m e n t ( x ′ , y ′ ) ≠ 0 s r c ( x + x ′ , y + y ′ ) dst(x,y)=\underset{(x',y'):element(x',y')\neq 0}{min}src(x+x',y+y') dst(x,y)=(x,y):element(x,y)=0minsrc(x+x,y+y)

    在OpenCV中进行膨胀操作可以采用函数dilate(),或者采用morphologyEx() 函数并输出需要进行的形态学操作类型。如下为cv::dilate()的函数原型,和erode类似

    void dilate(InputArray src,  //原始图像
        	    OutputArray dst, //目标图像,和源图片有一样的尺寸和类型
       		    InputArray kernel, //内核,可以使用getStructuringElement来创建结构元素
                Point anchor=Point(-1,-1), //锚点的位置,其有默认值(-1,-1),表示锚位于中心
                int iterations=1,  //迭代使用该函数的次数,默认值为1
                int borderType=BORDER_CONSTANT,  //用于推断图像外部像素的某种边界模式,默认值BORDER_DEFAULT
                const Scalar& borderValue=morphologyDefaultBorderValue()  //当边界为常数时的边界值,有默认值morphologyDefaultBorderValue()
                )
    

    【注】腐蚀:删除对象边界的某些像素
               ~~~~~~~~~~           膨胀:给图像中的对象边界添加像素

    四、高级形态学操作

    4.1开闭运算

    开运算:先腐蚀,再膨胀,可清除一些亮的像素点,放大局部低亮度的区域,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积。

    闭运算:先膨胀,再腐蚀,可清除一些暗的像素点,即排除小型黑洞(黑色区域)。

    4.2形态学梯度

    膨胀图与腐蚀图之差提取物体边缘,对二值图像进行这一操作可以将边缘突出出来。

    4.3黑帽顶帽

    顶帽:原图像-开运算图,突出原图像中比周围的区域
    黑帽:闭运算图-原图像,突出原图像中比周围的区域

    morphologyEx函数利用基本的膨胀和腐蚀技术,来执行更加高级形态学变换,函数原型为:

    void morphologyEx(InputArray src,  //原始图像
    			      OutputArray dst,  //目标图像
                      int op,  //形态学操作
                      InputArray kernel, //内核
                      Point anchor=Point(-1,-1), //锚点 ,其有默认值(-1,-1),表示锚位于中心
                      int iterations=1,  //迭代使用该函数的次数,默认值为1
                      int borderType=BORDER_CONSTANT,  //用于推断图像外部像素的某种边界模式,默认值BORDER_DEFAULT
                      const Scalar& borderValue=morphologyDefaultBorderValue()  //当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),
                      )
    

    表示形态学操作的类型OP可取值如下:
    在这里插入图片描述

    五、基于OpenCV的C++代码实现

    下面这段代码分为两个部分,一部分使用OpenCV自带形态学处理函数实现的,一部分使用自己构造函数实现的。
    在实现My_open开运算的同时,使用双滚动条控制结构元素的宽(W)和高(H),具体代码如下:

    #include<opencv2/opencv.hpp>
    #include<iostream>
    using namespace cv;
    //函数声明
    void my_erode(Mat& src,Mat& dst,Size dsize); 
    void my_dilate(Mat& src,Mat& dst,Size dsize);
    void my_open(Mat& src, Mat& dst, Size dsize);
    void my_close(Mat& src, Mat& dst, Size dsize);
    
    //全局定义:比较耗内存
    int h=1,w=1;
    Mat newSrc;
    Mat dst_open1;  
    
    void on_Track(int ,void*){  //回调函数
        my_open(newSrc,dst_open1,Size(2*h+1,2*w+1));
        imshow("WIN_NAME",dst_open1);
        
    }
    int main(){  //主函数
        Mat src=imread("C:/Users/Administrator/Desktop/beauty.jpg");
        Size dsize=Size(round(0.3*src.cols),round(0.3*src.rows));
        resize(src,src,dsize,0,0,CV_INTER_LINEAR);
    
        //Part1:OpenCV自带函数实现腐蚀膨胀、开闭运算、顶帽底帽等
        Mat dst_erode,dst_dilate;
        double t_beg=getTickCount();
        Mat element=getStructuringElement(MORPH_RECT,Size(7,7)); //矩形内核
        erode(src,dst_erode,element); //腐蚀:计时
        double t_end=getTickCount();
        std::cout<<"OpenCV_erode time:"<<((t_end-t_beg)*1000)/getTickFrequency()<<"ms"<<std::endl;
        
        dilate(src,dst_dilate,element);  //膨胀
        Mat dst_open;
        morphologyEx(src,dst_open,MORPH_OPEN,element);   //开运算
        /*腐蚀和膨胀也可以应用此模板,对应的参数为
        MORPH_OPEN : 开运算
        MORPH_CLOSE : 闭运算
        MORPH_ERODE : 腐蚀
        MORPH_DILATE : 膨胀
        MORPH_TOPHAT : 顶帽
        MORPH_BLACKHAT : 黑帽
        */
    
    
        //Part2:C++构造函数实现腐蚀、膨胀、开闭操作
        Mat dst_erode1(src.size(),src.type()),dst_dilate1(src.size(),src.type());
        //Size dsize(7,7);
        double t_beg1=getTickCount();
        my_erode(src,dst_erode1,Size(7,7)); //腐蚀:计时
        double t_end1=getTickCount();
        std::cout<<"My_erode time:"<<((t_end1-t_beg1)*1000)/getTickFrequency()<<"ms"<<std::endl;
        my_dilate(src,dst_dilate1,Size(7,7));
        
        //设置滚动条C++实现开运算
        int max_value=5; //设置滚动条最大值
        src.copyTo(newSrc);
        src.copyTo(dst_open1);
        namedWindow("WIN_NAME",WINDOW_AUTOSIZE); //创建窗口
        createTrackbar("h","WIN_NAME",&h,max_value,on_Track); //h滚动条
        createTrackbar("w","WIN_NAME",&w,max_value,on_Track); //w滚动条
        on_Track(0,0); //调用回调函数,并显示
        
        //进行显示、写入等操作
        waitKey(0);
        return 0;
    }
    void my_erode(Mat& src,Mat& dst,Size wsize){
        if((wsize.height%2==0) || (wsize.width%2==0)){
            printf("The length and width must be odds!");
            exit(-1);
        }
        int center_y=wsize.height/2;
        int center_x=wsize.width/2;
    
        Mat borderDst;
        copyMakeBorder(src,borderDst,center_x,center_x,center_y,center_y,BORDER_REFLECT101); //对称扩展边界
     
        for(int row=center_y;row<src.rows+center_y;row++){
            for(int col=center_x;col<src.cols+center_x;col++){
                //对模板覆盖图像区域处理
                if(src.channels() == 1){  //单通道
                    int min_Value=255;
                    for(int i=row-center_y;i<row+center_y+1;i++){
                        for(int j=col-center_x;j<col+center_x+1;j++){
                            min_Value=MIN(min_Value,borderDst.at<uchar>(i,j)); //掩膜最小值:白色区域(255)缩小一圈
                        }
                    }
                    dst.at<uchar>(row-center_y,col-center_x)=min_Value;
                }
                else{
                    for(int channel=0;channel<3;channel++){  //多通道
                        int min_Value=255;
                        //对模板覆盖图像区域处理
                        for(int i=row-center_y;i<row+center_y+1;i++){
                            for(int j=col-center_x;j<col+center_x+1;j++){
                                min_Value=MIN(min_Value,borderDst.at<Vec3b>(i,j)[channel]); //掩膜最小值:白色区域(255)缩小一圈
                            }
                        }
                        dst.at<Vec3b>(row-center_y,col-center_x)[channel]=min_Value;
                    }
                }
    
                
            }
        }
          
    }
    
    void my_dilate(Mat& src,Mat& dst,Size dsize){   //类似my_erode处理
        if(dsize.width%2 == 0 || dsize.height%2 == 0){
            printf("Kernel size do not be odds!");
            exit(-1);
        }
        int h=dsize.height/2; //row
        int w=dsize.width/2;  //col
        Mat borderSrc;
        copyMakeBorder(src,borderSrc,h,h,w,w,BORDER_REFLECT101);
    
        //对图像每一个像素遍历
        for(int row=h;row<src.rows+h;row++){
            for(int col=w;col<src.cols+w;col++){
    
                //对每一个掩膜区域逻辑处理
                if(src.channels() == 1){ //单通道
                    int max_Value=0;
                    for(int i=row-h;i<row+h+1;i++){
                        for(int j=col-w;j<col+w+1;j++){
                            max_Value=MAX(max_Value,borderSrc.at<uchar>(i,j));
                        }
                    }
                    dst.at<uchar>(row-h,col-w)=max_Value;
                }
    
                else{
                    for(int channel=0;channel<3;channel++){  //多通道
                        int max_Value=0;
                        for(int i=row-h;i<row+h+1;i++){
                            for(int j=col-w;j<col+w+1;j++){
                                max_Value=MAX(max_Value,borderSrc.at<Vec3b>(i,j)[channel]);
                            }
                        }
                        dst.at<Vec3b>(row-h,col-w)[channel]=max_Value;
                    }
                }
            }
        }
    
    }
    
    void my_open(Mat& src, Mat& dst, Size dsize) {  //开运算:先腐蚀再膨胀
    	Mat dst1;
    	src.copyTo(dst1);
    	my_erode(src, dst1,dsize);
    	my_dilate(dst1, dst,dsize);
    }
    void my_close(Mat& src, Mat& dst, Size dsize) {  //闭运算:先膨胀再腐蚀
    	Mat dst1;
    	src.copyTo(dst1);
    	my_erode(src, dst1,dsize);
    	my_dilate(dst1, dst,dsize);
    }
    
    void my_tophat(Mat src, Mat dst, Size dsize) { //顶帽:原图-开运算(注意防溢出)
    	Mat dst1;
    	src.copyTo(dst1);
    	my_open(src, dst1, dsize);
    	imshow("open", dst1);
    	for (int rows = 0; rows < src.rows; rows++) {
    		for (int cols = 0; cols < src.cols; cols++) {
                if(src.channels() == 1){
    			    dst.at<uchar>(rows, cols) = saturate_cast<uchar>(src.at<uchar>(rows, cols) - dst1.at<uchar>(rows, cols));
                }
                else{
                    dst.at<Vec3b>(rows, cols)[0] = saturate_cast<uchar>(src.at<Vec3b>(rows, cols)[0] - dst1.at<Vec3b>(rows, cols)[0]);
                    dst.at<Vec3b>(rows, cols)[1] = saturate_cast<uchar>(src.at<Vec3b>(rows, cols)[1] - dst1.at<Vec3b>(rows, cols)[1]);
                    dst.at<Vec3b>(rows, cols)[2] = saturate_cast<uchar>(src.at<Vec3b>(rows, cols)[2] - dst1.at<Vec3b>(rows, cols)[2]);
                }
            }
    	}
    	imshow("顶帽", dst);
    }
    
    
    void my_underhat(Mat src, Mat dst, Size dsize) {  //黑帽:闭运算-原图
    	Mat dst1;
    	src.copyTo(dst1);
    	my_close(src, dst1, dsize);
    	imshow("colse", dst1);
    	for (int rows = 0; rows < src.rows; rows++) {
    		for (int cols = 0; cols < src.cols; cols++) {
                if(src.channels() == 1){
    			dst.at<uchar>(rows, cols) = saturate_cast<uchar>(dst1.at<uchar>(rows, cols) - src.at<uchar>(rows, cols));
                }
                else{
                    dst.at<Vec3b>(rows, cols)[0] = saturate_cast<uchar>(dst1.at<Vec3b>(rows, cols)[0] - src.at<Vec3b>(rows, cols)[0]);
                    dst.at<Vec3b>(rows, cols)[1] = saturate_cast<uchar>(dst1.at<Vec3b>(rows, cols)[1] - src.at<Vec3b>(rows, cols)[1]);
                    dst.at<Vec3b>(rows, cols)[2] = saturate_cast<uchar>(dst1.at<Vec3b>(rows, cols)[2] - src.at<Vec3b>(rows, cols)[2]);
                }
            }
    	}
    	namedWindow("黑帽", CV_WINDOW_AUTOSIZE);
    	imshow("黑帽", dst);
    }
    

    滚动条控制内核kernel的W和H得到开运算目标图像,显示如下:
    在这里插入图片描述
    其他效果续更…

    参考博客:
    【1】【OpenCV(C++)】图像处理:形态学滤波
    【2】形态学操作——腐蚀膨胀、开闭运算、顶帽变换底帽变换 c++实现

    展开全文
  • 滤波算子 : ​ 高斯滤波、中值滤波、均值滤波、方框(盒式)滤波、双边滤波、低/高通滤波、引导(导向)滤波 ​ 边缘检测算子:Canny算子、Sobel算子、Laplacian算子、Scharr滤波 ​ 频域滤波:Gabor滤波、Frangi...

    由于之前搞图像时留下的笔记都太乱、没有章法,详细的总结部分后续有时间再整理,在这里先做个大一统,有疏漏的地方还请博友们指正,比如业界常见的ISP、3A相关的算法,网上比较优质的资料好像不太多~

    图像算法大全:

    图像相似度算法:图像哈希 + 哈希感知算法;
    
    轮廓形状描述子:
    	链码、边界长度、曲率(HK2003算法)、弯曲能量、签名、弦分布
    	傅里叶形状描述子、B样条、形状不变量
    	PDM形状、近似配准、ASM配准、AAM建模&配准
    
    几何区域描述子:
    	面积、欧拉数、投影、宽高、离心率、细长度、矩形度、方向、紧致度
    	统计矩、凸包、细化骨架(MB/MB2 骨架提取算法)、区域分解、区域邻近图
    	
    
    图像-常用的特定算法:
    	NMS非极大值抑制、Fisher最优分割法-聚类、匈牙利算法-二分图最大匹配
    	Ransac随机采样一致性算法、KD-树最近邻搜索
    	Kohoen特征图-自组织神经网络、Hopfield自组织神经网络
    

    图像基础:

    ​ 灰度图
    阈值化:自适应阈值化、Otsu最优阈值检测
    ​ 直方图:灰度直方图、H-S直方图、直方图均衡化
    ​ 重映射:(几何变换)镜像、反转、反向投影(通过模板直方特征在原图中对定位模板);
    ​ 图像金字塔:高斯-、拉普拉斯-、差分高斯金字塔;(上采样、下采样)
    滤波算子
    ​ 高斯滤波、中值滤波、均值滤波、方框(盒式)滤波、双边滤波、低/高通滤波、引导(导向)滤波
    ​ 边缘检测算子:Canny算子、Sobel算子、Laplacian算子、Scharr滤波
    ​ 频域滤波:Gabor滤波、Frangi滤波
    ​ 时域滤波:
    ​ 限幅滤波、中值滤波、均值滤波、滑动平均滤波、中值平均滤波、限幅平均滤波
    ​ 一阶滞后滤波、加权递推平均滤波、消抖滤波
    ​ Lanczos滤波、卡尔曼滤波、粒子滤波、逆滤波、维纳滤波

    ​ 绘制:线、矩、圆、FloodFill 漫水填充
    轮廓检测
    ​ 形状检测:霍夫直线 & 圆检测、曲线检测
    ​ 椭圆拟合、多边形逼近
    ​ 凸包:不规则图像凸包、最小规则图形凸包、椭圆拟合、逼近多边形曲线

    ​ 模板匹配:平方差法、相关法、系数法…
    ​ 特征匹配:暴力匹配、Flann匹配、BFMatcher匹配
    ​ 矩特征:矩的计算、面积周长计算、质心、一二三阶矩
    ​ 距离变换:透视变换、仿射变换;
    ​ 八链码: 描述曲线或边界的方法,表示曲线和区域边界;
    ​ 傅里叶变换:频域滤波、高斯高/低通滤波;
    ​ 小波变换:
    ​ 图像压缩&编码:

    形态学操作:

    ​ 腐蚀,膨胀;
    ​ 开,闭;
    ​ 形态学梯度、顶帽、黑帽;

    角点检测:

    ​ Harris、Tomasi、亚像素角点;

    边缘检测:

    ​ Canny 边缘检测;
    ​ DoG一阶边缘提取;
    ​ Log拉普拉斯-高斯边缘提取;

    图像分割:

    ​ 分割依赖:基于阈值、基于区域、基于边缘、基于聚类方法、基于基因编码、基于图论方法、基于小波变换

    ​ 分水岭:
    ​ 邻域边缘跟踪:
    ​ 邻域区域生长:
    ​ 最小割最大流:
    ​ GraphCut & GrabCut:
    ​ 聚类法:MeanShift
    ​ …

    特征提取:

    ​ 特征类型:关键点 kp、描述子 [x]、特征图;
    ​ Hog、Sift、Surf、ORB、MSER、LBP、Retina
    ​ Fast、Brisk、Star、GFTT、Dense、SimpleBlob、Akaze、Gist、Freak
    ​ 纹理:Gabor、GLCM、GMRF、GLDS、FD

    对象跟踪:

    ​ BSM(背景消去建模);
    ​ KL 光流法(密集-,稀疏-);
    ​ CamShift、MeanShift(连续自适应);
    ​ 相关滤波(目标)跟踪算法:
    MOSSE, ICF, KCF, DSST, ECOHC, SAMF, Staple, LMCF, LCT, SRDCF, SRDCFdecon, BACF, GOTURN

    展开全文
  • 【计算机视觉】形态学滤波

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

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

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

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


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


    形态学滤波基本知识

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

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

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

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

    展开全文
  • FPGA形态学滤波设计

    2019-04-29 10:52:27
    文章目录顶层框架设计子模块设计比较子模块(min_max)设计一维形态学腐蚀/膨胀子模块(morph_1d)设计二维形态学腐蚀/膨胀子模块(morph_2d)设计二维形态学开运算子模块(morph_open_2d)设计二维形态学Tophat变换模块...
  • OpenCV与EmguCV中的形态学滤波

    千次阅读 2016-06-28 14:41:32
    数学形态学是由一组形态学的代数运算子组成的,它的基本运算有4个: 膨胀、腐蚀、开启和闭合, 它们在二值图像和灰度图像中各有特点。简单来讲,形态学操作就是基于形状的一系列图像处理操作。OpenCV为进行图像的...
  • 形态学滤波算法

    千次阅读 2014-06-23 22:31:00
    由于系统需要对数据进行实时滤波,所以研究了一下fir,iir和
  • LiDAR数据形态学滤波原理

    千次阅读 2015-06-02 22:50:52
    数学形态学:简称形态学,被定义为一种分析空间结构的理论,之所以称为...数学形态学理论用于LiDAR点云数据滤波时一般采用两个复合算子,即“开”算子和“关”算子。为了提取地面点,本文对传统的数学形态学“开”算子
  • Frangi形态学滤波详解

    千次阅读 2019-10-07 04:40:47
    利用Hessian矩阵的滤波函数Frangi,网上的文章只是把论文中的公式贴出来了。 我感觉分析下滤波函数是怎么起作用,还是挺有意思的一件事情。 Frangi滤波方法的论文是:  Frangi A F, Niessen W J, Vincken K L, ...
  • OpenCV4Android开发实录(6):形态学滤波

    千次阅读 2018-06-08 18:04:14
    转载请注明出处: 前言 1. 腐蚀与膨胀 2. 开运算、闭运算、形态学梯度
  • 为解决单一形态学算子在LiDAR数据滤波中的准确性和自动识别问题,提出了一种融合序列形态学算子的城区LiDAR滤波方法.在顾及多种形态学算子优势互补特性和LiDAR不同地物数据特点的基础上,首先利用形态学开运算及白...
  • 参考: http://www.pointclouds.org/documentation/tutorials/progressive_morphological_filtering.php#progressive-morphological-filtering ... 1.航空测量与点云的形态学  ...
  • 卷积(Convolutions)滤波是通过消除特定的空间频率来使图像增强,根据增强类型(低频、中频和高频)不同可分为低通滤波、带通滤波和高通滤波。此外还可以增强图像某些方向特征的方向滤波等。它们的核心部分是卷积核...
  • 基于中值滤波、数学形态学和Canny算子的影像边缘提取方法的研究,袁全斌,,本文提出了一种基于中值滤波、数学形态学和canny边缘提取算子的边缘提取方法。该方法利用中值滤波去掉噪声,然后经数学形态学开运�
  • 上一篇介绍了形态学的基本操作膨胀和腐蚀,我们这一篇将利用膨胀和腐蚀操作实现对图像更高级的形态学操作,而这些都是建立在膨胀和腐蚀操作基础之上。 首先形态学的主要用途是获取物体拓扑和结果信息,它通过物体...
  • 形态学算子

    2019-07-22 15:56:13
    形态学算子的主要思想是用一定形状的结构元素SE(structureelement)在图像中抽取出相应的某些结构,通常可以用于图像的滤波、分割、分类等处理。形态学算子有腐蚀、膨胀、开和闭四种。 腐蚀 腐蚀是...
  • 从这篇文章起,开始将一些较为典型的OpenCV算法通过CUDA进行实现,本文实现的为图像处理中最为常见的形态学腐蚀以及膨胀,由于本文目的在于算法移植后的验证,故在图片的选择上用小图像作为输入的示例图像,有不当之...
  • 在OpenCV中算子 cv::morphologyEx (img, result, cv::MORPH_GRADIENT, cv::Mat()); 可以实现这个功能,函数名与开操作闭操作的相同,只是int op这个参数不同。 角点检测比边缘检测要复杂一些,他需要使用四个结构...
  • 详细介绍了一维情况下灰度形态变换、形态学算子构造的滤波器和提取暂态突变特征等。应用电力系统暂态仿真软件PSCAD/EMTDC,仿真结果表明,在选择合适结构元素的条件下,数学形态算子有很好的滤波功能,对突变信号的检测...
  • 本周新推:基本形态学运算的图像处理。一、c++示例代码//包含头文件 #include &lt;opencv2/opencv.hpp&gt; //命名空间 using namespace cv; using namespace std; //全局函数声明部分 //主函数 int main() ...
  • 针对复杂背景下的红外弱小目标检测问题,提出了一种基于形态学带通滤波和尺度空间理论的红外弱小目标检测算法。采用形态学带通滤波对红外图像进行预处理,得到红外弱小目标的潜在区域;利用高斯差分算子获得预处理后...
  • 在此基础上,借助于张量相似性度量构造基于参考张量的形态学算子,该算子能够实现滤波的输入保持。通过基于形态学梯度的边缘检测实验验证模型的可行性和有效性。对比实验表明基于张量的彩色形态学模型相对于原有的...
  • 形态学之骨架算子

    千次阅读 2018-03-03 10:58:30
    第二,在X缩小的过程中,应当使X的连通性质保持不变的骨架算子介绍1、skeletion(Region:Skeleton::)功能:计算区域的骨骼参数: Region(输入参数):输入区域 Skeleton(输出参数):结果区域2、junctions_...
  • 本文总结了腐蚀,膨胀和开闭操作在二值图像上的应用,基于opencv给出了实例。 参考:《数字图像处理》(第三版) 冈萨雷斯 1、腐蚀 腐蚀的定义为:在二维整数空间中,存在...可以将腐蚀视为形态学滤波,这种操作...
  • 引入形态学算子计算目标区域体态比和紧密度,过滤背景干扰物;采用卡尔曼滤波与匹配矩阵相结合实现多个运动目标的跟踪;通过目标在HSV颜色空间中的H值、目标间的欧氏距离和目标相交面积等特征融合,提高目标跟踪的...
  • 在有限Abelian群中,基于模糊逻辑将二值形态学分级算子推广到灰度图像,研究灰度形态学分级算子。该算子揭示灰度形态学膨胀和腐蚀之间的...比较研究分级算子和非线性中值滤波算子,并通过实例对分级算子进行数值模拟。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,448
精华内容 979
关键字:

形态学滤波算子