Lọc nghịch đảo

Một phần của tài liệu Nghiên cứu một số kỹ thuật phục hồi ảnh và ứng dụng (Trang 32 - 73)

5. Ý nghĩa khoa học của đề tài

2.5.5Lọ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; (adsbygoogle = window.adsbygoogle || []).push({});

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. (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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.

Hình 2. 6. Dạng hàm function : có biến dữ liệu vào và biến ra

3.2 Các hàm chuyển đổi kiểu ảnh

Với các thao tác nhất định, sẽ thật hữu ích khi có thể chuyển đổi ảnh từ dạng này sang dạng khác. Chẳng hạn, nếu ta muốn lọc một ảnh màu được lưu trữ dưới dạng ảnh số, đầu tiên ta nên chuyển đổi nó thành dạng ảnh RGB. Khi ta áp dụng phép lọc tới ảnh RGB, MATLAB sẽ lọc giá trị cường độ tương ứng trong ảnh. Nếu ta lọc ảnh số MATLAB đơn giản chỉ áp đặt phép lọc tới ma trận ảnh số và kết quả sẽ không có ý nghĩa.

Chú ý : Khi chuyển đổi một ảnh từ dạng này sang dạng khác, ảnh kết quả có thể khác ảnh ban đầu. Chẳng hạn, nếu ta chuyển đổi một ảnh màu chỉ số sang một ảnh cường độ, kết quả ta sẽ thu được một ảnh đen trắng.

Danh sách sau đây sẽ liệt kê các hàm được sử dụng trong việc chuyển đổi ảnh :

dither : Tạo một ảnh nhị phân từ một ảnh cường độ đen trắng bằng cách trộn, tạo một ảnh chỉ số từ một ảnh RGB bằng cách trộng (dither).

gray2id : Tạo một ảnh chỉ số từ một ảnh cường độ đen trắng.

grayslice : Tạo một ảnh chỉ số từ một ảnh cường độ đen trắng bằng cách đặt ngưỡng.

im2bw : Tạo một ảnh nhị phân từ một ảnh cường độ, ảnh chỉ số hay ảnh RGB trên cơ sở của ngưỡng ánh sáng.

ind2gray : Tạo một ảnh cường độ đen trắng từ một ảnh chỉ số.

ind2rgb : Tạo một ảnh RGB từ một ảnh chỉ số.

mat2gray : Tạo một ảnh cường độ đen trắng từ dữ liệu trong một ma trận bằng cách lấy tỉ lệ giữ liệu.

rgb2gray : Tạo một ảnh cường độ đen trắng từ một ảnh RGB.

rgb2ind : Tạo một ảnh chỉ số từ một ảnh RGB. (adsbygoogle = window.adsbygoogle || []).push({});

Ta cũng có thể thực hiện các phép chuyển đổi kiểu chỉ sử dụng cú pháp của MATLAB . Chẳng hạn, ta có thể convert một ảnh cường độ sang ảnh RGB bằng cách ghép nối ba phần sao chép của ma trận ảnh gốc giữa 3 chiều : RGB=cat (3, I, I, I); Ảnh RGB thu được có các ma trận đồng nhất cho các mặt phẳng R, G, B vì vậy ảnh hiển thị giống như bóng xám.

3.3 Giao diện đồ hoạ GUI 3.3.1 Khái niệm 3.3.1 Khái niệm

Để tiện cho việc sử dụng các ứng dụng hay chương trình mà ta đã viết chúng ta có thể tạo ra giao diện đồ họa GUI (Graphic User Interface) giữa ngưới dùng và matlab. Trong giao diện này ta có thể xuất dữ liệu dưới hai dạng văn bản và đồ họa. Mỗi một GUI có thể có một hay nhiều giao diện. Việc tạo GUI tạo nên một công cụ nhập xuất dữ liệu một cách trực quan, nhanh chóng và rất thuận tiện. Ngoài ra có thể dùng GUI để giám sát các quá trình, hiển thị các đối tượng…

3.3.2 Cách tạo GUI

Có hai cách để tạo ra GUI : Tạo GUI bằng cách viết lệnh trực tiếp trong M-file và tạo GUI bằng công cụ đồ họa.

3.3.3 Tạo GUI bằng công cụ đồ họa

Trên đây ta đã xem xét cách tạo GUI bằng phương pháp thủ công. Ta có thể tạo GUI bằng công cụ đồ hoạ. Bằng hai cách như sau :

Hình 2. 7. Tạo giao diện GUI

Cách 1 : Gõ lệnh guide trong của sổ command Window

Cách 2 : Nháy chuột vào biểu tượng guide ( ) trên thanh công cụ. Khi gõ lệnh guide ta thấy xuất hiện một hộp thư thoại như hình sau :

Hình 2. 8. Màn hình tạo giao diện

Create New GUI : tạo giao diện GUI mới.

Chúng ta chọn Create New GUI sau đó chọn Blank GUI (mặc định) để tạo GUI trắng và thiết lập các thông số theo yêu cầu. Kết quả cho ra một layout rỗng như hình bên :

Hình 2. 9. Các chức năng

Sau khi mở hộp thoai tạo GUI ta làm các bước sau : B1 : thiết kế giao diện GUI như bài trên có hình sau :

Hình 2. 10. Cửa sổ thiết kế giao diện GUI

B2 : Viết lệnh cho các nút nhấn (button).

Function sph_Callback (hObject, eventdata, handles) Soạn thảo thuộc tính Chạy thử Soạn Menu Các phần tử thiết kế Vùng thiết kế Viết lệnh

[x, y, z]=sphere (35); surfl (x, y, z);

axis equal

Function pic_Callback (hObject, eventdata, handles)

imshow (uigetfile ({'*. tif;*. bmp;*. gif;*. jpg'}, 'pick an image file') ) Function clo_Callback (hObject, eventdata, handles)

Close

Kết quả thu được :

Hình 2. 11. Kết quả thu được bằng công cụ đồ họa

3.4 Thử nghiệm chƣơng trình lọc nhiễu muối tiêu và gauss 3.4.1 Đặt bài toán 3.4.1 Đặt bài toán

Yêu cầu : Đầu vào là một ảnh bất kỳ, sau khi cho vào chương trình làm hư hại ảnh dạng muối tiêu, sau đó dùng các bộ lọc để khôi phục lại hình ảnh ban đầu.

3.4.2. Các hàm chức năng a) 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); (adsbygoogle = window.adsbygoogle || []).push({});

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 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ình 3. 2. Lấy trung bình 5×5

b) Lọc trung bình

Lọc trung bình dường như thích hợp cho loại bỏ các nhiễu muối và hạt tiêu. Nhớ lại rằng trung bình của một tập là giá trị trung bình khi chúng được sắp

Một phần của tài liệu Nghiên cứu một số kỹ thuật phục hồi ảnh và ứng dụng (Trang 32 - 73)