code xu ly anh
TRANSCRIPT
![Page 1: Code xu ly anh](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/1.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/2.jpg)
}
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/3.jpg)
}
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/4.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/5.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/6.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/7.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/8.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/9.jpg)
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](https://reader031.vdocuments.pub/reader031/viewer/2022020207/5572106b497959fc0b8d22a7/html5/thumbnails/10.jpg)
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;
}