您的位置:首页 > 其它

使用roberts Prewitt Sobel 三种算子对raw格式图像进行边缘检测

2012-04-20 23:16 821 查看
#include<stdio.h>

#include<math.h>

int Roberts(unsigned char *pnew1Data,unsigned char *pData)

{

for(int i=0;i<255;i++) //roberts!!

for(int j=0;j<255;j++)

{

pnew1Data[i*255+j]=(int)sqrt((pData[i*255+j]*(-1)+pData[i*255+j+1])*(pData[i*255+j]*(-1)+pData[i*255+j+1])+

(pData[i*255+j]*(-1)+pData[(i+1)*255+j])* (pData[i*255+j]*(-1)+pData[(i+1)*255+j]));

}

/* for(i=0;i<256*256;i++) //测试,取阈值为40

{

if(pnew1Data[i]>40)

{

pnew1Data[i]=0;

}

else pnew1Data[i]=255;

}

*/

return 0;

}

int Prewitt(unsigned char *pnew2Data,unsigned char *pData)

{

for(int i=1;i<255;i++) //prewitt!!

for(int j=1;j<255;j++)

{

pnew2Data[i*255+j]=(int)sqrt((pData[i*255+j]*(-1)+pData[(i+1)*255+j]*(-1)+pData[(i+2)*255+j]*(-1)+pData[i*255+j+2]+pData[(i+1)*255+j+2]+pData[(i+2)*255+j+2])*

(pData[i*255+j]*(-1)+pData[(i+1)*255+j]*(-1)+pData[(i+2)*255+j]*(-1)+pData[i*255+j+2]+pData[(i+1)*255+j+2]+pData[(i+2)*255+j+2])

+(pData[i*255+j]*(-1)+pData[i*255+j+1]*(-1)+pData[i*255+j+2]*(-1)+pData[(i+2)*255+j]+pData[(i+2)*255+j+1]+pData[(i+2)*255+j+2])*

((pData[i*255+j]*(-1)+pData[i*255+j+1]*(-1)+pData[i*255+j+2]*(-1)+pData[(i+2)*255+j]+pData[(i+2)*255+j+1]+pData[(i+2)*255+j+2])));

}

return 0;

}

int Sobel(unsigned char *pnew3Data,unsigned char *pData)

{

for(int i=1;i<255;i++) //prewitt!!

for(int j=1;j<255;j++)

{

pnew3Data[i*255+j]=(int)sqrt((pData[i*255+j]*(-1)+pData[(i+1)*255+j]*(-2)+pData[(i+2)*255+j]*(-1)+pData[i*255+j+2]+pData[(i+1)*255+j+2]*2+pData[(i+2)*255+j+2])*

(pData[i*255+j]*(-1)+pData[(i+1)*255+j]*(-2)+pData[(i+2)*255+j]*(-1)+pData[i*255+j+2]+pData[(i+1)*255+j+2]*2+pData[(i+2)*255+j+2])

+(pData[i*255+j]*(-1)+pData[i*255+j+1]*(-2)+pData[i*255+j+2]*(-1)+pData[(i+2)*255+j]+pData[(i+2)*255+j+1]*2+pData[(i+2)*255+j+2])*

((pData[i*255+j]*(-1)+pData[i*255+j+1]*(-2)+pData[i*255+j+2]*(-1)+pData[(i+2)*255+j]+pData[(i+2)*255+j+1]*2+pData[(i+2)*255+j+2])));

}

return 0;

}

void main()

{

unsigned char *pData=new unsigned char[256*256]; //空间声明

unsigned char *pnew1Data=new unsigned char[256*256];

unsigned char *pnew2Data=new unsigned char[256*256];

unsigned char *pnew3Data=new unsigned char[256*256];

FILE *fp;

FILE *fp2;

int i;

//int sort;

fp=fopen("Lena.raw","rb");

if(!fp)

{

printf("Open ERROR!");

}

fread(pData,sizeof(unsigned char),256*256,fp);

for(i=0;i<256*256;i++) //unsigned char到int

{

pnew1Data[i]=(int)pData[i];

pnew2Data[i]=(int)pData[i];

pnew3Data[i]=(int)pData[i];

}

Roberts(pnew1Data,pData);

Prewitt(pnew2Data,pData);

Sobel(pnew3Data,pData);

for(i=0;i<256*256;i++)

{

pnew1Data[i]=(unsigned char)pnew1Data[i];

pnew2Data[i]=(unsigned char)pnew2Data[i];

pnew3Data[i]=(unsigned char)pnew3Data[i];

}

fclose(fp);

//Roberts

fp2=fopen("roberts.raw","wb");

if(!fp2)

{

printf("Open roberts ERROR!\n");

}

fwrite(pnew1Data,256*256,sizeof(unsigned char),fp2);

fclose(fp2);

//Prewitt

fp2=fopen("prewitt.raw","wb");

if(!fp2)

{

printf("open prewitt ERROR!\n");

}

fwrite(pnew2Data,256*256,sizeof(unsigned char),fp2);

fclose(fp2);

//Sobel

fp2=fopen("sobel.raw","wb");

if(!fp2)

{

printf("open sobel ERROR!\n");

}

fwrite(pnew3Data,256*256,sizeof(unsigned char),fp2);

fclose(fp2);

delete[] pData;

delete[] pnew1Data;

delete[] pnew2Data;

delete[] pnew3Data;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐