2014년 12월 17일 수요일

Laplacian edge detection

sobel과 달리 하나의 배열을 가지고 계산함
#include <opencv\cv.h>
#include <opencv\highgui.h>

void main()
{

 IplImage* image = 0;                          // image 선언
    image = cvLoadImage("img.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;
   
  }
 }


 //라플라시안
 int laplacianMask[3][3] = {-1,-1,-1,-1,8,-1,-1,-1,-1};

 int edge;
 for(int i=1;i<height-1;i++){
 for(int j=1;j<width-1;j++){
 edge = 0;   
 for(int x=-1;x<2;x++){
 for(int y=-1;y<2;y++){
 edge += (unsigned char)image->imageData[(i+x)*index+(j+y)*3]*laplacianMask[x+1][y+1];
 }
 }
  
 if(edge >255) edge = 255;
 else if(edge<0) edge = 0;
 for(int k=0;k<3;k++)
 tmpImg->imageData[i*tmpImg->widthStep+j*3+k] = edge; 
 }

 }

 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" ); 
 
}



결과


댓글 없음:

댓글 쓰기