mihaispr
Administrator
 Inregistrat: acum 18 ani
Postari: 2142
|
|
//cea mai buna metoda pt.extragerea trasaturilor
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include "hvision.h"
int robert[2][2][2]={{{-1,0},{0,1}},{{0,-1},{1,0}}}; // mask int prewitt[2][3][3]={{{-1,-1,-1},{0,0,0},{1,1,1}},{{-1,0,1},{-1,0,1},{-1,0,1}}}; // define mask int sobel[2][3][3]={{{-1,-2,-1},{0,0,0},{1,2,1}},{{-1,0,1},{-2,0,2},{-1,0,1}}}; // define mask double frej_chen[2][3][3]= {{{-1,-1.414213562,-1},{0,0,0},{1,1.41423562,1}},{{-1,0,1},{-1.414213562,0,1.414213562},{-1,0,1}}};
int kirsch[8][3][3]={{{-3,-3,5},{-3,0,5},{-3,-3,5}},{{-3,5,5},{-3,0,5},{-3,-3,-3}},{{5,5,5},{-3,0,-3},{-3,-3,-3}},
{{5,5,-3},{5,0,-3},{-3,-3,-3}},{{5,-3,-3},{5,0,-3},{5,-3,-3}}, // define mask
{{-3,-3,-3},{5,0,-3},{5,5,-3}},{{-3,-3,-3},{-3,0,-3},{5,5,5}},{{-3,-3,-3},{-3,0,5},{-3,5,5}}};
int robinson[8][3][3]={{{-1,0,1},{-2,0,2},{-1,0,1}},{{0,1,2},{-1,0,1},{-2,-1,0}}, // define mask
{{1,2,1},{0,0,0},{-1,-2,-1}},{{2,1,0},{1,0,-1},{0,-1,-2}},
{{1,0,-1},{2,0,-2},{1,0,-1}},{{0,-1,-2},{1,0,-1},{2,1,0}},
{{-1,-2,-1},{0,0,0},{1,2,1}},{{-2,-1,0},{-1,0,1},{0,1,2}}}; Int nevatia_babu[6][5][5]={{{100,100,100,100,100},{100,100,100,100,100},{0,0,0,0,0}, {-100,-100,-100,-100,-100},{-100,-100,-100,-100,-100}}, {{100,100,100,100,100},{100,100,100,78,-32},{100,92,0,-92,-100}, {32,-78,-100,-100,-100},{-100,-100,-100,-100,-100}}, {{100,100,100,32,-100},{100,100,92,-78,-100},{100,100,0,-100,-100}, {100,78,-92,-100,-100},{100,-32,-100,-100,-100}}, {{-100,-100,0,100,100},{-100,-100,0,100,100},{-100,-100,0,100,100}, {-100,-100,0,100,100},{-100,-100,0,100,100}}, {{-100,32,100,100,100},{-100,-78,92,100,100},{-100,-100,0,100,100}, {-100,-100,-92,78,100},{-100,-100,-100,-32,100}}, {{100,100,100,100,100},{-32,78,100,100,100},{-100,-92,0,92,100},
{-100,-100,-100,-78,32},{-100,-100,-100,-100,-100}}}; // mask
void edge_robert(IMAGE *input,IMAGE *output);
void edge_prewitt(IMAGE *input,IMAGE *output);
void edge_sobel(IMAGE *input,IMAGE *output);
void edge_fc(IMAGE *input,IMAGE *output);
void edge_kirsch(IMAGE *input,IMAGE *output);
void edge_robinson(IMAGE *input,IMAGE *output);
void edge_nb(IMAGE *input,IMAGE *output);
int main()
{
IMAGE *img,*img_out;
// Read Image
if((img=hvReadImage("lena.im" ))==NULL)
_exit(0);
img_out=hvMakeImage(512,512,1,SEQUENTIAL,ONEBYTE);
// Do Edge Detection & output to a file
edge_robert(img,img_out);
hvWriteImage(img_out,"lena_robert.im" );
edge_prewitt(img,img_out);
hvWriteImage(img_out,"lena_prewitt.im" );
edge_sobel(img,img_out);
hvWriteImage(img_out,"lena_sobel.im" );
edge_fc(img,img_out);
hvWriteImage(img_out,"lena_frej_chen.im" );
edge_kirsch(img,img_out);
hvWriteImage(img_out,"lena_kirsch.im" );
edge_robinson(img,img_out);
hvWriteImage(img_out,"lena_robinson.im" );
edge_nb(img,img_out);
hvWriteImage(img_out,"lena_nevatia_babu.im" );
return 0;
}
void edge_robert(IMAGE *input,IMAGE *output)
{
int i,j,x,y,k;
int sum[2];
double total;
for(i=0;i<input->height;i++)
for(j=0;j<input->width;j++)
{
for(k=0;k<2;k++)
for(sum[k]=0,x=0;x<2;x++)
for(y=0;y<2;y++)
if(i+x<input->height&&y+j<input->width)
sum[k]+=B_PIX(input,i+x,j+y)*robert[k][x][y];
for(total=0,k=0;k<2;k++)
total+=sqrt(sum[k]*sum[k]);
B_PIX(output,i,j) = (total<24)?255:0; //threshold
}
}
void edge_prewitt(IMAGE *input,IMAGE *output)
{
int i,j,x,y,k;
int sum[2];
double total;
for(i=0;i<input->height;i++)
for(j=0;j<input->width;j++)
{
for(k=0;k<2;k++)
for(sum[k]=0,x=0;x<3;x++)
for(y=0;y<3;y++)
if(i+x<input->height&&y+j<input->width)
sum[k]+=B_PIX(input,i+x,j+y)*prewitt[k][x][y];
for(total=0,k=0;k<2;k++)
total+=sqrt(sum[k]*sum[k]);
B_PIX(output,i,j) = (total<80)?255:0; // threshold
}
}
void edge_sobel(IMAGE *input,IMAGE *output)
{
int i,j,x,y,k;
int sum[2];
double total;
for(i=0;i<input->height;i++)
for(j=0;j<input->width;j++)
{
for(k=0;k<2;k++)
for(sum[k]=0,x=0;x<3;x++)
for(y=0;y<3;y++)
if(i+x<input->height&&y+j<input->width)
sum[k]+=B_PIX(input,i+x,j+y)*sobel[k][x][y];
for(total=0,k=0;k<2;k++)
total+=sqrt(sum[k]*sum[k]);
B_PIX(output,i,j) = (total<95)?255:0; // threshold
}
}
void edge_fc(IMAGE *input,IMAGE *output)
{
int i,j,x,y,k;
double sum[2];
double total;
for(i=0;i<input->height;i++)
for(j=0;j<input->width;j++)
{
for(k=0;k<2;k++)
for(sum[k]=0,x=0;x<3;x++)
for(y=0;y<3;y++)
if(i+x<input->height&&y+j<input->width)
sum[k]+=B_PIX(input,i+x,j+y)*frej_chen[k][x][y];
for(total=0,k=0;k<2;k++)
total+=sqrt(sum[k]*sum[k]);
B_PIX(output,i,j) = (total<85)?255:0; //threshold
}
}
void edge_kirsch(IMAGE *input,IMAGE *output)
{
int i,j,x,y,k;
int sum[8],max;
for(i=0;i<input->height;i++)
for(j=0;j<input->width;j++)
{
for(k=0;k<8;k++)
for(sum[k]=0,x=0;x<3;x++)
for(y=0;y<3;y++)
if(i+x<input->height&&y+j<input->width)
sum[k]+=B_PIX(input,i+x,j+y)*kirsch[k][x][y];
for(max=0,k=0;k<8;k++)
max= (max<sum[k])?sum[k]:max;
B_PIX(output,i,j) = (max<240)?255:0; //threshold
}
}
void edge_robinson(IMAGE *input,IMAGE *output)
{
int i,j,x,y,k;
int sum[8];
double max;
for(i=0;i<input->height;i++)
for(j=0;j<input->width;j++)
{
for(k=0;k<8;k++)
for(sum[k]=0,x=0;x<3;x++)
for(y=0;y<3;y++)
if(i+x<input->height&&y+j<input->width)
sum[k]+=B_PIX(input,i+x,j+y)*robinson[k][x][y];
for(max=0,k=0;k<8;k++)
max= (max<sum[k])?sum[k]:max;
B_PIX(output,i,j) = (max<80)?255:0; //threshold
}
}
void edge_nb(IMAGE *input,IMAGE *output)
{
int i,j,x,y,k;
int sum[6],max;
for(i=0;i<input->height;i++)
for(j=0;j<input->width;j++)
{
for(k=0;k<6;k++)
for(sum[k]=0,x=0;x<5;x++)
for(y=0;y<5;y++)
if(i+x<input->height&&y+j<input->width)
sum[k]+=B_PIX(input,i+x,j+y)*nevatia_babu[k][x][y];
for(max=0,k=0;k<6;k++)
max= (max<sum[k])?sum[k]:max;
B_PIX(output,i,j) = (max<22000)?255:0; //threshold
}
}
// unde functia edge_fc este detectia muchiilor folosind metoda frei-chen, se pastreaza doar functia void edge_kirsch // pentru detectia muchiilor unei imagini folosind metoda edge_kirsch
|
|