C++実現sobel
4997 ワード
**c++実現sobe**l私はc++でよく使う画像処理アルゴリズムを全部書いて、理解を深めて、そして自分でコードを書く構想を訓練するつもりです.今日は最も簡単な画像処理アルゴリズムから書きます!sobelはエッジ検出演算子で、xとy方向の3*3のテンプレートがある.sobelの原理は簡単ですが、コードを書くときはいくつかの細部に注意してください.
ここではopencvの一般的な関数を使用します.1.Opencvでは、画像の座標系は左上隅を原点とし、水平右をx軸、垂直下をy軸、すなわちimgである.rowsは実はY軸方向、img.colsはx軸方向です.imgを使用する.at(y,x)はこのように表現すべきである.2.ボリュームを作成するときは、エッジピクセルを空けておくと、次元が合わないエラーが発生します.
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のアルゴリズムの構想はやはり簡単で、注意しなければならないのは細かいことです!