C++実現sobel

4997 ワード

**c++実現sobe**l私はc++でよく使う画像処理アルゴリズムを全部書いて、理解を深めて、そして自分でコードを書く構想を訓練するつもりです.今日は最も簡単な画像処理アルゴリズムから書きます!sobelはエッジ検出演算子で、xとy方向の3*3のテンプレートがある.sobelの原理は簡単ですが、コードを書くときはいくつかの細部に注意してください.
#include
#include
#include
using namespace cv;
using namespace std;

int xGradient(Mat img, int x, int y);
int yGradient(Mat img, int x, int y);

int main()
{
    int Gx, Gy, sum;
    Mat img = imread("1.jpg", 0);
    Mat dst = img.clone();
    if(!img.data)
        return -1;

    for ( int y = 0; y < img.rows; y++)
    {
        for( int x = 0; x < img.cols; x++)
        {
            dst.at(y,x) = 0.0;
        }
    }

    for ( int y = 1; y < img.rows - 1; y++ )
    {
        for ( int x = 1; x < img.cols - 1 ; x++ )//    ,-1  ,       
        {
            Gx = xGradient(img, x, y);
            Gy = yGradient(img, x, y);
            sum = abs(Gx) + abs(Gy);
            sum = sum > 255 ? 255 : sum;
            sum = sum < 0 ? 0 : sum;
            dst.at(y,x) = sum;
        }
    }

    imshow("final",dst);
    waitKey(0);
    return 0;

}

int xGradient(Mat image, int x, int y)
{
    int gx;
    gx = image.at(y-1,x+1) + 2*image.at(y,x+1) + image.at(y+1,x+1)
         - image.at(y-1,x-1) - 2*image.at(y,x-1) -image.at(y-1,x-1);
    return gx;
}
int yGradient(Mat image, int x, int y)
{
    int gy;
    gy = image.at(y-1,x+1) + 2*image.at(y-1,x) + image.at(y+1,x+1)
         - image.at(y-1,x-1) - 2*image.at(y+1,x) -image.at(y-1,x-1);
    return gy;
}

ここではopencvの一般的な関数を使用します.1.Opencvでは、画像の座標系は左上隅を原点とし、水平右をx軸、垂直下をy軸、すなわちimgである.rowsは実はY軸方向、img.colsはx軸方向です.imgを使用する.at(y,x)はこのように表現すべきである.2.ボリュームを作成するときは、エッジピクセルを空けておくと、次元が合わないエラーが発生します.
sobelのアルゴリズムの構想はやはり簡単で、注意しなければならないのは細かいことです!