使用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;
}
#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;
}
相关文章推荐
- 13. 用Roberts、Sobel、Prewitt和Laplace算子对一幅灰度图像进行边缘检测。观察异同。
- matlab边缘检测代码(包含roberts,sobel,prewitt三种算子)
- 图像梯度特征的常用边缘检测算子:Sobel、Prewitt、Roberts
- 图像边缘检测与边缘增强处理——(Roberts、prewitt、sobel)
- 简述:MATLAB中使用Laplace算子对彩色图像进行边缘检测的方法
- [ZZ] 边缘检测 梯度与Roberts、Prewitt、Sobel、Lapacian算子
- 几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny
- 边缘检测类(包括Roberts, Sobel, Prewitt, Kirsch等算子的边缘检测算法) - wtuyzh的专栏 - CSDNBlog
- 使用OpenCV对图像作边缘检测(Canny、Sobel、Laplace)
- OpenCV2马拉松第14圈——边缘检测(Sobel,prewitt,roberts)
- 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)
- 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)
- 使用Scharr 算子进行边缘检测
- 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)
- delphi FMX图像简单的边缘检测(sobel、prewitt、robert)
- 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)
- optimize_aop.hdev对sobel边缘检测算子 AOP的对不同大小图像并行加速效果 相关例程学习
- OpenCV使用Sobel滤波器实现图像边缘检测
- Opencv图像识别从零到精通(19)----Robert,prewitt,Sobel边缘检测
- 图像处理算法4——Sobel 边缘检测算子