#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;
{
-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);
}
#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
};
*/
{
-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);
}