總結:roberts運算元檢測方法對具有陡峭的低雜訊的影象處理效果較好,但是利用
roberts
運算元提取邊緣的結果是邊緣比較粗,因此邊緣的定位不是很準確。
sobel運算元檢測方法對灰度漸變和雜訊較多的影象處理效果較好,
sobel
運算元對邊緣定位不是很準確,影象的邊緣不止乙個畫素。
prewitt運算元檢測方法對灰度漸變和雜訊較多的影象處理效果較好。但邊緣較寬,而且間斷點多。
laplacian運算元法對雜訊比較敏感,所以很少用該運算元檢測邊緣,而是用來判斷邊緣畫素視為與影象的明區還是暗區。
canny方法不容易受雜訊干擾,能夠檢測到真正的弱邊緣。優點在於,使用兩種不同的閾值分別檢測強邊緣和弱邊緣,並且當弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出影象中。
用sobel,laplace檢測**:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include #include #includeusing namespace cv;
int main( int argc, char** argv )
//高斯模糊
gaussianblur( src, src, size(3,3), 0, 0, border_default );
//變換為灰度圖
cvtcolor( src, src_gray, cv_rgb2gray );
//建立視窗
namedwindow( window_name, cv_window_autosize );
//生成 grad_x and grad_y
mat grad_x, grad_y;
mat abs_grad_x, abs_grad_y;
// gradient x x方向梯度 1,0:x方向計算微分即導數
//scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, border_default );
sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, border_default );
convertscaleabs( grad_x, abs_grad_x );
// gradient y y方向梯度 0,1:y方向計算微分即導數
//scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, border_default );
sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, border_default );
convertscaleabs( grad_y, abs_grad_y ); //取絕對值
//近似總的梯度
addweighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad ); //將兩幅影象疊加
cv::mat dstimage;
// 拉普拉斯變換
laplacian(src, dstimage, cv_16s, 3);
convertscaleabs( dstimage, dstimage);
cv::imshow("srcimage", src);
cv::imshow("dstimage", dstimage);
cv::imshow( window_name, grad );
waitkey(0);
return 0;
}
結果: OpenCV學習筆記 6 邊緣檢測筆記
void roberts inputarray src,outputarray dst,int ddepth,int x 1,int y 0,int bordertype border default void conv2d inputarray src,inputarray kernel,outp...
OpenCV學習筆記(十三)邊緣檢測
邊緣檢測 邊緣檢測運算元有很多,sobel laplace prewitt canny marr hildresh。sobel運算元 sobel運算元是主要用於邊緣檢測的離散微分運算元,它結合了高斯平滑和微分求導,用於計算影象灰度函式的近似梯度。void sobel inputarray src,o...
opencv學習19 邊緣檢測
一 1.呼叫api實現邊緣檢測 1 讀入灰度影象 2 使用高斯濾波去除影象中的一些雜訊點,平滑影象 3 使用canny邊緣檢測演算法 2.cv2.gaussianblur img,size,sigmax 高斯濾波,去除影象雜訊點,使影象整體平滑 img,原影象 size,濾波視窗 高斯矩陣尺寸 通常...