評估演算法的依據
- 雜訊誤判為邊緣(Edge)
- 沒找出真正邊緣(Edge)
各種邊緣偵測方式
- Soble
- Laplacian
- Canny
- Prewitt
- Scharr
依照對於水平方向或垂直方向的重要程度調整邊緣偵測的權重。
- 計算水平方向變化
- 計算垂直方向變化
- 合併兩個方向的變化,計算邊緣方向強度
cv::Mat srcImg, grayImg;
srcImg = cv::imread( "lena.jpg", cv::IMREAD_COLOR );
cv::cvtColor( srcImg, grayImg, cv::COLOR_BGR2GRAY );
cv::Mat sobelImg;
cv::Mat grad, grad_x, grad_y;
cv::Mat abs_grad_x, abs_grad_y;
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
cv::Sobel( grayImg, grad_x, ddepth, 1, 0, 3, scale, delta, cv::BORDER_DEFAULT );
cv::convertScaleAbs( grad_x, abs_grad_x );
cv::Sobel( grayImg, grad_y, ddepth, 0, 1, 3, scale, delta, cv::BORDER_DEFAULT );
cv::convertScaleAbs( grad_y, abs_grad_y );
cv::addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );
cv::threshold( grad, sobelImg, 100, 255, cv::THRESH_BINARY );
詳細Sample Code請參考GitHub
void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
src
輸入影像dst
輸出影像ddepth
輸出圖的深度 (CV_8U、CV_16U/CV_16S、CV_32F、CV_64F)xorder
x方向的微分階數yorder
y方向的微分階數ksize
Sobel kernel( 1, 3, 5..)scale
縮放值delta
偏移量borderType
pixel extrapolation method (see borderInterpolate for details).
cv::Mat srcImg, grayImg;
srcImg = cv::imread( "lena.jpg", cv::IMREAD_COLOR );
cv::cvtColor( srcImg, grayImg, cv::COLOR_BGR2GRAY );
cv::Mat laplacianImg, grad_16S;
cv::Laplacian( grayImg, grad_16S, CV_16S, 3, 1, 0, cv::BORDER_DEFAULT);
cv::convertScaleAbs( grad_16S, laplacianImg );
詳細Sample Code請參考GitHub
void Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
src
輸入影像dst
輸出影像ddepth
輸出圖的深度ksize
二階導數的濾波器大小( 1, 3, 5..)scale
縮放值delta
偏移量borderType
Pixel extrapolation method. See borderInterpolate for details.
- 作者 Canny, J.F., A computational approach to edge detection. Nov 1986.
- 去雜訊、模糊化 (Noise Reduction) ==> 5x5 Gaussian filter
- 計算梯度方向與強度 (Finding Intensity Gradient) ==> Sobel kernel
- 非最大抑制過濾誤判 (Non-maximum Suppression)
- 用雙門檻值過濾邊緣 (Hysteresis Thresholding)
double minThreshold = 50;
double maxThreshold = 150;
int apertureSize = 3;
bool L2gradient = false;
cv::Mat srcImg, grayImg, cannyImg;
srcImg = cv::imread( "lena.jpg", cv::IMREAD_COLOR );
cv::cvtColor( srcImg, grayImg, cv::COLOR_BGR2GRAY );
cv::Canny( grayImg, cannyImg, minThreshold, maxThreshold, apertureSize, L2gradient );
詳細Sample Code請參考GitHub
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false )
image
輸入影像( 8-bit )edges
輸出影像( 8-bit )threshold1
第一個門檻值(超過此門檻則視為候選者,須參考是否有連結sure-edge
)threshold2
第二個門檻值(超過此門檻則視為sure-edge
)apertureSize
Sobel的aperture sizeL2gradient
true(L2)、false(L1)