prewitt和sobel算子 边缘检测

#include "cv.h"
#include "highgui.h"
#include <math.h>


#pragma comment(lib, "cv.lib")  
#pragma comment(lib, "cxcore.lib")  
#pragma comment(lib, "highgui.lib") 


void prewitt(IplImage *src,IplImage *dst)  
{  
int i,j;
IplImage *dstx,*dsty;
int temp;  
 float tempx,tempy;
 uchar* ptrx,* ptry;
 double min_val = 0, max_val = 0;

 //定义prewitt算子的模板  

//sobel算子

/*

 float sobel[9] =           
 {  
  -1,-2,-1,  
  0,0,0,  
 1,2,1  
 };  
 float sobel[9] =   
 {  
  -1,0,1,  
  -2,0,2,  
  -1,0,1  
 };  

*/


 float prewittx[9] =           
 {  
  -1,-1,-1,  
  0,0,0,  
 1,1,1  
 };  
 float prewitty[9] =   
 {  
  -1,0,1,  
  -1,0,1,  
  -1,0,1  
 };  
 CvMat px; 
 CvMat py;     
 px = cvMat(3,3,CV_32F,prewittx);     
 
 py = cvMat(3,3,CV_32F,prewitty); //为输出图像申请空间  
 dstx = cvCreateImage(cvGetSize(src),8,1);   
 dsty = cvCreateImage(cvGetSize(src),8,1); //对图像使用模板,自动填充边界  
 cvFilter2D(src,dstx,&px,cvPoint(-1,-1));   
 cvFilter2D(src,dsty,&py,cvPoint(-1,-1)); //计算梯度,范数为2,注意学习指针的使用方法  
  
 ptrx = (uchar*) dstx->imageData;  
 ptry = (uchar*) dsty->imageData;  
 for(i = 0;i<src->height;i++)  
 {  
  for(j = 0;j<src->width;j++)  
  {  
   tempx = ptrx[i*dstx->widthStep+j];  
   tempy = ptry[i*dsty->widthStep+j];   
   temp = (int) sqrt(tempx*tempx+tempy*tempy);  
 if (temp>125)
temp=255;
else temp=0;  
   dst->imageData[i*dstx->widthStep+j] = temp;  
  }  
 }   
 //取图并显示像中的最大最小像素值  
 cvMinMaxLoc(dst,&min_val,&max_val,NULL,NULL,NULL);     
// printf("max_val = %f\nmin_val = %f\n",max_val,min_val);  
   
 //计算梯度,范数为1  
 //cvAdd(dstx,dsty,dst);  
 cvSaveImage("PrewittImg.jpg", dst);//把图像存入文件  
 cvReleaseImage(&dstx);  
 cvReleaseImage(&dsty);  
 cvNamedWindow("prewitt",1);  
 cvShowImage("prewitt",dst); 
 cvWaitKey(0);
}  
void main()
{
IplImage *src,*dst;
src=cvLoadImage("1.jpg",0);
dst=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
cvNamedWindow("src",1);
cvShowImage("src",src);
//cvSmooth(src,src,CV_GAUSSIAN,3,3,0,0);
cvSmooth(src,src,CV_MEDIAN,3,3,0,0);
cvThreshold(src,src,95,255,CV_THRESH_BINARY);

//cvSobel(src,dst,1,1,3);

//cvErode(src,src,NULL,1);
//cvDilate(src,src,NULL,1);
prewitt(src,dst);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值