Laplace算子和Sobel算子一樣,屬於空間銳化濾波操作。起本質與前面的Spatial Filter操作大同小異,下面就通過Laplace算子來介紹一下空間銳化濾波,並對OpenCV中提供的Laplacian函數進行一些說明。
數學原理
離散函數導數
離散函數的導數退化成了差分,一維一階差分公式和二階差分公式分別為,
Laplace算子的差分形式
分別對Laplace算子x,y兩個方向的二階導數進行差分就得到了離散函數的Laplace算子。
在一個二維函數f(x,y)中,x,y兩個方向的二階差分分別為,
所以Laplace算子的差分形式為,
寫成filter mask的形式如下,
| 0 | 1 | 0 |
| 1 | -4 | 1 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
| 1 | -8 | 1 |
| 1 | 1 | 1 |
有時我們也會見到不同於上述結果的Laplace算子的filter mask,
| 0 | -1 | 0 |
| -1 | 4 | -1 |
| 0 | -1 | 0 |
| -1 | -1 | -1 |
| -1 | 8 | -1 |
| -1 | -1 | -1 |
其原因是在定義二階導數的時候采用了相反的定義,這個無關緊要,但是要注意,當用Laplace算子濾波后的圖像與原圖疊加時,混合操作是加還是減因上述的定義而異。
圖像的Laplace操作
如同本文開始時說的那樣,將Laplace算子寫成filter mask后,其操作大同小異於其他的空間濾波操作。將filter mask在原圖上逐行移動,然后mask中數值與其重合的像素相乘后求和,賦給與mask中心重合的像素,對圖像的第一,和最后的行和列無法做上述操作的像素賦值零,就得到了拉普拉斯操作結果。
拉普拉斯操作結果與原圖的混合
因為Laplace算子是二階導數操作,其在強調圖像素中灰度不連續的部分的同時也不在強調灰度值連續的部分。這樣會產生一個具有很明顯的灰度邊界,但是沒有足夠特征的黑色背景。背景特征可以通過原圖像與Laplace算子操作后的圖像混合恢復。用公式,
其中的參數c的取值和上面的兩種mask定義有關,當mask中心的數值取正時c=-1,相反c=1;
Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
src_gray: 輸入圖像。
dst: 輸出圖像
ddepth: 輸出圖像的深度。 因為輸入圖像的深度是 CV_8U ,這里我們必須定義 ddepth = CV_16S 以避免外溢。
kernel_size: 內部調用的 Sobel算子的內核大小,此例中設置為3。
scale, delta 和 BORDER_DEFAULT: 使用默認值。
最后應將輸出圖像的深度轉化為 CV_8U : convertScaleAbs( dst, abs_dst );
高斯模糊-灰度-拉普拉斯計算-絕對值(convertScaleAbs)-顯示結果
1 #include <opencv2/opencv.hpp>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 using namespace cv; 6 using namespace std; 7
8 char file[] = "1.jpg"; 9 int main(int argc, char** argv) 10 { 11 Mat img = imread(file, -1); 12 pyrDown(img, img, Size(img.cols/2, img.rows/2)); 13 imshow("1",img); 14
15 Mat gray, laplaci, final; 16
17 //高斯模糊
18 GaussianBlur(img, img, Size(5,5), 0, 0); 19
20 //轉灰度圖像
21 cvtColor(img, gray, CV_BGR2GRAY); 22 imshow("gray", gray);imwrite("gray.jpg", gray); 23
24 //拉普拉斯處理
25 Laplacian(gray, laplaci, CV_16S, 3, 1, 0); 26
27 //絕對值處理
28 convertScaleAbs(laplaci, laplaci); 29
30 //展示圖像
31 imshow("laplaci", laplaci);imwrite("laplaci.jpg", laplaci); 32
33 //后期處理
34 Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1,-1)); 35 morphologyEx(laplaci, final, CV_MOP_TOPHAT, kernel); 36 threshold(final, final,100, 255, THRESH_TOZERO_INV); 37 threshold(final, final,20, 90, THRESH_BINARY); 38 imshow("final", final);imwrite("final.jpg", final); 39
40 waitKey(); 41 return 1; 42 }
原圖

gray

拉普拉斯

final

