エッジ検出
1、Sobelオペレータは、離散微分演算子(離散微分演算子)です。近似勾配画像強度関数を計算するために使用されます。
Sobelオペレータ及びガウシアン平滑化誘導体の結合の差動。エッジ画像における有意な変化は、一次導関数の極値のエッジを得ることができます。
図2に示すように、二次導関数を使用して、ラプラス演算子は、エッジを検出するために使用することができます。画像のエッジで、一次導関数が極値、及び二次導関数のゼロ交差です。
画像は「2-D」であるため、我々は両方の方向に微分を必要とします。導出過程が簡単になりますラプラス演算子を使用してください。
図3に示すように、キャニーオペレータは、ジョンF.キャニーは、多くの人々は、エッジ検出のための最適なアルゴリズムと考えられている、1986年にマルチレベルのエッジ検出アルゴリズムを開発しています
エッジ検出の最適な三つの主要な評価基準は以下のとおりです。
低エラーレートが:偽陽性を低減しつつ、可能な限り実際のエッジを識別可能なノイズを生成しました。
高い位置決め:できるだけ近い実エッジ画像で識別されるエッジ。
最小応答:画像のエッジは一度だけ識別することができます。
*ヒステリシス閾値:最終ステップ、キャニーヒステリシス閾値を用いては、ヒステリシス閾値は、二つの閾値(高閾値および低閾値)を必要とします。
画素位置の大きさが高しきい値を超えた場合、ピクセルは予約エッジ画素です。
画素位置の大きさが低閾値未満である場合、ピクセルは除外されます。
大きさが保持されている場合は二つの閾値の間での画素位置が、画素に接続された画素のみが高閾値を超えている場合。
*キャニー推奨高:低閾値比2:1:1-3。
4出典:
Mat edge_sobel(Mat src)
{
Mat dst, src_gray;
GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);
/// 转换为灰度图
if (src.channels() > 1)
{
cvtColor(src, src_gray, CV_RGB2GRAY);
}
else
{
src_gray = src.clone();
}
Mat grad;
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
/// 创建 grad_x 和 grad_y 矩阵
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
/// 求 X方向梯度
Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
/// 求Y方向梯度
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);
//imshow("x", abs_grad_x);
//imshow("y", abs_grad_y);
imshow("Sobel", grad);
return grad;
}
Mat edge_laplacian(Mat src)
{
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
Mat src_gray;
if (src.channels() > 1)
{
cvtColor(src, src_gray, CV_RGB2GRAY);
}
else
{
src_gray = src.clone();
}
Mat edge;
GaussianBlur(src_gray, src_gray, Size(3, 3), 0, 0, BORDER_DEFAULT);
Laplacian(src_gray, edge, ddepth, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(edge, edge);
imshow("Laplacian", edge);
return edge;
}
Mat edge_canny(Mat src,double th1,double th2)
{
Mat edge;
GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);
Canny(src, edge, th1, th2);
imshow("Canny", edge);
return edge;
}
int main(int argc, char** argv)
{
Mat img = imread("2.jpg", IMREAD_COLOR);
imshow("img", img);
edge_sobel(img);
edge_laplacian(img);
edge_canny(img,20,60);
waitKey(0);
}
5、営業成績
マイクロチャンネル公衆番号にもっと注意:ML_Study