作者:翟天保Steven
版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處
函數(shù)原型
void Laplacian( InputArray src, OutputArray dst, int ddepth,
int ksize = 1, double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
參數(shù)說明
- InputArray類型的src,輸入圖像,8位圖像。
- OutputArray類型的dst,輸出圖像,。
- int類型的ddepth,輸出圖像的深度,。若src為CV_8U,則可取-1/CV_16S/CV_32F/CV_64F;若src為CV_16U/CV_16S,可取-1/CV_32F/CV_64F;若src為CV_32F,可取-1/CV_32F/CV_64F;若src為CV_64F,可取-1/CV_64F。
- int類型的ksize,默認(rèn)值為3,表示Sobel核的大小,取奇數(shù),。
- double類型的scale,計(jì)算導(dǎo)數(shù)值時(shí)選的縮放因子,默認(rèn)為1,。
- double類型的delta,表示在結(jié)果存入目標(biāo)圖之前可選的delta值,默認(rèn)為0。
- int類型的borderType,邊界模式,。
函數(shù)原理
? ? ? ?Laplacian算子是n維歐幾里德空間中的一個(gè)二階微分算子,定義為梯度grad的散度div,。因此如果f是二階可微的實(shí)函數(shù),則f的拉普拉斯算子定義如下:
1)f的拉普拉斯算子也是笛卡爾坐標(biāo)系中的所有非混合二階偏導(dǎo)數(shù)求和。
2)作為一個(gè)二階微分算子,拉普拉斯算子把C函數(shù)映射到C函數(shù),。對(duì)于k大于等于2時(shí),定義算子,。
? ? ? ?根據(jù)圖像處理的原理可知,二階導(dǎo)數(shù)可以用來進(jìn)行檢測邊緣。因?yàn)閳D像是二維,需要在兩個(gè)方向進(jìn)行求導(dǎo),。使用Laplacian算子將會(huì)使求導(dǎo)過程變得簡單,。
? ? ? ?Laplacian算子的定義為:
測試代碼
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 加載圖片
Mat src = imread("test.jpg");
if (src.empty())
{
cout << "picture load error!" << endl;
return 0;
}
Mat blur, gray, result, abs_result;
// 高斯濾波
GaussianBlur(src, blur, Size(3, 3), 0, 0, BORDER_DEFAULT);
// 轉(zhuǎn)為灰度圖像
cvtColor(blur, gray, COLOR_RGB2GRAY);
// 拉普拉斯
Laplacian(gray, result, CV_16S, 5, 1, 0, BORDER_DEFAULT);
// 計(jì)算絕對(duì)值
convertScaleAbs(result, abs_result);
// 結(jié)果顯示
imshow("src", src);
imshow("result", abs_result);
waitKey(0);
return 0;
}
測試效果
? ? ? ?注意由于Laplacian使用了圖像梯度,所以其內(nèi)部代碼其實(shí)調(diào)用了Sobel算子。利用Sobel算子的運(yùn)算,計(jì)算出x方向和y方向的導(dǎo)數(shù),進(jìn)而得到載入圖像的拉普拉斯變換結(jié)果,。
? ? ? ?當(dāng)尺寸為3*3時(shí),拉普拉斯算子的模板為:
? ? ? ?如果文章幫助到你了,可以點(diǎn)個(gè)贊讓我知道,我會(huì)很快樂~加油!