테두리 검출 - Sobel 연산 자

코드 는 OpenCV 에 의존 하여 데이터 구조 와 디 스 플레이 작업 을 하지만 주요 한 계산법 부분 은 스스로 이 루어 진다.그 다음 에 흔히 볼 수 있 는 집중 가장자리 추출 알고리즘 을 순서대로 제시 하여 실현 하도록 한다.다음 에 원 리 를 보충 해서 설명 으로 미 루 겠 습 니 다.
// Sobel.cpp :              。
//
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "math.h"
#include "stdio.h"
#include "malloc.h"

IplImage *image;						//  IplImage  
int height,width;
CvScalar sclr;

int sobel_y[9]={1,2,1,0,0,0,-1,-2,-1};  //y  sobel  
int sobel_x[9]={1,0,-1,2,0,-2,1,0,-1};  //x  sobel  

//    BGR
inline void cv3DoubleMatPrint( const CvMat* mat )
{
	int i, j;
	for( i = 0; i < mat->rows; i++ )
	{
		for( j = 0; j < mat->cols; j++ )
		{
			CvScalar scal = cvGet2D( mat, i, j );
			printf( "(%f,%f,%f) ", scal.val[0], scal.val[1], scal.val[2] );
		}
		printf( "
" ); } } //Sobel void sobel() { int i,j,k; int gray_x=0, gray_y=0, gray; int *data; int temp[9]; data = (int *)malloc(height*width*sizeof(int));// for(i=0;i<height;i++) // { for(j=0;j<width;j++) { sclr=cvGet2D(image,i,j); gray=(int)sclr.val[0]; data[i*width+j]=gray; } } for(i=1;i<height-1;i++) { for(j=1;j<width-1;j++) { gray_x=0; gray_y=0; sclr=cvGet2D(image,i,j); temp[0]=data[width*(i-1)+j-1]; temp[1]=data[width*(i-1)+j]; temp[2]=data[width*(i-1)+j+1]; temp[3]=data[width*i+j-1]; temp[4]=data[width*i+j]; temp[5]=data[width*i+j+1]; temp[6]=data[width*(i+1)+j-1]; temp[7]=data[width*(i+1)+j]; temp[8]=data[width*(i+1)+j+1]; for(k=0;k<9;k++) gray_y+=temp[k]*sobel_y[k]; for(k=0;k<9;k++) gray_x+=temp[k]*sobel_x[k]; //sclr.val[0]=(gray_x+gray_y);// //=======================================// // sclr.val[0]= abs(gray_x) + abs(gray_y); // , , if (sclr.val[0]<200) sclr.val[0] = 0; else sclr.val[0] = 255; //=======================================// cvSet2D(image,i,j,sclr); } } free(data); } int main( int argc, char** argv ) { IplImage* img = cvLoadImage("test.jpg"); cvNamedWindow( "img" ); // cvShowImage( "img", img ); // image = cvLoadImage( "test.jpg", 0); height=image->height; width=image->width; sobel(); //cvWaitKey(0); //===========================================// //mat = cvGetMat( image, &cvmat ); //cv3DoubleMatPrint( mat ); //===========================================// cvNamedWindow( "Image", 1 ); // cvShowImage( "Image", image ); // cvWaitKey(0); // cvDestroyWindow( "Image" ); // cvReleaseImage( &image ); // return 0; }

좋은 웹페이지 즐겨찾기