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
Reviewed by Nguyen Nam
on
6/16/2014
Rating:
Không có nhận xét nào: