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


댓글 없음:
댓글 쓰기