OpenCV笔记(十五)——使用Laplace算子进行图像的边缘检测
生活随笔
收集整理的這篇文章主要介紹了
OpenCV笔记(十五)——使用Laplace算子进行图像的边缘检测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在筆記十四中,我們使用了Sobel算子對圖像進行邊緣檢測,理論依據是像素變化最快的地方最有可能是邊緣處,所以使用sobel算子對圖像做微分,得到的結果圖像當中灰度較大的區域,即為邊緣處。
在這里,我們使用Laplace算子來做邊緣檢測,也是類似的道理,只不過換成了二階微分,在一階微分的極大值的地方,二階微分為零。我們以二階微分為零的區域作為邊緣。當然了一階微分極小值的地方,即圖像變化很慢很慢的地方,二階微分也可能為零。所以我們還需要進行額外的濾波。
?
在理論上是這樣,但是在實現上,OpenCV使用了類似sobel算子的方法,并且在Laplace算子的運用中,一行二階微分和列二階微分的加法結合在一起,用一個kernel計算完畢。
?
先看看OpenCV當中運用Laplace算子的函數:
void cv::Laplacian( InputArray _src, OutputArray _dst, int ddepth, int ksize,?double scale, double delta, int borderType )
使用方式和Sobel相似。
部分實現代碼如下:
1 if( ksize == 1 || ksize == 3 ) 2 { 3 float K[2][9] = 4 {{0, 1, 0, 1, -4, 1, 0, 1, 0}, 5 {2, 0, 2, 0, -8, 0, 2, 0, 2}}; 6 Mat kernel(3, 3, CV_32F, K[ksize == 3]); 7 if( scale != 1 ) 8 kernel *= scale; 9 filter2D( src, dst, ddepth, kernel, Point(-1,-1), delta, borderType ); 10 }?
OpenCV中使用Laplacian的例子:
1 int main( int, char** argv ) 2 { 3 4 Mat src, src_gray, dst; 5 int kernel_size = 3; 6 int scale = 1; 7 int delta = 0; 8 int ddepth = CV_16S; 9 const char* window_name = "Laplace Demo"; 10 11 /// Load an image 12 src = imread( argv[1] ); 13 14 if( !src.data ) 15 { return -1; } 16 17 /// Remove noise by blurring with a Gaussian filter 18 GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT ); 19 20 /// Convert the image to grayscale 21 cvtColor( src, src_gray, COLOR_RGB2GRAY ); 22 23 /// Create window 24 namedWindow( window_name, WINDOW_AUTOSIZE ); 25 26 /// Apply Laplace function 27 Mat abs_dst; 28 29 Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT ); 30 convertScaleAbs( dst, abs_dst ); 31 32 /// Show what you got 33 imshow( window_name, abs_dst ); 34 35 waitKey(0); 36 37 return 0; 38 } View Code?
轉載于:https://www.cnblogs.com/nipan/p/4147302.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的OpenCV笔记(十五)——使用Laplace算子进行图像的边缘检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到别人炒菜是什么意思
- 下一篇: 晚上梦到蛇在床上是什么征兆