zoukankan      html  css  js  c++  java
  • 图像处理-拉普拉斯算法

    一、引言

           图像锐化处理的作用是使灰度反差增强,从而使模糊图像变得更加清晰。图像模糊的实质就是图像受到平均运算或积分运算,因此可以对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。

    二、卷积算法

    2.1卷积原理

              因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。此原理实际为卷积操作,也可以理解为一种图像变换,最常见的图像变换(image transform,即将一幅图像转变成图像数据)就是傅里叶变换(Fourier transform),即将图像转换成源图像数据的另一种表示,而卷积是大多数变换的基础。

    我们可以用方程来表示这个过程。我们首先定义图像为I(x,y),核为G(x,y),

    参考点位于相应核的(ai,aj)坐标上,则卷积H(x,y)定义如下:

    边缘部分使用复制处理,计算方法如下图所示:

    2 .2 opencv卷积函数说明

    void cvFilter2D( const CvArr* src, CvArr* dst,  const CvMat* kernel,  CvPoint  chor=cvPoint(-1,-1));
    src:输入图像
    dst:输出图像
    kernel:卷积核, 单通道浮点矩阵. 如果想要应用不同的核于不同的通道,先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
    anchor:核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。缺省值 (-1,-1) 表示锚点在核中心。

    其实在利用此卷积函数是,根据核的不同可以产生各种的图像处理,比如:

    [转载]卷积滤波模板

    #include <iostream>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/core/core.hpp>  
    #include <opencv/cv.hpp>  
      
    using namespace std;  
    using namespace cv;  
    int main()  
    {  
        string picName="lena.jpg";  
        Mat A=imread (picName,CV_LOAD_IMAGE_COLOR);  
          
        Mat mask=(Mat_<char>(3,3)<<0,-1,0,   -1,5,-1,    0,-1,0);    
          
        Mat B;  
        filter2D (A,B,A.depth (),mask);  
          
        imshow("A的图像",A);  
        imshow("B的图像",B);  
          
        waitKey ();  
        return 0;  
    }

    三、拉普拉斯算法

    3.1 拉普拉斯原理说明

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

          在一个二维函数f(x,y)中,x,y两个方向的二阶差分分别为,

    CodeCogsEqn(3)

    CodeCogsEqn(4)

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

    写成filter mask的形式如下,


            注意该(a)的mask的特点,mask在上下左右四个90度的方向上结果相同,也就是说在90度方向上无方向性。为了让该mask在45度的方向上也具有该性质,对该filter mask进行扩展定义为(b)。

             将Laplace算子写成filter mask后,其操作大同小异于其他的空间滤波操作。将filter mask在原图上逐行移动,然后mask中数值与其重合的像素相乘后求和,赋给与mask中心重合的像素,对图像的第一,和最后的行和列无法做上述操作的像素赋值零,就得到了拉普拉斯操作结果。

    3.2 opencv函数应用

    Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
    src_gray,输入图像
    dst,Laplace操作结果
    ddepth,输出图像深度,因为输入图像一般为CV_8U,为了避免数据溢出,输出图像深度应该设置为CV_16S
    kernel_size,filter mask的规模,我们的mask时3x3的,所以这里应该设置为3
    scale,delta,BORDER_DEFAULT,默认设置就好
    //load the Original Image and get some informations
    Mat src = imread("012.jpg",0);
    namedWindow("OriginalImage");
    imshow("OriginalImage",src);
    CV_Assert(src.depth() == CV_8U);
    
    //OpenCV solution - Laplacian
    Mat dst,abs_dst_laplace;
    Laplacian(src,dst,CV_16S,3);
    convertScaleAbs(dst,abs_dst_laplace);
    
    //show the result
    namedWindow("result_laplacian");
    imshow("result_laplacian",abs_dst_laplace);

    original

    上图中上图为原图像,有图为拉普拉斯之后的图像。


  • 相关阅读:
    使用jQuery淡入淡出HTML文本效果
    php一个诡异而简单的错误
    Android Tasker应用之自动查询并显示话费流量套餐信息
    ListView在应用开发中较为常用的做法
    网址收藏(网页制作源码下载网址、后台源码下载网址、域名注册网址)
    Flex4事件的监听与发布
    收拾心情,安安静静的学习
    ASP.NET development sever 在Windows server 2008/Vista显示页面无法找到 [转帖]
    花点时间搞清top、postop、scrolltop、scrollHeight、offsetHeight[转帖]
    HTTP 错误 401.2 Unauthorized 由于身份验证头无效,您无权查看此页。 IIS7.0解决办法
  • 原文地址:https://www.cnblogs.com/polly333/p/7269843.html
Copyright © 2011-2022 走看看