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

댓글 없음:
댓글 쓰기