2014년 12월 17일 수요일

Coin edge detection

edge를 찾을때 G를 계산할때 루트를 씌우지 않았다. 즉, 255*255=65025일 때 픽셀값을 255로 맞추지 않고 여기서는 edge의 임계값을 50000으로 설정하여 세세하게 edge를 찾을 수 있도록 하였다.
 Mask는 convolution을 적용시켜서 값이 대칭이 되도록 초기화하였다.
#include <opencv\cv.h>
#include <opencv\highgui.h>

void main()
{

 IplImage* image = 0;                          // image 선언
    image = cvLoadImage("coins.jpg", 1);     //img.jpg파일을 불러옴 1은 컬러로 받아옴, 0은 흑백으로 받아옴(rgb가 없음)
 int imageRatio = 1;

 CvSize size = cvSize(image->width*imageRatio, image->height*imageRatio);
 
 IplImage *tmpImg = cvCreateImage(size,IPL_DEPTH_8U,3);
 
 int width = image->width;
 int height = image->height;
 int index = image->widthStep;
 int avg;
 for(int i=0; i<height;i++){
  for(int j=0; j<width; j++){
   //gray scale
   int index2 = i*image->widthStep + j*3;
   avg = ((unsigned char)image->imageData[index2+0]+(unsigned char)image->imageData[index2+1]+(unsigned char)image->imageData[index2+2])/3;
   for(int k=0;k<3;k++)
    image->imageData[i*index+j*3+k] = avg;
   
  }
 }

 //sobel edge 
 //배열에서 convolution 됨
 int rSobelMask[3][3] = {-1,0,1,-2,0,2,-1,0,1};
 int cSobelMask[3][3] = {-1,-2,-1,0,0,0,1,2,1};

 int rEdge = 0;
 int cEdge = 0;
 int edgeTHD = 50000;
 for(int i=1;i<height-1;i++){
  for(int j=1;j<width-1;j++){
   rEdge = 0; cEdge = 0;
   for(int x=-1;x<2;x++){
    for(int y=-1;y<2;y++){
     rEdge += (unsigned char)image->imageData[(i+x)*index+(j+y)*3]*rSobelMask[x+1][y+1];
     cEdge += (unsigned char)image->imageData[(i+x)*index+(j+y)*3]*cSobelMask[x+1][y+1];
    }
   }
   int G = (int)sqrt(rEdge*rEdge + cEdge*cEdge);
   if(G > 255) G = 255;
   else G = 0;
   
   for(int k=0;k<3;k++)
    tmpImg->imageData[i*tmpImg->widthStep+j*3+k] = G; 
  }

 }

 cvSaveImage("out.jpg",image);
 cvSaveImage("edge.jpg",tmpImg);
 
 cvNamedWindow( "original", 1);      // 윈도우 생성
 cvNamedWindow( "edge", 1);      // 윈도우 생성

    cvShowImage( "original", image );  // 이미지를 보여줌
    cvShowImage( "edge", tmpImg );  // 이미지를 보여줌
 
 cvWaitKey(0);                    // 사용자의 키 입력을 기다림
    
 
    cvDestroyWindow( "original" ); 
 cvDestroyWindow( "edge" ); 
 
}


결과


댓글 없음:

댓글 쓰기