Xu Ly Anh So

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

void Negatives(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
       uchar r, s;
       for (int x=0; x<M; x++)
              for (int y=0; y<N; y++) {
                     r = imgin.at<uchar>(x,y);
                     s = L-1-r;
                     imgout.at<uchar>(x,y) = s;
              }
       return;
}




Câu 2. Xây dựng và cài đặt thuật toán biến đổi logarit ảnh.

void Logarithm(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
       uchar r, s;
       double c = (L-1)/log(1.0*L);
       for (int x=0; x < M; x++)
              for (int y=0; y < N; y++) {
                     r = imgin.at<uchar>(x,y);
                     if (r == 0) r = 1;
                     s = (uchar)(c*log(1.0 + r));
                     imgout.at<uchar>(x,y) = s;
              }
       return;
}



Câu 3. Xây dựng và cài đặt thuật toán biến đổi lũy thừa ảnh.

void Power(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
       uchar r;
       double s;
       double gamma = 5.0, c = pow(L-1,1-gamma);
       for (int x=0; x<M; x++)
              for (int y=0; y<N; y++) {
                     r = imgin.at<uchar>(x,y);
                     if (r == 0)
                           r = 1;
                     s = c*pow(r,gamma);
                     imgout.at<uchar>(x,y) = (uchar)s;
              }
       return;
}



Câu 4. Xây dựng và cài đặt thuật toán biến đổi tuyến tính từng phần.

void PiecewiseLinear(Mat imgin, Mat imgout)
{
       double rmin, rmax;
       minMaxLoc(imgin,&rmin,&rmax);
       double r, s, r1 = rmin, s1 = 0, r2 = rmax, s2 = L-1;
       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = imgin.at<uchar>(x,y);
                     if (r < r1)
                           s = s1/r1*r;
                     else if (r < r2)
                           s = (s2-s1)/(r2-r1)*(r-r1)+s1;
                     else
                           s = (L-1-s2)/(L-1-r2)*(r-r2)+s2;
                     imgout.at<uchar>(x,y) = (uchar)s;
              }
       return;
}



Câu 6. Xây dựng và cài đặt thuật toán cân bằng histogram(đặc tả histogram)

void HistogramEqualization(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y;
       int h[L];
       int r;
       for (r=0; r<L; r++)  h[r] = 0;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = imgin.at<uchar>(x,y);
                     h[r]++;
              }
       double p[L];
       for (r=0; r<L; r++) p[r] = 1.0*h[r]/(M*N);
       double s[L];
       int j, k;
       for (k=0; k<L; k++) {
              s[k] = 0;
              for (j=0; j<=k; j++)
                     s[k] += p[j];
              s[k] = (L-1)*s[k];
       }

       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = imgin.at<uchar>(x,y);
                     imgout.at<uchar>(x,y) = (uchar)s[r];
              }
       return;
}



Câu 7. Xây dựng và cài đặt thuật toán cân bằng histogram cục bộ.

void LocalHistogram(Mat imgin, Mat imgout)
{
       int m=3, n=3;
       Mat w = Mat(m,n,CV_8U);
       Mat wout = Mat(m,n,CV_8U);
       int a=m/2, b=n/2;
       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y, s, t;
       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++)
                                  w.at<uchar>(s+a,t+b) = imgin.at<uchar>(x+s,y+t);
                     equalizeHist(w,wout);
                     imgout.at<uchar>(x,y) = wout.at<uchar>(a,b);
              }
       return;
}



Câu 8. Xây dựng và cài đặt thuật toán nâng cao chất lượng ảnh bằng thống kê histogram.

void HistogramStatistics(Mat imgin, Mat imgout)
{
       double mG, sigmaG;
       Scalar mean, stddev;
       meanStdDev(imgin,mean,stddev);
       mG = mean.val[0];
       sigmaG = stddev.val[0];
       double msxy, sigmasxy, E = 4.0, k0 = 0.4, k1 = 0.02, k2 = 0.4;

       int m=3, n=3;
       Mat w = Mat(m,n,CV_8U);
       int a=m/2, b=n/2;
       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y, s, t;
       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++)
                                  w.at<uchar>(s+a,t+b) = imgin.at<uchar>(x+s,y+t);
                     meanStdDev(w,mean,stddev);
                     msxy = mean.val[0];
                     sigmasxy = stddev.val[0];
                     if ((msxy <= k0*mG) && (k1*sigmaG <= sigmasxy && sigmasxy <= k2*sigmaG))
                           imgout.at<uchar>(x,y) = (uchar)(E*imgin.at<uchar>(x,y));
                     else
                           imgout.at<uchar>(x,y) = imgin.at<uchar>(x,y);
              }
       return;
}



Câu 9.  Xây dựng và cài đặt thuật toán lọc tuyến tính làm trơn.

void MySmooth(Mat imgin, Mat imgout)
{
       int m=35, n=35;
       Mat w = Mat(m,n,CV_32F);
       int x, y;
       for (x=0; x<m; x++)
              for (y=0; y<n; y++)
                     w.at<float>(x,y) = 1.0/(m*n);
       filter2D(imgin,imgout,CV_8U,w);
       return;
}



Câu 10. Xây dựng và cài đặt thuật toán lọc median.

void Sort(Mat w)
{
       int m = w.size().height;
       int n = w.size().width;
       int i, j;
       uchar temp;
       for (i=0; i<m*n-1; i++)
              for (j=i+1; j<m*n; j++)
                     if (w.data[i] > w.data[j]) {
                           temp = w.data[i];
                           w.data[i] = w.data[j];
                           w.data[j] = temp;
                     }
       return;
}

void MedianFilter(Mat imgin, Mat imgout)
{
       int m=5, n=5;
       Mat w = Mat(m,n,CV_8U);
       int a=m/2, b=n/2;
       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y, s, t;
       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++)
                                  w.at<uchar>(s+a,t+b) = imgin.at<uchar>(x+s,y+t);
                     Sort(w);
                     imgout.at<uchar>(x,y) = w.at<uchar>(a,b);
              }
       return;
}



Câu 11. Xây dựng và cài đặt thuật toán nâng cao chất lượng ảnh bằng đạo hàm cấp một.

void Gradient(Mat imgin, Mat imgout)
{
       Mat gx = Mat(imgin.size(),CV_32F);
       Mat gy = Mat(imgin.size(),CV_32F);
       Sobel(imgin,gx,CV_32F,1,0);
       Sobel(imgin,gy,CV_32F,0,1);

       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y;
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = abs(gx.at<float>(x,y)) + abs(gy.at<float>(x,y));
                     if (r > L-1)
                           r = L-1;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}



Câu 12. Xây dựng và cài đặt thuật toán nâng cao độ nét của ảnh bằng đạo hàm cấp hai.

void Sharpen(Mat imgin, Mat imgout)
{
       Mat w = (Mat_<float>(3,3) << 1,1,1,1,-8,1,1,1,1);
       Mat temp = Mat(imgin.size(),CV_32F);
       filter2D(imgin,temp,CV_32F,w);
       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y;
       float r, s, c = -1;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = imgin.at<uchar>(x,y) + c*temp.at<float>(x,y);
                     if (r > L-1)
                           r = L-1;
                     if (r < 0)
                           r = 0;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}



Câu 13. Xây dựng và cài đặt thuật toán nâng cao độ nét ảnh bằng mặt nạ làm nhòe và lọc tăng cường.

void HighBoostFiltering(Mat imgin, Mat imgout)
{
       Mat temp = Mat(imgin.size(),CV_8U);
       GaussianBlur(imgin,temp,Size(5,5),3.0);
       Mat mask = Mat(imgin.size(),CV_32F);
       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y;
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = 1.0*imgin.at<uchar>(x,y) - 1.0*temp.at<uchar>(x,y);
                     mask.at<float>(x,y) = r;
              }
       float k = 4.5;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = 1.0*imgin.at<uchar>(x,y) + k*mask.at<float>(x,y);
                     if (r > L-1)
                           r = L-1;
                     if (r < 0)
                           r = 0;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}



Câu 14. Xây dựng và cài đặt thuật toán Erosion.

void Erosion(Mat imgin, Mat imgout)
{
       Mat w = getStructuringElement(MORPH_RECT,Size(45,45));
       erode(imgin,imgout,w);
}



Câu 15. Xây dựng và cài đặt thuật toán Dilation.

void Dilation(Mat imgin, Mat imgout)
{
       Mat w = getStructuringElement(MORPH_CROSS,Size(3,3));
       dilate(imgin,imgout,w);
}




Câu 16. Xây dựng và cài đặt thuật toán Opening.

void Opening(Mat imgin, Mat imgout)
{
       Mat w = getStructuringElement(MORPH_RECT,Size(3,3));
       morphologyEx(imgin, imgout, MORPH_OPEN,w);
}



Câu 17. Xây dựng và cài đặt thuật toán Closing.

void Closing(Mat imgin, Mat imgout)
{
       Mat w = getStructuringElement(MORPH_RECT,Size(3,3));
       morphologyEx(imgin,imgout,MORPH_CLOSE,w);
}



Câu 18. Xây dựng và cài đặt thuật toán trích biên.

void Boundary(Mat imgin, Mat imgout)
{
       Mat w = getStructuringElement(MORPH_RECT,Size(3,3));
       Mat temp = Mat(imgin.size(),CV_8UC1);
       erode(imgin,temp,w);
       imgout = imgin - temp;
}



Câu 19. Xây dựng và cài đặt thuật toán lấp lỗ trống.

void HoleFill(Mat imgin, Mat imgout)
{
       imgin.copyTo(imgout);
       floodFill(imgout,Point(262,144),CV_RGB(255,255,255));
}



Câu 20. Xây dựng và cài đặt thuật toán phát hiện cạnh ảnh bằng đạo hàm cấp hai.

void LineDetect(Mat imgin, Mat imgout)
{
       Mat w = (Mat_<float>(3,3) << 2,-1,-1,-1,2,-1,-1,-1,2);
       Mat temp = Mat(imgin.size(),CV_32F);
       filter2D(imgin,temp,CV_32F,w);
       int M = imgin.size().height;
       int N = imgin.size().width;
       int x, y;
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = temp.at<float>(x,y);
                     if (r < 0)
                           r = 0;
                     temp.at<float>(x,y) = r;
              }
       double max;
       minMaxLoc(temp,0,&max);
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     r = temp.at<float>(x,y);
                     if (r > 0.7*max)
                           r = L-1;
                     else
                           r = 0;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
}



Câu 22. Xây dựng thuật toán phát hiện cạnh Marr – Hildreth.


Ta có hàm Gauss
 Được gọi là độ lệch chuẩn
 được gọi là phương sai
Ta dùng hàm Gauss để làm trơn ảnh và lọc nhiễu.
Suy ra đạo hàm cấp 2 của Gauss
Đạo hàm cấp 2 của hàm 2 chiều Gauss còn được gọi là Laplace của Gauss và viết tắt là LoG.
Thuật toán Marr-Hildreth gồm các bước sau đây.
                + Dùng mặt nạ Gauss để làm trơn ảnh
                + Tính Laplace của ảnh ở bước 1.
                + tìm điểm cắt 0 của ảnh đạo hàm cấp 2, điểm cắt 0 là điểm ảnh ở bước 2 mà trước đó có giá trị dương và sau đó có giá trị âm và ngược lại.
Ta thường cho  =  4 và kích thước của bộ lọc là n = 6



Câu 23. Xây dựng thuật toán phát hiện cạnh Canny.

void EdgeDetect(Mat imgin, Mat imgout)
{
       Mat temp = Mat(imgin.size(),CV_8UC1);
       GaussianBlur(imgin,temp,Size(0,0),3);
       double threshold = 20;
       Canny(temp,imgout,threshold,3*threshold);
       return;
}



Câu 24. Xây dựng thuật toán liên kết cạnh bằng xử lý cục bộ. (câu 26)

Câu 25. Xây dựng thuật toán liên kết cạnh bằng xử lý trên miền.(câu 26)

Câu 26. Xây dựng và cài đặt thuật toán biến đổi Hough.

void HoughLine(Mat imgin, Mat imgout)
{
       vector<Vec2f> s_lines;
       HoughLines(imgin, s_lines, 1, CV_PI/180, 100, 0, 0 );
       /// Show the result
       for( size_t i = 0; i < s_lines.size(); i++ )
       {
              float r = s_lines[i][0], t = s_lines[i][1];
              double cos_t = cos(t), sin_t = sin(t);
              double x0 = r*cos_t, y0 = r*sin_t;
              double alpha = 1000;

              Point pt1( cvRound(x0 + alpha*(-sin_t)), cvRound(y0 + alpha*cos_t) );
              Point pt2( cvRound(x0 - alpha*(-sin_t)), cvRound(y0 - alpha*cos_t) );
              line(imgout, pt1, pt2, Scalar(255,255,255),3);
       }
}



Câu 27. Trình bày các bước lọc ảnh trong miền tần số.

Lọc ảnh trong miền tần số gồm 7 bước sau đây:
Bước 1: Cho ảnh đầu vào f(x,y) có kích thước MxN. Mở rộng ảnh có kích thước là PxQ. Cụ thể P=2M, Q=2N.
Bước 2: Thêm zero vào phần mở rộng, ta được ảnh fp(x,y).
Bước 3: Nhân fp(x,y) với (-1)x+y để dời F(0,0) vào tâm ảnh.
Bước 4: Biến đổi Fourier của ảnh ở Bước 3 ta được F(u,v).
Bước 5: Cho hàm lọc có giá trị thực H(u,v) đối xứng qua tâm (P/2,Q/2). Thực hiện phép nhân
G(u,v) = F(u,v)H(u,v).
Bước 6: Thu được ảnh đã xử lý bằng biến đổi Fourier ngược, lấy phần thực và dời trở lại gốc tọa độ
Bước 7: Bỏ phần đã mở rộng, ta thu được ảnh g(x,y) có kích thước MxN.
Biểu diễn bằng sơ đồ khối:




Câu 28. Xây dựng và cài đặt thuật toán làm trơn ảnh trong miền tần số dùng bộ lọc lowpass lý tưởng.

void FrequencyFilter(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
      
       // Buoc 1, 2, 3
       int P = getOptimalDFTSize(M);
       int Q = getOptimalDFTSize(N);
       Mat f = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int x, y;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++)
                     if ((x+y)%2 == 0)
                           f.at<Vec2f>(x,y)[0] = imgin.at<uchar>(x,y);
                     else
                           f.at<Vec2f>(x,y)[0] = -imgin.at<uchar>(x,y);

       // Buoc 4
       Mat F = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       dft(f,F);
       // Buoc 5
       Mat H = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int u, v;
       double D0 = 60, Duv;
       // Ideal lowpass ideal
       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));
                     if (Duv <= D0)
                           H.at<Vec2f>(u,v)[0] = 1.0;
                     else
                        H.at<Vec2f>(u,v)[0] = 0;
              }
       Mat G = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       mulSpectrums(F,H,G,DFT_ROWS);
       // Buoc 6, 7
       Mat g = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       idft(G,g,DFT_SCALE);
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     if ((x+y)%2 == 0)
                           r = g.at<Vec2f>(x,y)[0];
                     else
                           r = -g.at<Vec2f>(x,y)[0];
                     if (r < 0) r = 0;
                     if (r > L-1) r = L-1;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}



Câu 29. Xây dựng và cài đặt thuật toán làm trơn ảnh trong miền tần số dùng bộ lọc lowpass Butterworth.

void FrequencyFilter(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
      
       // Buoc 1, 2, 3
       int P = getOptimalDFTSize(M);
       int Q = getOptimalDFTSize(N);
       Mat f = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int x, y;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++)
                     if ((x+y)%2 == 0)
                           f.at<Vec2f>(x,y)[0] = imgin.at<uchar>(x,y);
                     else
                           f.at<Vec2f>(x,y)[0] = -imgin.at<uchar>(x,y);

       // Buoc 4
       Mat F = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       dft(f,F);

       // Buoc 5
       Mat H = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int u, v;
       double D0 = 60, Duv;
       // Ideal lowpass butterworth
       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));
                  H.at<Vec2f>(u,v)[0] = 1.0/(1.0+pow(Duv/D0,2*n));          }
             
       Mat G = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       mulSpectrums(F,H,G,DFT_ROWS);

       // Buoc 6, 7
       Mat g = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       idft(G,g,DFT_SCALE);
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     if ((x+y)%2 == 0)
                           r = g.at<Vec2f>(x,y)[0];
                     else
                           r = -g.at<Vec2f>(x,y)[0];
                     if (r < 0)
                           r = 0;
                     if (r > L-1)
                           r = L-1;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}

Câu 30. Xây dựng và cài đặt thuật toán làm trơn ảnh trong miền tần số dùng bộ lọc lowpass Gauss.

void FrequencyFilter(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
      
       // Buoc 1, 2, 3
       int P = getOptimalDFTSize(M);
       int Q = getOptimalDFTSize(N);
       Mat f = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int x, y;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++)
                     if ((x+y)%2 == 0)
                           f.at<Vec2f>(x,y)[0] = imgin.at<uchar>(x,y);
                     else
                           f.at<Vec2f>(x,y)[0] = -imgin.at<uchar>(x,y);

       // Buoc 4
       Mat F = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       dft(f,F);

       // Buoc 5
       Mat H = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int u, v;
       double D0 = 60, Duv;
       // Ideal lowpass Gauss
       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));
                  H.at<Vec2f>(u,v)[0] = exp(-Duv*Duv/(2*D0*D0));
              }
             
       Mat G = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       mulSpectrums(F,H,G,DFT_ROWS);

       // Buoc 6, 7
       Mat g = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       idft(G,g,DFT_SCALE);
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     if ((x+y)%2 == 0)
                           r = g.at<Vec2f>(x,y)[0];
                     else
                           r = -g.at<Vec2f>(x,y)[0];
                     if (r < 0)
                           r = 0;
                     if (r > L-1)
                           r = L-1;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}

Câu 31. Xây dựng và cài đặt thuật toán làm nét ảnh trong miền tần số dùng bộ lọc highpass lý tưởng.

void FrequencyFilter(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
      
       // Buoc 1, 2, 3
       int P = getOptimalDFTSize(M);
       int Q = getOptimalDFTSize(N);
       Mat f = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int x, y;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++)
                     if ((x+y)%2 == 0)
                           f.at<Vec2f>(x,y)[0] = imgin.at<uchar>(x,y);
                     else
                           f.at<Vec2f>(x,y)[0] = -imgin.at<uchar>(x,y);

       // Buoc 4
       Mat F = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       dft(f,F);

       // Buoc 5
       Mat H = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int u, v;
       double D0 = 60, Duv;
       // Ideal highpass ideal
       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));
                     if (Duv <= D0)
                           H.at<Vec2f>(u,v)[0] = 0;
                     else
                           H.at<Vec2f>(u,v)[0] = 1.0;

              }
             
       Mat G = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       mulSpectrums(F,H,G,DFT_ROWS);

       // Buoc 6, 7
       Mat g = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       idft(G,g,DFT_SCALE);
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     if ((x+y)%2 == 0) r = g.at<Vec2f>(x,y)[0];
                     else r = -g.at<Vec2f>(x,y)[0];
                     if (r < 0) r = 0;
                     if (r > L-1) r = L-1;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}

Câu 32. Xây dựng và cài đặt thuật toán làm nét ảnh trong miền tần số dùng bộ lọc highpass Butterworth.

void FrequencyFilter(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
      
       // Buoc 1, 2, 3
       int P = getOptimalDFTSize(M);
       int Q = getOptimalDFTSize(N);
       Mat f = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int x, y;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++)
                     if ((x+y)%2 == 0)
                           f.at<Vec2f>(x,y)[0] = imgin.at<uchar>(x,y);
                     else
                           f.at<Vec2f>(x,y)[0] = -imgin.at<uchar>(x,y);

       // Buoc 4
       Mat F = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       dft(f,F);

       // Buoc 5
       Mat H = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int u, v;
       double D0 = 60, Duv;
       // Ideal highpass butterworth
       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));
                     H.at<Vec2f>(u,v)[0] = 1/(1+pow(D0/Duv,2*n));
              }
             
       Mat G = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       mulSpectrums(F,H,G,DFT_ROWS);

       // Buoc 6, 7
       Mat g = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       idft(G,g,DFT_SCALE);
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     if ((x+y)%2 == 0)
                           r = g.at<Vec2f>(x,y)[0];
                     else
                           r = -g.at<Vec2f>(x,y)[0];
                     if (r < 0)
                           r = 0;
                     if (r > L-1)
                           r = L-1;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}

Câu 33. Xây dựng và cài đặt thuật toán làm nét ảnh trong miền tần số dùng bộ lọc highpass Gauss.

void FrequencyFilter(Mat imgin, Mat imgout)
{
       int M = imgin.size().height;
       int N = imgin.size().width;
      
       // Buoc 1, 2, 3
       int P = getOptimalDFTSize(M);
       int Q = getOptimalDFTSize(N);
       Mat f = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int x, y;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++)
                     if ((x+y)%2 == 0)
                           f.at<Vec2f>(x,y)[0] = imgin.at<uchar>(x,y);
                     else
                           f.at<Vec2f>(x,y)[0] = -imgin.at<uchar>(x,y);

       // Buoc 4
       Mat F = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       dft(f,F);

       // Buoc 5
       Mat H = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       int u, v;
       double D0 = 60, Duv;
       // Ideal highpass gauss
       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));
                     H.at<Vec2f>(u,v)[0] = 1.0 - exp(-Duv*Duv/(2*D0*D0));
              }
             
       Mat G = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       mulSpectrums(F,H,G,DFT_ROWS);

       // Buoc 6, 7
       Mat g = Mat(P,Q,CV_32FC2,CV_RGB(0,0,0));
       idft(G,g,DFT_SCALE);
       float r;
       for (x=0; x<M; x++)
              for (y=0; y<N; y++) {
                     if ((x+y)%2 == 0)
                           r = g.at<Vec2f>(x,y)[0];
                     else
                           r = -g.at<Vec2f>(x,y)[0];
                     if (r < 0)
                           r = 0;
                     if (r > L-1)
                           r = L-1;
                     imgout.at<uchar>(x,y) = (uchar)r;
              }
       return;
}

Thay các câu 34, 35, 36 bằng 1 trong các câu (28 – 33)

Câu 34. Xây dựng và cài đặt thuật toán biến đổi Laplace trong miền tần số.

Câu 35. Xây dựng và cài đặt thuật toán mặt nạ làm nhòe, lọc tăng cường và lọc nâng tần số cao.


Câu 36. Xây dựng và cài đặt thuật toán lọc đồng hình.

Xu Ly Anh So Xu Ly Anh So Reviewed by Nguyen Nam on 6/16/2014 Rating: 5

Không có nhận xét nào:

Được tạo bởi Blogger.