【特征检测】差分近乎图像导数算子之Laplace算子

【特征检测】差分近似图像导数算子之Laplace算子

背景简述

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

基本理论

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

【特征检测】差分近乎图像导数算子之Laplace算子

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

【特征检测】差分近乎图像导数算子之Laplace算子  【特征检测】差分近乎图像导数算子之Laplace算子

(a)                                                                                                          (b)

【特征检测】差分近乎图像导数算子之Laplace算子

(c)

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

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

【特征检测】差分近乎图像导数算子之Laplace算子

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

【特征检测】差分近乎图像导数算子之Laplace算子

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

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

【特征检测】差分近乎图像导数算子之Laplace算子

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

参考代码

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()  

输出测试

原始图像所示:

【特征检测】差分近乎图像导数算子之Laplace算子

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

【特征检测】差分近乎图像导数算子之Laplace算子

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

【特征检测】差分近乎图像导数算子之Laplace算子

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

参考文献

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

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

========================================================= 转载请注明出处:http://blog.csdn.net/songzitea/article/details/12842825
=========================================================
2楼jia20003前天 13:48
很好,不错,你把python写出了C++的味道,哈哈
1楼xiaojidan2011前天 13:43
不错