OpenCV4入门系列教程49:拉普拉斯算法锐化

入门系列索引:系列教程索引地址

上一篇:OpenCV4入门系列教程48:USM锐化

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

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

2f(x,y)=2fx2+2fy2\bigtriangledown^2 f(x,y)= \frac {\partial^2f}{\partial x^2}+\frac{\partial^2 f}{\partial y^2}

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

2fx2=f(x+1,y)+f(x1,y)2f(x,y)2fy2=f(x,y1)+f(x,y1)2f(x,y)\frac {\partial^2f}{\partial x^2}=f(x+1,y)+f(x-1,y)-2f(x,y) \\ \frac{\partial^2 f}{\partial y^2}=f(x,y-1)+f(x,y-1)-2f(x,y)

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

2f(x,y)=[f(x+1,y)+f(x1,y)+f(x,y1)+f(x,y1)]4f(x,y)\bigtriangledown^2 f(x,y) = [f(x+1,y)+f(x-1,y)+f(x,y-1)+f(x,y-1)]-4f(x,y)

写成filter mask的形式如下,

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

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

函数原型:

1
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,默认设置就好

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main(){
//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);
waitKey(0);
return 0;
}

测试效果为:

lpls

下一篇:OpenCV4入门系列教程50:kalman(卡尔曼)滤波