#include <stdio.h>
//#include "opencv_cfg.h"
#include <cmath>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <algorithm>
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
Mat image=imread("",0);
Mat imageX=Mat::zeros(image.size(),CV_16SC1);
Mat imageY=Mat::zeros(image.size(),CV_16SC1);
Mat imageXY=Mat::zeros(image.size(),CV_16SC1);
Mat imageX8UC;
Mat imageY8UC;
Mat imageXY8UC;
if(!image.data)
{
return -1;
}
GaussianBlur(image,image,Size(3,3),0); //Elimination of noise by Gauss filter
uchar *P=image.data;
uchar *PX=imageX.data;
uchar *PY=imageY.data;
int step=image.step;
int stepXY=imageX.step;
for(int i=1;i<image.rows-1;i++)
{
for(int j=1;j<image.cols-1;j++)
{
//
PX[i*imageX.step+j*(stepXY/step)]=abs(P[(i-1)*step+j+1]+P[i*step+j+1]*2+P[(i+1)*step+j+1]-P[(i-1)*step+j-1]-P[i*step+j-1]*2-P[(i+1)*step+j-1]);
PY[i*imageX.step+j*(stepXY/step)]=abs(P[(i+1)*step+j-1]+P[(i+1)*step+j]*2+P[(i+1)*step+j+1]-P[(i-1)*step+j-1]-P[(i-1)*step+j]*2-P[(i-1)*step+j+1]);
}
}
addWeighted(imageX,0.5,imageY,0.5,0,imageXY);//fuse XY direction
convertScaleAbs(imageX,imageX8UC);
convertScaleAbs(imageY,imageY8UC);
convertScaleAbs(imageXY,imageXY8UC); //Conversion to 8 bit image
Mat imageSobel;
Sobel(image,imageSobel,CV_8UC1,1,1);
imshow("Source Image",image);
imshow("X Direction",imageX8UC);
imshow("Y Direction",imageY8UC);
imshow("XY Direction",imageXY8UC);
imshow("Opencv Soble",imageSobel);
waitKey(0);
return 0;
}
openCV实现Sobel边缘检测
最新推荐文章于 2023-08-07 10:26:18 发布