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

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


  • 相关阅读:
    Python解释器安装
    有钱就放余额宝的人,这个习惯恐怕要改一改!
    这么详细的存储基础知识,你不看看? 会后悔的!
    超全!华为交换机端口vlan详解~
    华为:鸿蒙绝不是安卓换皮!!!
    VS Code 真的会一统江湖吗?
    用户与安全 -(1)Linux用户及组管理
    运维必看!这个技能薪水28.8万,工资竟然还只是零花钱....
    原来 Linux 日志文件系统是这样工作的~
    干货长文:Linux 文件系统与持久性内存介绍
  • 原文地址:https://www.cnblogs.com/polly333/p/7269843.html
Copyright © 2011-2022 走看看