openCV实现Sobel边缘检测


#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;
}

猜你喜欢

转载自blog.csdn.net/qq_38527408/article/details/80660586