code xu ly anh

10
Câu 1. Xây dựng và cài đặt thuật toán làm âm ảnh. void Negatives(IplImage *imgin, IplImage *imgout) { cvNot(imgin, imgout); } void HistogramEqualization(IplImage *imgin, IplImage *imgout) { cvEqualizeHist(imgin,imgout); } void HistogramOpenCV(IplImage *imgin, double p[L]) { int histSize[] = {L}; float hranges[] = {0,L-1}; float* ranges[] = {hranges}; CvHistogram* hist; hist = cvCreateHist(1,histSize,CV_HIST_ARRAY,ranges); cvCalcHist(&imgin,hist); cvNormalizeHist(hist,1.0); int r; for (r=0; r<L; r++) p[r] = cvQueryHistValue_1D(hist,r); cvReleaseHist(&hist); return; } void LocalHistogramCV(IplImage *imgin, IplImage *imgout) { int m = 3, n = 3; CvMat *w1 = cvCreateMat(m,n,CV_8UC1); CvMat *w2 = cvCreateMat(m,n,CV_8UC1); int M = cvGetSize(imgin).height; int N = cvGetSize(imgin).width; int x, y, a, b, s, t; a = m/2; b = n/2; CvScalar value; for (x=a; x<M-a; x++) for (y=b; y<N-b; y++) { for (s=-a; s<=a; s++) for (t=-b; t<=b; t++) { value = cvGet2D(imgin,x+s,y+t); cvSet2D(w1,s+a,t+b,value); } cvEqualizeHist(w1,w2); value = cvGet2D(w2,a,b); cvSet2D(imgout,x,y,value);

Upload: maivcong

Post on 30-Jul-2015

50 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Code xu ly anh

Câu 1. Xây dựng và cài đặt thuật toán làm âm ảnh.

void Negatives(IplImage *imgin, IplImage *imgout)

{

cvNot(imgin, imgout);

}

void HistogramEqualization(IplImage *imgin, IplImage *imgout)

{

cvEqualizeHist(imgin,imgout);

}

void HistogramOpenCV(IplImage *imgin, double p[L])

{

int histSize[] = {L};

float hranges[] = {0,L-1};

float* ranges[] = {hranges};

CvHistogram* hist;

hist = cvCreateHist(1,histSize,CV_HIST_ARRAY,ranges);

cvCalcHist(&imgin,hist);

cvNormalizeHist(hist,1.0);

int r;

for (r=0; r<L; r++)

p[r] = cvQueryHistValue_1D(hist,r);

cvReleaseHist(&hist);

return;

}

void LocalHistogramCV(IplImage *imgin, IplImage *imgout)

{

int m = 3, n = 3;

CvMat *w1 = cvCreateMat(m,n,CV_8UC1);

CvMat *w2 = cvCreateMat(m,n,CV_8UC1);

int M = cvGetSize(imgin).height;

int N = cvGetSize(imgin).width;

int x, y, a, b, s, t;

a = m/2; b = n/2;

CvScalar value;

for (x=a; x<M-a; x++)

for (y=b; y<N-b; y++) {

for (s=-a; s<=a; s++)

for (t=-b; t<=b; t++) {

value = cvGet2D(imgin,x+s,y+t);

cvSet2D(w1,s+a,t+b,value);

}

cvEqualizeHist(w1,w2);

value = cvGet2D(w2,a,b);

cvSet2D(imgout,x,y,value);

Page 2: Code xu ly anh

}

cvReleaseMat(&w1);

cvReleaseMat(&w2);

return;

}

void HistogramStatistics(IplImage *imgin, IplImage *imgout)

{

int m = 3, n = 3;

CvMat *w = cvCreateMat(m,n,CV_8UC1);

int a = m/2, b = n/2;

int N = cvGetSize(imgin).width;

int M = cvGetSize(imgin).height;

CvScalar mG,sigmaG;

CvScalar msxy, sigmasxy;

cvAvgSdv(imgin,&mG,&sigmaG);

int x,y,s,t;

double E = 4.0, k0 = 0.4, k1 = 0.02, k2 = 0.4;

CvScalar value;

for (x=a; x<M-a; x++)

for (y=b; y<N-b; y++) {

for (s=-a; s<=a; s++)

for (t=-b; t<=b; t++) {

value = cvGet2D(imgin,x+s,y+t);

cvSet2D(w,s+a,t+b,value);

}

cvAvgSdv(w,&msxy,&sigmasxy);

value = cvGet2D(imgin,x,y);

if ((msxy.val[0] < k0*mG.val[0]) && (k1*sigmaG.val[0] <=

sigmasxy.val[0] && sigmasxy.val[0] <= k2*sigmaG.val[0]))

value.val[0] *= E;

cvSet2D(imgout,x,y,value);

}

cvReleaseMat(&w);

return;

}

Câu 9:

void SmoothLinearFilterOld(IplImage *imgin, IplImage *imgout)

{

int m = 35, n = 35;

CvMat *w = cvCreateMat(m,n,CV_32FC1);

int x, y;

CvScalar value;

for (x=0; x<m; x++)

for (y=0; y<n; y++) {

value.val[0] = 1.0/(m*n);

cvSet2D(w,x,y,value);

}

cvFilter2D(imgin,imgout,w);

cvReleaseMat(&w);

return;

Page 3: Code xu ly anh

}

Hoặc:

cvSmooth(imgin,imgout,CV_BLUR,15,15);

Câu 10:

cvSmooth(imgin,imgout,CV_MEDIAN,3);

void Gradient(IplImage *imgin, IplImage *imgout)

{

IplImage *gx = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_32F,1);

IplImage *gy = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_32F,1);

IplImage *Mag = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_32F,1);

int M = cvGetSize(imgin).height;

int N = cvGetSize(imgin).width;

int x, y;

for (x=0; x<M; x++)

for (y=0; y<N; y++)

{

cvSet2D(gx,x,y,cvGet2D(imgin,x,y));

cvSet2D(gy,x,y,cvGet2D(imgin,x,y));

}

int m = 3, n = 3;

CvMat *Sobelx = cvCreateMat(m,n,CV_32FC1);

CvMat *Sobely = cvCreateMat(m,n,CV_32FC1);

CvScalar value;

CvScalar *valueArr = new CvScalar[9];

int arr1[3][3] = {{-1,-2,-1},{0,0,0},{1,2,1}};

int arr2[3][3] = {{-1,0,1}, {-2,0,2},{-1,0,1}};

value.val[0] = 1;

value.val[0] = 1;

cvSet2D(Sobelx,0,0,value);

for (x=0; x<m; x++)

for (y=0; y<n; y++)

{

value.val[0] = arr1[x][y];

cvSet2D(Sobelx,x,y,value);

value.val[0] = arr2[x][y];

cvSet2D(Sobely,x,y,value);

}

cvFilter2D(gx,gx,Sobelx);

cvFilter2D(gy,gy,Sobely);

Page 4: Code xu ly anh

cvAdd(gx,gy,Mag);

double max,r;

double mintemp;

cvMinMaxLoc(Mag,&mintemp,&max);

for (x=0; x<M; x++)

for (y=0; y<N; y++) {

value = cvGet2D(Mag,x,y);

value.val[0] = (1.0*value.val[0]/max*255);

cvSet2D(imgout,x,y,value);

}

cvReleaseImage(&gx);

cvReleaseImage(&gy);

cvReleaseImage(&Mag);

cvReleaseMat(&Sobelx);

cvReleaseMat(&Sobely);

return;

}

void Laplace(IplImage *imgin, IplImage *imgout)

{

IplImage *temp = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_32F,1);

int M = cvGetSize(imgin).height;

int N = cvGetSize(imgin).width;

int x, y;

for (x=0; x<M; x++)

for (y=0; y<N; y++)

cvSet2D(temp,x,y,cvGet2D(imgin,x,y));

int m=3, n=3;

CvMat *w = cvCreateMat(3,3,CV_32FC1);

CvScalar value;

value.val[0] = 1;

for (x=0; x<m; x++)

for (y=0; y<n; y++)

cvSet2D(w,x,y,value);

value.val[0] = -8;

cvSet2D(w,1,1,value);

cvFilter2D(temp,temp,w);

double min,max;

cvMinMaxLoc(temp,&min,&max);

for (x=0; x<M; x++)

for (y=0; y<N; y++) {

Page 5: Code xu ly anh

value = cvGet2D(temp,x,y);

value.val[0] = (value.val[0] - min)/(max-min)*(L-1);

cvSet2D(imgout,x,y,value);

}

cvReleaseImage(&temp);

cvReleaseMat(&w);

return;

}

void UnsharpMask(IplImage *imgin, IplImage *imgout)

{

double sigma=3, sum;

int x, y;

int m = 5, n = 5;

//double **fbar, **gmask;

IplImage *fbar = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_32F,1);

IplImage *gmask = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_32F,1);

IplImage *f = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_32F,1);

int M = cvGetSize(imgin).height;

int N = cvGetSize(imgin).width;

for (x=0; x<M; x++)

for (y=0; y<N; y++)

{

cvSet2D(fbar,x,y,cvGet2D(imgin,x,y));

cvSet2D(gmask,x,y,cvGet2D(imgin,x,y));

cvSet2D(f,x,y,cvGet2D(imgin,x,y));

}

// Tao mat na Gauss

CvMat *Gauss = cvCreateMat(m,n,CV_32FC1);

CvScalar value,value2;

value.val[0] = 1;

//Gauss = (double **)Alloc2D(m,n,sizeof(double));

for (x=-m/2; x<=m/2; x++)

for (y=-n/2; y<=n/2; y++)

{

value.val[0] = exp(-(1.0*x*x+1.0*y*y)/(2*sigma*sigma));

cvSet2D(Gauss,x+2,y+2,value);

}

//value = cvSum(Gauss);

//sum = value.val[0];

sum = 0;

Page 6: Code xu ly anh

for (x=0; x<m; x++)

for (y=0; y<n; y++)

{

value = cvGet2D(Gauss,x,y);

sum += value.val[0];

}

for (x=0; x<m; x++)

for (y=0; y<n; y++){

value = cvGet2D(Gauss,x,y);

value.val[0]=value.val[0]/sum;

cvSet2D(Gauss,x,y,value);

//Gauss[x][y] = Gauss[x][y]/sum;

}

cvFilter2D(fbar,fbar,Gauss);

//ConvolutionDouble(f, M, N, fbar, Gauss, m, n, TRUE);

//gmask = (double **)Alloc2D(M,N,sizeof(double));

for (x=0; x<M; x++)

for (y=0; y<N; y++)

{

value = cvGet2D(f,x,y);

value2 = cvGet2D(fbar,x,y);

value.val[0] = value.val[0] - value2.val[0];

cvSet2D(gmask,x,y,value);

//gmask[x][y] = (f[x][y] - fbar[x][y]);

}

int s;

double k = 4.5;

for (x=0; x<M; x++)

for (y=0; y<N; y++) {

value = cvGet2D(f,x,y);

value2 = cvGet2D(gmask,x,y);

//s = int(f[x][y] + k*gmask[x][y]);

value.val[0] = int(value.val[0] + k*value2.val[0] );

if (s > 255)

s = 255;

if (s < 0)

s = 0;

//g[x][y] = s;

cvSet2D(imgout,x,y,value);

}

cvReleaseImage(&fbar);

cvReleaseImage(&gmask);

cvReleaseImage(&f);

cvReleaseMat(&Gauss);

return;

}

Page 7: Code xu ly anh

Chương 9:

void Erosion(IplImage *imgin, IplImage *imgout)

{

int m=3, n=3;

IplConvKernel *element =

cvCreateStructuringElementEx(m,n,m/2,n/2,CV_SHAPE_RECT);

cvErode(imgin,imgout,element);

cvReleaseStructuringElement(&element);

return;

}

void Dilation(IplImage *imgin, IplImage *imgout)

{

int m=3, n=3;

IplConvKernel *element =

cvCreateStructuringElementEx(m,n,m/2,n/2,CV_SHAPE_CROSS);

cvDilate(imgin,imgout,element);

cvReleaseStructuringElement(&element);

return;

}

void Opening(IplImage *imgin, IplImage *imgout)

{

int m=3, n=3;

IplConvKernel *element =

cvCreateStructuringElementEx(m,n,m/2,n/2,CV_SHAPE_RECT);

IplImage *temp = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_8U,1);

cvMorphologyEx(imgin,imgout,temp,element,CV_MOP_OPEN);

cvReleaseStructuringElement(&element);

cvReleaseImage(&temp);

return;

}

void MyClosing(IplImage *imgin, IplImage *imgout)

{

int m=5, n=5;

IplConvKernel *element =

cvCreateStructuringElementEx(m,n,m/2,n/2,CV_SHAPE_RECT);

IplImage *temp = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_8U,1);

cvMorphologyEx(imgin,imgout,temp,element,CV_MOP_CLOSE,2);

cvReleaseStructuringElement(&element);

cvReleaseImage(&temp);

return;

}

void Boundary(IplImage *imgin, IplImage *imgout)

{

int m=3, n=3;

Page 8: Code xu ly anh

IplConvKernel *element =

cvCreateStructuringElementEx(m,n,m/2,n/2,CV_SHAPE_RECT);

IplImage *temp = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_8U,1);

cvErode(imgin,temp,element);

cvAddWeighted(imgin,1,temp,-1,0,imgout);

cvReleaseStructuringElement(&element);

cvReleaseImage(&temp);

return;

}

IplImage *HoleFill(IplImage *imgin)

{

IplImage *imgout = cvCloneImage(imgin);

CvScalar value = {L-1};

cvFloodFill(imgout,cvPoint(258,147),value);

return imgout;

}

Chương 10:

void LineDetectionLaplace (IplImage *imgin, IplImage *imgout) { // Dung dao ham cap hai de phat hien duong thang int m = 3, n = 3; CvMat *w = cvCreateMat(m,n,CV_32FC1); int x, y; for (x=0; x<m; x++) for (y=0; y<n; y++) { if (x==m/2 && y==n/2) cvSet2D(w,x,y,cvScalar(-8)); else cvSet2D(w,x,y,cvScalar(1)); } IplImage *temp = cvCreateImage(cvGetSize(imgin),IPL_DEPTH_32F,1); int M = cvGetSize(imgin).height; int N = cvGetSize(imgin).width; CvScalar value; for (x=0; x<M; x++) for (y=0; y<N; y++) { value = cvGet2D(imgin,x,y); cvSet2D(temp,x,y,value); } cvFilter2D(temp,temp,w); double min, max; cvMinMaxLoc(temp,&min,&max); for (x=0; x<M; x++) for (y=0; y<N; y++) { value = cvGet2D(temp,x,y); value.val[0] = (value.val[0]-min)/(max-min)*(L-1); cvSet2D(imgout,x,y,value); }

Page 9: Code xu ly anh

cvReleaseImage(&temp); return; }

Chương 4:

void SmoothingFrequencyFilter(IplImage *imgin, IplImage *imgout)

{

int M = imgin->height;

int N = imgin->width;

int x, y;

int P = 2*M, Q = 2*N;

// Buoc 1,2 va 3: Mo rong anh va them zero

// va nhan voi (-1)^(x+y) de chuyen F(0,0) vao tam anh

IplImage *F = cvCreateImage(cvSize(Q,P),IPL_DEPTH_32F,2);

cvSetZero(F);

CvScalar value;

for (x=0; x<M; x++)

for (y=0; y<N; y++) {

value = cvGet2D(imgin,x,y);

if ((x+y)%2 == 1)

value.val[0] = -value.val[0];

value.val[1] = 0;

cvSet2D(F,x,y,value);

}

// Buoc 4: Bien doi Fourier thuan

cvDFT(F,F,CV_DXT_FORWARD);

// Buoc 5: Tao ham loc H va thuc hien phep nhan G = HF

IplImage *H = cvCreateImage(cvSize(Q,P),IPL_DEPTH_32F,2);

double D0 = 30;

double Duv;

int u, v;

int n = 2;

for (u=0; u<P; u++)

for (v=0; v<Q; v++) {

Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));

/*

// Loc thong thap ly tuong

if (Duv <= D0) {

value.val[0] = 1;

value.val[1] = 1;

cvSet2D(H,u,v,value);

}

else {

value.val[0] = 0;

value.val[1] = 0;

cvSet2D(H,u,v,value);

}

// Loc thong thap Butterworth

Page 10: Code xu ly anh

value.val[0] = 1.0/(1.0 + pow(Duv/D0,2.0*n));

value.val[1] = value.val[0];

cvSet2D(H,u,v,value);

*/

// Loc thong cao Gauss

value.val[0] = 1.0 - exp(-Duv*Duv/(2*D0*D0));

value.val[1] = value.val[0];

cvSet2D(H,u,v,value);

}

IplImage *G = cvCreateImage(cvSize(Q,P),IPL_DEPTH_32F,2);

cvMul(H,F,G);

// Buoc 6: Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)

cvDFT(G,G,CV_DXT_INVERSE_SCALE);

for (x=0; x<P; x++)

for (y=0; y<Q; y++) {

value = cvGet2D(G,x,y);

if ((x+y)%2 == 1)

value.val[0] = -value.val[0];

value.val[1] = 0;

cvSet2D(G,x,y,value);

}

// Buoc 7: Bo phan them vao

for (x=0; x<M; x++)

for (y=0; y<N; y++) {

value = cvGet2D(G,x,y);

cvSet2D(imgout,x,y,value);

}

cvReleaseImage(&F);

cvReleaseImage(&H);

cvReleaseImage(&G);

return;

}