De thi xu ly anh

Lượt xem: 69,280Lượt tải: 5Số trang: 67

Mô tả tài liệu

Tài liệu tham khảo giúp cho các bạn yêu thích môn xử lý hình ảnh biết các công thức quy trình đêr xử lý được ảnh đẹp. Chúc các bạn thành công

Tóm tắt nội dung

Xây dựng và cài đặt thuật toán làm âm ảnh. Cách làm âm ảnh được cho bằng phương trình: s=L-1-r trong đó L=256 là số lượng mức xám, r là mức xám đầu vào, s là mức xám đầu ra Quan sát đồ thị ta thấy: Mức xám đầu ra “ngược” với đầu vào, tức là thuật toán này biến ảnh đen trở thành ảnh trắng và trắng thành đen. void Negatives(BYTE **f, BYTE **g) int x, y; r = f[x][y]; g[x][y] = s; Xây dựng và cài đặt thuật toán biến đổi logarit ảnh. int x, y; r = f[x][y]; g[x][y] = (int)s; Xây dựng và cài đặt thuật toán biến đổi lũy thừa ảnh. int x, y; r = f[x][y]; g[x][y] = (int)s; Phương trình đường thẳng đi qua 2 điểm (x1,y1) và (x2,y2) là: int x, y; r = f[x][y]; r = f[x][y]; g[x][y] = (int)s; Khi đó ta làm tăng được độ tương phản của ảnh. int k, j, x, y; r = f[x][y]; g[x][y] = (int)(s*(L-1)); Để mô tả histogram mong muốn như hình vẽ, ta dùng phương trình đường thẳng đi qua hai điểm (x1,y1) và (x2,y2): int z, k, i, j, x, y; r = f[x][y]; g[x][y] = k; Xây dựng và cài đặt thuật toán cân bằng histogram cục bộ. Chọn cửa sổ có kích thước lẻ để có phần tử trung tâm, ví dụ: m=n=3, cân bằng histogram của dữ liệu lấy từ cửa sổ và thay phần tử trung tâm bằng phần tử mới. void LocalHistogram(BYTE **w, int m, int n, double *p) int x, y, k; r = w[x][y]; int x, y, s, t, a, b; w[s+a][t+b] = f[x+s][y+t]; r = f[x][y]; g[x][y] = (int)((L-1)*T[r]); 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. Nếu sự chênh lệch mức xám quá nhỏ thì cân bằng histogram cho toàn bộ ảnh sẽ không thấy được sự chênh lệch đó. Nếu cân bằng histogram cục bộ tức cân bằng cho từng khối ảnh, ta sẽ thấy được sự chênh lệch nhưng lại làm thay đổi ảnh. Tiêu chuẩn chọn khối ảnh căn cứ vào 2 đại lượng thống kê là mean (giá trị trung bình hay giá trị kỳ vọng) và variance (phương sai). G(x,y)= int x, y; m = m + a[x][y]; int x, y; int x, y, s, t, a, b; w[s+a][t+b] = f[x+s][y+t]; g[x][y] = (int)E*f[x][y]; g[x][y] = f[x][y]; Xây dựng và cài đặt thuật toán lọc tuyến tính làm trơn. Người ta dùng một cửa sổ nhỏ được gọi là mặt nạ (hay bộ lọc), chẳng hạn bộ lọc có kích thước 3x3. G(x,y)=w(-1,-1)f(x-1,y-1)+w(-1,0)f(x-1,y)+…+w(0,0)f(x,y)+…+w(1,1)f(x+1,y+1) g(x,y)= mxn là kích thước của bộ lọc, m và n thường là số lẻ để bộ lọc có phần tử trung tâm. a=m/2  và b=n/2 là kích thước nữa bộ lọc. void Convolution(BYTE **f, int M, int N, BYTE **g, double **w, int m, int n, BOOL border) int bx, by, a, b, x, y, s, t, p, q; g[x][y] = (int)r; Convolution(f, M, N, g, w, m, n, TRUE); Lọc median đặc biệt hiệu quả khi trong ảnh có nhiễu xung, nhiễu xung còn được gọi là nhiễu muối tiêu. Tạo mảng một chiều, sắp tăng dần và phần tử f(x,y) được thay bằng phần tử chính giữa. int a,b,x,y,s,t; w[s+a][t+b] = f[x+s][y+t]; g[x][y] = w[a][b]; 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. Người ta dùng đạo hàm cấp một hoặc cấp hai để làm tăng độ nét của ảnh. Đạo hàm cấp một của hàm hai chiều được gọi là gradient, ký hiệu là và được định nghĩa như sau : Đạo hàm cấp một theo x được định nghĩa là : =f(x+1,y)-f(x,y) Đạo hàm cấp một theo y được định nghĩa là : =f(x,y+1) – f(x,y) M(x,y)=mag(f)= M(x,y)|gx|+|gy| Gọi số liệu trong mặt nạ 3x3 là Đạo hàm cấp một theo hướng x là : gx = z8-z5 Đạo hàm cấp một theo hướng y là : gy = z6-z5 Nhưng Roberts đã định nghĩa đạo hàm cấp một theo x như sau : gx=z9-z5 và đạo hàm cấp một theo y là : gy=z8-z6 Ta có hai mặt nạ gx và gy và gọi là mặt nạ Roberts. void ConvolutionInt(BYTE **f, int M, int N, int **g, double **w, int m, int n, BOOL border) int bx, by, a, b, x, y, s, t, p, q; g[x][y] = (int)r; int x, y; r = Mag[x][y]; g[x][y] = (int)(1.0*r/max*255); 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. - Đạo hàm cấp hai khác 0 ở đầu và cuối của mức xám bước hoặc mức xám thoai thoải. Đạo hàm cấp 2 của ảnh còn được gọi là toán tử Laplace. Đạo hàm cấp hai của ảnh là: Nâng cao độ nét của ảnh được cho bằng phương trình: g(x,y)=f(x,y)+c[(x,y)] g[x][y]=255 void ConvolutionInt(BYTE **f, int M, int N, int **g, double **w, int m, int n, BOOL border) int bx, by, a, b, x, y, s, t, p, q; g[x][y] = (int)r; void Laplace(BYTE **f, BYTE **g) int x, y, r; if (temp[x][y] < min) min = temp[x][y]; if (temp[x][y] > max) max = temp[x][y]; temp[x][y] = (int)(scale*(temp[x][y]-min)/(max-min)* 255); r = f[x][y] - temp[x][y]; g[x][y] = r; 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. Nâng cao độ nét của ảnh dùng mặt nạ làm nhòe thường dùng trong công nghệ in ảnh, quá trình gồm các bước sau đây: - Lấy ảnh gốc trừ với ảnh đã làm nhòe ta được một ảnh mới gọi là mặt nạ làm nhòe. gmask(x,y)=f(x,y) - g(x,y) = f(x,y) + k.gmask(x,y) k được chọn > 0, khi k=1 ta gọi là mặt nạ làm nhòe, khi k>1 ta gọi là lọc tăng cường. Mặt nạ Gauss dùng để làm nhòe ảnh được cho bằng phương trình : gauss(x,y)= void ConvolutionDouble(BYTE **f, int M, int N, double **g, double **w, int m, int n, BOOL border) int bx, by, a, b, x, y, s, t, p, q; g[x][y] = r; int x, y; sum += Gauss[x][y]; s = int(f[x][y] + k*gmask[x][y]); g[x][y] = s; Cho A và B là 2 tập trong Z, bào mòn A bởi B kí hiệu là . Ta lấy tập B dời đi một độ dời z sao cho tập vừa dời là tập con của A. void Erosion(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g, BOOL border) int bx, by, a, b, x, y, s, t, p, q; g[x][y] = 255; g[x][y] = 0; Cho A và B là 2 tập trong Z, giãn nở A bởi B kí hiệu là được định nghĩa là: void Dilation(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g, BOOL border) int bx, by, a, b, x, y, s, t, p, q; g[x][y] = 255; g[x][y] = 0; void Openning(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g) Erosion(f,M,N,B,m,n,temp,FALSE); Closing của tập A bởi phần tử cấu trúc B ký hiệu là A • B và được định nghĩa như sau: void Closing(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g) Dilation(f,M,N,B,m,n,temp,FALSE); Biên của tập A kí hiệu là Đầu tiên ta bào mòn A bởi B, lấy ảnh A ban đầu trừ đi ảnh đã bào mòn, ta sẽ được biên. int x, y; if (f[x][y] < 128) f[x][y] = 0; f[x][y] = 255; B = (BYTE **)Alloc2D(m,n,sizeof(BYTE)); B[x][y] = 1; Erosion(f,M,N,B,m,n,temp,FALSE); g[x][y] = f[x][y] - temp[x][y]; Ghi chú: X là ảnh có kích thước bằng ảnh A. int x, y; if (f[x][y] == 0) void Intersect(BYTE **a, int M, int N, BYTE **b, BYTE **c) int x, y; c[x][y] = 255; c[x][y] = 0; X = (BYTE **)Alloc2D(M,N,sizeof(BYTE)); int x,y; B = (BYTE **)Alloc2D(m,n,sizeof(BYTE)); B[x][y] = 1; if (f[x][y] < 128) f[x][y] = 0; f[x][y] = 255; Dilation(X,M,N,B,m,n,temp,FALSE); 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. Người ta dùng mặt nạ đạo hàm cấp hai để phát hiện cạnh ảnh, nhưng cạnh ảnh sẽ bị dày lên gấp đôi, và ta phải xử lí trường hợp này. Ngoài ra người ta dùng các mặt nạ đạo hàm cấp hai sau đây để phát hiện cạnh ảnh. Ta gọi đầu ra tại 1 điểm ảnh là R1, R2, R3 và R4. Mục đích là khi quét mặt nạ qua vùng ảnh có độ sáng đồng đều thì đầu ra sẽ = 0. int x, y, r; if (temp[x][y] < min) min = temp[x][y]; if (temp[x][y] > max) max = temp[x][y]; g[x][y] = (int)(scale*(temp[x][y]-min)/(max-min)*255); 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 một. Ta dùng mặt nạ đạo hàm cấp một để phát hiện cạnh ảnh. Có 2 mặt nạ đạo hàm cấp một thường dùng là Sobel, Prewitt. Gọi gx là ảnh đạo hàm theo hướng x. gy là ảnh đạo hàm theo hướng y. Ta có thể kết hợp thêm với ngưỡng để lấy những điểm ảnh trên cạnh cho tốt. Chẳng hạn ta lấy ngưỡng =33% giá trị max của đạo hàm cấp 1, nếu ta phát hiện điểm ảnh nhỏ hơn ngưỡng thì ta bỏ qua. int x, y, r; if (temp[x][y] < min) min = temp[x][y]; g[x][y] = (int)(scale*(temp[x][y]-min)/(max-min)*255); Ta dùng hàm Gauss để làm trơn ảnh và lọc nhiễu. Đạ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. - 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 Ta dùng hàm Gauss để làm trơn ảnh và xóa nhiễu: f(x,y) là ảnh đầu vào. G(x,y) là mặt nạ Gauss. fs(x,y) là ảnh đã làm trơn. Tiếp theo ta dung mặt nạ đạo hàm cấp 1 như Sobel hay Prewitt để phát hiện cạnh của ảnh đã làm trơn.  Bước 2: tính ảnh đạo hàm cấp 1 và ảnh góc pha: M(x,y) và α(x,y). Dùng mặt nạ đạo hàm cấp một như Sobel hay Prewitt để phát hiện cạnh của ảnh đã làm trơn. Bước 1: Tính M(x,y) và α(x,y) Bước 4: Phát hiện lổ trống theo hướng khác bằng cách là quay ảnh một góc , lặp lại bước 3 và quay ngược trở lại Hình sau đây biểu diễn tập các điểm của một đường cong hở, có điểm đầu là A và điểm cuối là B. Viết phương trình đường thẳng đi qua hai điểm A và B, tiếp theo ta tính khoảng cách từ các điểm còn lại đến đường thẳng đó và chọn khoảng cách lớn nhất, trong trường hợp này là điểm C. Tính khoảng cách còn lại từ các đỉnh và chọn khoảng cách lớn nhất D… Nối A B C D E F.Nếu khoảng cách từ các điểm đến đường thẳng nhỏ hơn ngưỡng T thì ta dừng và không chia tiếp. Thứ nhất làm sao ta biết được hai điểm ban đầu, thứ hai là sao biết được thứ tự của đỉnh. Bước 1: cho trước P là tập hợp các đỉnh có thứ tự, cho trước hai đỉnh bắt đầu A và B. Đối với đường cong khép kín thì bước 3 có thay đổi một chút, điểm A được đưa vào stacks open và điểm B được đưa vào stacks open và stacks closed. Bước 4: viết phương trình đường thẳng của hai đỉnh sau cùng trong stacks closed và stacks open. Mục đích của biến đổi Hough là để phát hiện ra đường thẳng và đường tròn, hoặc đường bất kì. Cho điểm xi, yi ở trong mặt phẳng x, y. Dùng mặt phẳng a, b không biết được kích thước ảnh là bao nhiêu vì cho ảnh chạy từ -∞, ∞ và b: -∞, ∞ Do các điểm ảnh có tọa độ x dương, y dương nên chạy từ -900 đến 900 và phạm vi của là , trong đó D là khoảng cách xa nhất giữa 2 góc đối diện ở trong ảnh. int x, y; if (f[x][y] == 0) r = Hough[x][y]; Bước 1: Cho ảnh đầu vào f(x,y) có kích thước MxN. 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). 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. 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. Lọc trong miền tần số được cho bằng phương trình: Trong đó F(u,v) là biến đổi Fourier của ảnh f. Để làm trơn trong miền tần số ta dùng bộ lọc lowpass (thông thấp). D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh int x, y, u, v; FR[x][y] = f[x][y]; if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > 255) g[x][y] = 255; else if (gp[x][y] < 0) g[x][y] = 0; g[x][y] = (int)gp[x][y]; 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. Lọc trong miền tần số được cho bằng phương trình: Trong đó F(u,v) là biến đổi Fourier của ảnh f. Để làm trơn trong miền tần số ta dùng bộ lọc lowpass (thông thấp). D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh int x, y, u, v; FR[x][y] = f[x][y]; if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > 255) g[x][y] = 255; else if (gp[x][y] < 0) g[x][y] = 0; g[x][y] = (int)gp[x][y]; 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. Lọc trong miền tần số được cho bằng phương trình: Trong đó F(u,v) là biến đổi Fourier của ảnh f. Để làm trơn trong miền tần số ta dùng bộ lọc lowpass (thông thấp). Bộ lọc lowpass Gauss được cho bằng phương trình D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh int x, y, u, v; FR[x][y] = f[x][y]; if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > 255) g[x][y] = 255; else if (gp[x][y] < 0) g[x][y] = 0; g[x][y] = (int)gp[x][y]; 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. Người ta dùng bộ lọc thông cao để làm tăng độ nét của ảnh Bộ lọc thông cao (highpass) là hiệu của một và bộ lọc thông thấp: Ta có 3 loại bộ lọc highpass thông dụng là: lý tưởng, Butterworth, Gauss. D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh int x, y, u, v; FR[x][y] = f[x][y]; if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > 255) g[x][y] = 255; else if (gp[x][y] < 0) g[x][y] = 0; g[x][y] = (int)gp[x][y]; 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. Người ta dùng bộ lọc thông cao để làm tăng độ nét của ảnh Bộ lọc thông cao (highpass) là hiệu của một và bộ lọc thông thấp: Ta có 3 loại bộ lọc highpass thông dụng là: lý tưởng, Butterworth, Gauss. n là bậc của bộ lọc, D0 là tần số cắt. D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh int x, y, u, v; FR[x][y] = f[x][y]; if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > 255) g[x][y] = 255; else if (gp[x][y] < 0) g[x][y] = 0; g[x][y] = (int)gp[x][y]; 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. Người ta dùng bộ lọc thông cao để làm tăng độ nét của ảnh Bộ lọc thông cao (highpass) là hiệu của một và bộ lọc thông thấp: Ta có 3 loại bộ lọc highpass thông dụng là: lý tưởng, Butterworth, Gauss. Bộ lọc highpass Gauss được cho bằng phương trình: D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh int x, y, u, v; FR[x][y] = f[x][y]; if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > 255) g[x][y] = 255; else if (gp[x][y] < 0) g[x][y] = 0; g[x][y] = (int)gp[x][y]; Xây dựng và cài đặt thuật toán biến đổi Laplace trong miền tần số. Ta có biến đổi Fourier của vi phân cấp n của hàm f(x) Vậy đạo hàm cấp 2 của ảnh là: Ta phải biến đổi H(u,v) để H(u,v) là đối xứng qua tâm của ảnh. Sau đó ta dùng phép biến đổi Fourier ngược để được ảnh Laplace int x, y, u, v; FR[x][y] = 1.0*f[x][y]/255; if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > max) max = gp[x][y]; if (gp[x][y] < max) r = f[x][y]-scale*gp[x][y]; g[x][y] = 0; g[x][y] = 255; g[x][y] = (int)r; 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. với HLP(u,v) là bộ lọc lowpass và F(u,v) là biến đổi Fourier của ảnh f. Nâng cao độ nét của ảnh dùng mặt nạ làm nhòe được cho bằng phương trình: g(x,y) = f(x,y) + k*gmask(x,y) Nếu k=1 ta gọi là mặt nạ làm nhòe. int x, y, u, v; FR[x][y] = f[x][y]; if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > 255) g[x][y] = 255; else if (gp[x][y] < 0) g[x][y] = 0; g[x][y] = (int)gp[x][y]; Ta có ảnh f(x,y) là tích của hai thành phần: độ chói và độ phản xạ. Như vậy nếu ta muốn tăng độ tương phản và làm nét ảnh thì phải giảm tần số thấp và nâng tần số cao. Hàm lọc H(u,v) được cho sao cho có thể giảm tần số thấp và nâng tần số cao. Do trước đó ta lấy logarit của ảnh nên bây giờ ta phải lấy ngược trở lại bằng hàm mũ. Người ta cho hàm lọc đồng hình H(u,v) như sau, để có thể nâng tần số cao và giảm được tần số thấp. D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh Trong đó c là điều khiển độ dốc của hàm H(u,v). int x, y, u, v; FR[x][y] = log(1.0 + f[x][y]); if ((x+y)%2 == 1) if ((x+y)%2 == 1) if (gp[x][y] > 255) g[x][y] = 255; else if (gp[x][y] < 0) g[x][y] = 0; g[x][y] = (int)gp[x][y];