前言
在上一章中描述了Sobel邊緣檢測(cè)算子,詳細(xì)描述可點(diǎn)擊查看(http://www.reibang.com/writer#/notebooks/47386368/notes/82286161)
目標(biāo)
本章中催蝗,將學(xué)習(xí):
- Laplance算子理論
- 相關(guān)API
- 代碼演示
Laplance算子理論
-
理論:在二階導(dǎo)數(shù)的時(shí)候切威,最大變化處的值為零即邊緣是零值。通過二階導(dǎo)數(shù)計(jì)算丙号,依據(jù)此理論我們可以計(jì)算圖像二階導(dǎo)數(shù)先朦,提取邊緣。
對(duì)應(yīng)的算子梯度如下:
還是上面這個(gè)圖像犬缨,我們求一階導(dǎo)數(shù)之后喳魏,還能求其二級(jí)導(dǎo)數(shù)。這個(gè)時(shí)候怀薛,當(dāng)初圖像上變化最大的位置刺彩,二階導(dǎo)數(shù)為0,首先我們看一下離散的一階導(dǎo)數(shù)的計(jì)算方法:
再對(duì)一階導(dǎo)數(shù)求導(dǎo)得出二階導(dǎo)數(shù):
因?yàn)閳D像有行列兩個(gè)方向枝恋,所以要兩個(gè)方向分別求導(dǎo)數(shù):
拉普拉斯算子由OpenCV函數(shù)cv::Laplacian實(shí)現(xiàn)创倔。實(shí)際上,由于拉普拉斯算子使用圖像的梯度焚碌,因此它在內(nèi)部調(diào)用Sobel算子來(lái)執(zhí)行其計(jì)算畦攘。 - 處理流程
1.高斯模糊 - 去噪聲GaussianBlur()
2.轉(zhuǎn)換為灰度圖像cvtColor()
3.拉普拉斯 - 二階導(dǎo)數(shù)計(jì)算Laplacian()
4.取絕對(duì)值convertScaleAbs()
5.顯示結(jié)果
相關(guān)API
void Laplacian(
InputArray src,
OutputArray dst,
int ddepth,
int ksize = 3,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
);
- InputArray類型的src ,輸入圖像十电。
- OutputArray類型的dst 知押,輸出圖像叹螟,圖像的大小、通道數(shù)和輸入圖像相同台盯。
- int類型的ddepth罢绽,目標(biāo)圖像的所需深度。
- int類型的ksize静盅,用于計(jì)算二階導(dǎo)數(shù)濾波器的孔徑大小良价。大小必須是正數(shù)和奇數(shù)。
- double類型的scale温亲,計(jì)算拉普拉斯值的可選比例因子棚壁。默認(rèn)情況下,不應(yīng)用縮放栈虚。
- double類型的delta袖外,在將篩選的像素存儲(chǔ)到dst中之前添加到這些像素的可選值。說(shuō)的有點(diǎn)專業(yè)了其實(shí)就是給所選的像素值添加一個(gè)值delta魂务。
- int類型的borderType曼验,用于推斷圖像外部像素的某種邊界模式。有默認(rèn)值BORDER_DEFAULT粘姜。
代碼演示
int main(int argc, char** argv) {
Mat src, dst;
src = imread(STRPAHT2);
if (!src.data) {
printf("could not load image");
}
//降噪
Mat gray_src, edge_image;
GaussianBlur(src, dst, Size(3, 3), 0, 0);
//灰度
cvtColor(dst, gray_src, CV_BGR2GRAY);
//拉普拉斯 – 二階導(dǎo)數(shù)計(jì)算Laplacian()
Laplacian(gray_src, edge_image, CV_16S, 3);
//取絕對(duì)值
convertScaleAbs(edge_image, edge_image);
//二值化
threshold(edge_image, edge_image, 0, 255, THRESH_OTSU | THRESH_BINARY);
imshow("Laplaiance", edge_image);
waitKey(0);
return 0;
}