5. Ý nghĩa khoa học của đề tài
2.5 Các kỹ thuật phục hồi ảnh
2.5.1 Bộ lọc trung bình
Với lọc trung bình mỗi điểm ảnh được thay thế bằng trung bình trọng số của các diểm lân cận và được định nghĩa như sau:
Nếu trong kỹ thuật lọc trên ta dùng các trọng số như nhau thì phương trinh trên sẽ trở thành
Lọc trung bình có trọng số chính là thực hiện chập ảnh đầu vào với nhân chập H, nhân chập H trong trường hợp này có dạng
Trong lọc trung bình, thường người ta ưu tiên cho các hướng để bảo vệ biên của ảnh khỏi bị mờ khi làm trơn ảnh. Các kiểu mặt nạ được sử dụng tùy theo các trường hợp khác nhau. Các bộ lọc trên là bộ lọc tuyến tính theo nghĩa là điểm ảnh ở tâm cửa sổ sẽ được thay bởi tổ hợp các điểm lân cận chập với mặt nạ
Giả sử đầu vào biểu diễn bởi ma trận I:
Một bộ lọc trung bình không gian khác cũng hay được sử dụng. Phương trình của bộ lọc đó có dạng:
Ở đây nhân chập H có kích thước 2×2 và mỗi điểm ảnh kết quả có giá trị bằng trung bình cộng của nó với trung bình cộng của 4 lân cận gần nhất
Lọc trung bình trọng số là một trường hợp riêng của lọc thông thấp
2.5.2 Bộ lọc thích nghi
Bộ lọc FIR thích nghi dạng trực tiếp
Từ chuẩn bình phương tối thiểu đưa tới khuân mẫu chung thiết lập công thức tuyến tính cho hệ số bộ lọc
Dãy tự tương quan rcx(l) và tương quan chéo rdx(l) nhận được từ dữ liệu, do đó chúng mô tả những ước lượng của dãy tương quan và tự tương quan thực. Hệ số h(k) ở trên cũng là những ước lượng của hệ số thực. Độ chính xác của các ước lượng phụ thuộc vào độ dài của bản ghi dữ liệu, đó là 1 vấn đề cần cân nhắc trong hệ thống xử lý của bộ lọc
Cần quan tâm đó là quá trình ngẫu nhiên cơ bản x(n) thường xuyên không ổn định. Ví dụ trong bộ hiệu chỉnh kênh, các thông số đặc trưng cho tần số có thể biến đổi theo thời gian. Như 1 hệ quả, các dãy tương quan và tự tương quan thống kê, và các ước lượng của chúng thay đổi theo thời gian, điều này làm cho hệ số của bộ lọc thích nghi cũng phải thay đổi theo thời gian để phản ánh được các thông số thay đổi theo thời gian của tín hiệu ở đầu vào bộ lọc. Điều này cũng kéo theo chất lượng của ước lượng không thể tăng bằng cách đơn giản là
tăng số mẫu tín hiệu được sử dụng trong ước lượng các dãy tương quan và tự tương quan
Có nhiều cách để hệ số của bộ lọc có thể thay đổi theo thời gian cùng với các thông số thống kê theo thời gian của tín hiệu. Phương pháp phổ biến nhất là đưa vào bộ lọc dựa trên các mẫu liên tiếp một các đệ quy mỗi khi nhận được mẫu tín hiệu. Cách thứ 2 là ước lượng rcx(l) và rdx(l) trên cơ sở các khối liên tiếp và không duy trì sự liên tục của các giá trị của hệ số bộ lọc từ một khối dữ liệu tới 1 khối khác. Kích thước khối phải tương đối nhỏ, chiếm 1 khoảng thời gian ngắn khi so sánh với khoảng thời gian mà các đặc trưng thống kê của dữ liệu thay đổi 1 cách đáng kể.
Khi nghiên cứu về các thuật toán của bộ lọc thích nghi, ta chỉ chú ý tới các thuật toán đệ quy thời gian mà nó cập nhật hệ số dựa trên các mẫu liên tiếp.
2.5.3 Lọc cấp độ thấp
Giả dụ rằng các điểm ảnh bị hỏng bởi nhiễu muối - hạt tiêu là các thành phần tần số cao của một hình ảnh, một bộ lọc cấp thấp có thể giảm bớt chúng. Vì vậy, chúng ta có thể thử lọc với mức trung bình
a3 = fspecial ('average'); t_sp_a3 = filter2 (a3, t_sp);
Tuy nhiên, nhiễu được không quá nhiều gỡ bỏ như bôi qua hình ảnh, kết quả không phải là chú ý tốt hơn so với hình ảnh nhiễu. Hiệu quả là thậm chí còn rõ rệt hơn nếu chúng ta sử dụng một bộ lọc trung bình lớn hơn :
a7 = fspecial ('average', [7, 7]); t_sp_a7 = filter2 (a7, t_sp);
Hình1. 7. Lấy trung bình 3×3
Hình1. 8. Lấy trung bình 5×5
2.5.4 Lọc theo thứ tự
Lọc trung bình là trường hợp đặc biệt của quá trình tổng quát gọi là quá trình lọc theo thứ tự. Hơn nữa để tìm trung bình của một tập hợp ta cần sắp xếp tập hợp, chọn n-th giá trị cho một vài giá trị ước tính của n. Do vậy lọc trung bình mức độ 3×3 mặt nạ tương đương với lọc theo thứ tự với giá trị n=5 tương tự lọc trung bình 5×5 tương đương với n=13. MATLAB thực hiện phép lọc theo thứ tự bằng hàm ordfilt2 trên thực tế thủ tục cho hàm medfilt2 là tạo một wrapper cho thủ tục hàm ordfilt2. lí do duy nhất để thay thế lọc trung bình bằng lọc theo thứ tự là nó cho phép ta tùy chọn lọc trung bình hay lọc không phải
khối chữ thập mặt nạ. Ví dụ ta chọn lọc 3×3 khối chữ thập mặt nạ. kết quả là giá trị trung bình sẽ rơi vào giá trị thứ 3 của chuỗi sắp xếp. Lệnh thực hiện là :
ordfilt2 (t_sp, 3, [0 1 0;1 1 1;0 1 0]);
Một cách tổng quát đối số thứ 2 của hàm ordfilt2 đưa ra giá trị của tập giá trị sắp xếp, thành phần thứ 3 đưa ra miền xác định. Giá trị mặc định khác, chúng ta sử dụng cross với kích thước và chiều rộng 5 (gồm 9 thành phần) chúng ta có thể viết :
ordfilt2 (t_sp, 5, [0 0 1 0 0;0 0 1 0 0;1 1 1 1 1;0 0 1 0 0;0 0 1 0 0])
2.5.5 Lọc nghịch đảo
Chúng ta thấy rằng có thể thực hiện lọc bằng phương pháp Fourier bằng cách nhân DFT của một hình ảnh với DFT lọc sử dụng trực tiếp định lí dựa kề :
Y (i, j) = X (i. j) F (i, j)
Giả sử ta có ảnh gấu túi wombats. tif làm mờ bằng lọc cấp thấp (lọc sơ cấp) lọc theo kĩ thuật butterworth :
w=imread ('wombats. tif'); wf=fftshift (fft2 (w) ); b=lbutter (w, 15, 2); wb=wf. *b;
wba=abs (ifft2 (wb) );
wba=uint8 (255*mat2gray (wba) ); imshow (wba)
Vấn đề ở đây là các phần tử của ma trận Butterworth rất nhỏ cần phải nâng cao các giá trị chiếm ưu thế ở đầu ra bằng hai cách :
1. Lọc sơ cấp l để phân chia và loại bỏ các giá trị rất nhỏ : X (i, j) =
2. ”phân chia hạn chế” : chọn ngưỡng giá trị d nếu|F (i, j) |<d thì không chia và giữu nguyên giá trị ban đầu.
X (i, j) =
Chúng ta có thể dùng phương pháp đầu tiên để nhân ma trận c1 : wbf=fftshift (fft2 (wba) );
w1= (wbf. /b). *lbutter (w, 40, 10); w1a=abs (ifft2 (w1) );
imshow (mat2gray (w1a) )
Chúng ta dùng phương pháp thứ 2 để tạo các giá trị gần 1 : d=0. 01;
b=lbutter (w, 15, 2);b (find (b<d) ) =1; w1=fftshift (fft2 (wba) ). /b;
w1a=abs (ifft2 (w1) ); imshow (mat2gray (w1a) )
Kết quả: d=0.01 (matlab cho trước), b : d=0.005, c : d=0.002, d : d=0.001 khi ta chọn ngưỡng d trong khoảng 0.002<=d<=0.005 cho kết quả hợp lí nhất.
2.5.6 Lọc Band Reject:
Sử dụng một mặt nạ hình tròn br có bán kính bên trong hình là z.
Có giá trị các pixels bên trong hình tròn là 1 và giá trị các pixels trên biên là 0.
Đường biên phải có độ dày đủ lớn để che được các điểm nhiễu. Tạo nhiễu tuần hoàn:
[x,y] = meshgrid(1:256,1:256); s = 1+sin(x+y/1.5);
cm = imread('cameraman.tif'); cp = (double(cm)/128+s)/4; Dịch phổ về trung tâm của ảnh:
cpf = fftshift(fft2(cp));>> fftshow(cpf,'log'),pixval on
Chúng ta sẽ xóa những thành phần tăng đột biến và trả ngược lại kết quả. Đặt pixval on và di chuyển xung quanh ảnh, chúng ta tìm thấy những hàng, cột có giá trị tăng đột biến là (156,170) và (102,88).
[x,y] = meshgrid(-128:127,-128:127); z = sqrt(x^2+y^2);
Khoảng cách từ đó từ đó tới trung tâm của ảnh là 49.0918: z(1 56,170) ans = 49.0918
z(102,88)ans = 49.0918
Chúng ta tạo ra một lọc với br = 1 nếu (z<47 | z>51) và ngược lại bằng 0 (giữa vòng tròn nhỏ và vòng tròn lớn):
br = (z<47 | z>51);
Thực hiện phép nhân bởi biến đổi: SF = fftshift(fft2(cp)); tbr = SF*br;
figure,fftshow(tbr,'log') Biến đổi Fourier ngược ta được:
tbri =ifft2(tbr);
figure,fftshow(tbri,'log')
2.5.7 Lọc Notch:
Sử dụng các đường kẻ ngang và đường kẻ dọc để che các điểm nhiễu sao cho giao của các đường kẻ này có thể che được các điểm nhiễu.Tạo nhiễu tuần hoàn
s = sin(x+y/1.5)+1; Đọc vào ảnh “cameraman”:
f = imread('cameraman.tif'); Dịch phổ về trung tâm của ảnh:
F = fftshift(fft2(a)); sf = (double(f)/128+s)/4; SF = fftshift(fft2(sf));
fftshow(F,'log'),figure,fftshow(SF,'log')
Đơn giản là cho hàng và cột của thành phần phổ nhiễu bằng 0.
Giả sử tọa độ của các thành phần nhiễu này lần lượt là (156,170), (102,88). SF(156,:) = 0; SF(102,:) = 0; SF(:,88) = 0; SF(:,170) = 0; figure,fftshow(SF,'log')
Biến đổi Fourier ngược ta thu được ảnh ban đầu: ln =ifft2(SF);
fftshow(ln,'log')SF ln
Nhiều nhiễu trung tâm đã bị loại bỏ. Tạo nhiều hàng và cột dịch chuyển về vị trí nhiễu sẽ loại bỏ được nhiều nhiễu hơn.
CHƢƠNG III – CHƢƠNG TRÌNH THỦ NGHIỆM GIỚI THIỆU VỀ MATLAB
3.1 Tổng Quan về MATLAB 3.1.1 Khái niệm về MATLAB 3.1.1 Khái niệm về MATLAB
MATLAB là một ngôn ngữ lập trình thực hành bậc cao được sử dụng để giải các bài toán về kỹ thuật. MATLAB tích hợp được việc tính toán, thể hiện kết quả, cho phép lập trình, giao diện làm việc rất dễ dàng cho người sử dụng. Dữ liệu cùng với thư viện được lập trình sẵn cho phép người sử dụng có thể có được những ứng dụng sau đây.
Sử dụng các hàm có sẵn trong thư viện, các phép tính toán học thông thường.
Cho phép lập trình tạo ra những ứng dụng mới. Cho phép mô phỏng các mô hình thực tế. Phân tích, khảo sát và hiển thị dữ liệu. Với phần mềm đồ hoạ cực mạnh.
Cho phép phát triển, giao tiếp với một số phần mềm khác như C++, Fortran.
3.1.2 Cấu trúc dữ liệu của MATLAB và ứng dụng
MATLAB là một hệ thống tương giao, các phần tử dữ liệu là một mảng (mảng này không đòi hỏi về kích thước). Chúng cho phép giải quyết các vấn đề liên quan đến lập trình bằng máy tính, đặc biệt sử dụng các phép tính về ma trận hay vector v
. MATLAB được viết tắt từ chữ “MATrix LABoratory” tức là thư viện về ma trận, từ đó phần mềm MATLAB được viết nhằm cung cấp cho việc truy cập vào phần mềm ma trận một cách dễ dàng, phần mềm ma trận này được phát triển bởi các công trình
Linpack và Eispack. Ngày nay MATLAB được phát triển bởi Lapack và Artpack tạo nên một nghệ thuật phần mềm cho ma trận.
a) Dữ liệu
Dữ liệu của MATLAB thể hiện dưới dạng ma trận (hoặc mảng, nếu tổng quát), và có các kiểu dữ liệu được liệt kê sau đây :
Kiểu đơn single, kiểu này có lợi về bộ nhớ dữ liệu vì nó đòi hỏi ít byte nhớ hơn, kiểu dữ liệu này không được sử dụng trong các phép tính toán học, độ chính xác kém hơn.
Kiểu double kiểu này là kiểu thông dụng nhất của các biến trong MATLAB .
Kiểu Sparse.
Kiểu uint8, uint16. . . Kiểu char ví dụ „Hello‟ Kiểu cell.
Kiểu Structure.
Trong MATLAB kiểu dữ liệu double là kiểu mặc định sử dụng trong các phép tính số học.
b) Ứng dụng
MATLAB tạo điều kiện thuận lợi cho : Các khoá học về toán học.
Các kỹ sư, các nhà nghiên cứu khoa học.
Dùng MATLAB để tính toán, nghiên cứu tạo ra các sản phẩm tốt nhất trong sản xuất.
c) Toolbox là một công cụ quan trọng trong MATLAB
Công cụ này được MATLAB cung cấp cho phép bạn ứng dụng các kỹ thuật để phân tích, thiết kế, mô phỏng các mô hình.
Ta có thể tìm thấy toolbox ở trong mô trường làm việc của. Mạng nơron.
Logic mờ. Simulink.
3.1.3 Hệ thống MATLAB
Hệ thống giao diện của MATLAB được chia thành 5 phần :
a) Môi trƣờng phát triển.
MATLAB là một môi trường tính toán số và lập trình, được thiết kế bởi công ty MathWorks. MATLAB cho phép tính toán số với ma trận, vẽ đồ thị hàm số hay biểu đồ thông tin, thực hiện thuật toán, tạo các giao diện người dùng và liên kết với những chương trình máy tính viết trên nhiều ngôn ngữ lập trình khác.
b) Thƣ viện
Thư viện, các hàm toán học bao gồm các cấu trúc như tính tổng, sin cosin, atan, atan2 etc. . . , các phép tính đơn giản đến các phép tính phức tạp như tính ma trận nghịch đảo, trị riêng, chuyển đổi fourier, laplace, symbolic library.
c) Ngôn ngữ
Ngôn ngữ MATLAB. Đó là các ngôn ngữ cao về ma trận và mảng, với các dòng lệnh, các hàm, cấu trúc dữ liệu vào, có thể lập trình hướng đối tượng.
d) Đồ họa
Đồ họa trong MATLAB. Bao gồm các câu lệnh thể hiện đồ hạo trong môi trường 2D và 3D, tạo các hình ảnh chuyển động, cung cấp các giao diện tương tác giữa người sử dụng và máy tính.
e) Tƣơng tác
Giao tiếp với các ngôn ngữ khác. MATLAB cho phép tương tác với các ngôn ngữ khác như C, Fortran …
3.1.4 MATLAB đơn giản
2. 1. Cửa sổ desktop (cửa sổ lớn nhất), và các cửa sổ phụ của nó
Trước tiên để khởi động MATLAB, ta nháy vào biểu tượng MATLAB. exe, trên màn hình xuất hiện cửa sổ sau. (Xem hình vẽ 2. 1) Cửa sổ đó chứa các thanh công cụ (Giao diện người và máy) cần thiết cho việc quản lý các files, các biến, cửa sổ lệnh, có thể coi desktop là các panel gồm các ô, vùng, quản lý và tác dụng của từng cửa sổ nhỏ được quản lý bởi desktop.
3.1.5 Các cửa sổ làm việc của MATLAB a) Cửa sổ lệnh a) Cửa sổ lệnh
Là cửa sổ giao tiếp chính của MATLAB bởi đây là nơi nhập giá trị các biến, hiển thị giá trị, tính toán giá trị của biểu thức, thực thi các hàm có sẵn trong thư viện (dạng lệnh), hoặc các hàm (dạng hàm) do người dùng lập trình ra trong M_files.
Các lệnh được nhập sau dấu nhắc „ >> „, và nếu có sai sót trong quá trình gõ (nhập) lệnh thì hãy nhấn phím Enter cho đến khi nhận được dấu nhắc >>. Thực thi lệnh bằng nhấn phím Enter.
Gõ các lệnh sau : A= pi/2;
B= sin (A) B=1
Hình 2. 2. Giao diện câu lệnh
Hoặc chương trình soạn thảo trong M-file dưới đây : % Chuong trinh trong M-file
x= 0 : pi/6 : 2*pi; y=sin (x);
plot (x, y);
% chuong trinh được lưu với tên file là “ve_sin. m”
b) Cửa sổ command History
Các dòng mà bạn nhập vào trong cửa sổ Command window (các dòng này có thể là dòng nhập biến, hoặc có thể là dòng lệnh thực hiện hàm nào đó) được giữ lại trong cửa sổ Command History, và cửa sổ này cho phép ta sử dụng lại những lệnh đó bằng cách nháy chuột lên các lệnh đó hoặc các biến, nếu như bạn muốn sử dụng lại biến đó.
nháy đôi chuột lên lênh hoặc biến để sử dụng lại Hình 2. 3. Gọi câu lệnh c) Cửa sổ Workspace
Là cửa sổ thể hiện tên các biến bạn sử dụng cùng với kích thước vùng nhớ (số bytes), kiểu dữ liệu (lớp), các biến được giải phóng sau mỗi lần tắt chương trình. Nháy đôi chuột lên biến để xem dữ liệu (hoặc thay đổi giá trị) Hình 2. 4. Xem dữ liệu
Ngoài ra nó cho phép thay đổi giá tri, cũng như kích thước của biến bằng cách nháy đôi chuột lên các biến. Hoặc nháy vào nút bên trái ngay cạnh nút save Ví dụ khi chọn biến (giả thử là biến b) rồi nháy (hoặc nháy chuột vào nút cạnh nút save) ta được cửa sổ sau gọi là Array Editor.
Hình 2. 5. Kết quả
Tiêu đề là tên biến b, định dạng dữ liệu ở ô có tên là : Numeric format, mặc định là dạng short, Kích thước size là 1 by 3 (tức là một hàng và 3 cột) ta có thể thay đổi kích thước này bằng cách thay đổi số có trong ô kích thước size. Dùng cửa sổ này để lưu các biến ở dưới là dữ liệu của biến b, ta có thể thay đổi chúng bằng cách thay đổi giá trị trong các ô đó Tất cả các biến đều được lưu trong Workspace trong đó thể hiện cả kích thước (Size), số Bytes và kiểu dữ liệu (class) (8 bytes cho mỗi phần tử dữ liệu kiểu double cụ thể là 24 bytes dành cho b và 8 bytes dành cho a).
d) Cửa sổ M-file
Là một cửa sổ dùng để soạn thảo chương trình ứng dụng, để thực thi chương trình viết trong M-file bằng cách gõ tên của file chứa chương trình đó trong cửa sổ Command window.
Khi một chương trình viết trong M-file, thì tuỳ theo ứng dụng cụ thể, tuỳ theo người lập trình mà chương trình có thể viết dưới dạng sau :
Dạng Script file : Tức là chương trình gồm tập hợp các câu lệnh viết dưới dạng liệt kê, không có biến dữ liệu vào và biến lấy giá trị ra.