Nâng cao chất lượng ảnh
192
Trong đó,
f
là ảnh gốc, cửa sổ lọc có kích thước
m
x
n
,
fun
là một hàm phi tuyến đã được
định nghĩa trước và
parameters
là các thông số tuỳ chọn khác (dùng lệnh
help colfilt
hoặc
help nlfilter
để biết thêm về các thông số này).
Cũng như phương pháp lọc tuyến tính, trước khi lọc phi tuyến, ta cần chèn thêm các điểm phụ
ở ngoài biên của ảnh bằng cách sử dụng hàm padarray:
>> fp = padarray(f, [r c], method, direction)
Trong đó
[r c]
là số cột và số hàng thêm vào,
method
có thể là
‘replicate’
,
‘symmetric’
hoặc
‘circular’
với ý nghĩa tương tự như hàm imfilter,
direction
có thể
là
‘pre’
,
’post’
hoặc
‘both’
cho phép lựa chọn giữa các phương án thêm vào trước phần
tử đầu tiên của mỗi chiều, hoặc sau phần tử cuối của mỗi chiều hoặc cả hai (mặc định).
Ví dụ, nếu
f = [1 2;3 4]
thì lệnh dưới đây:
>> fp = padarray(f, [3 2], 'replicate', 'post')
sẽ tạo ra ma trận fp như sau:
fp =
1 2 2 2
3 4 4 4
3 4 4 4
3 4 4 4
3 4 4 4
Ví dụ 12-10. Sử dụng hàm colfilt:
Sau đây là một ví dụ minh hoạ cách sử dụng hàm colfilt. Đầu tiên ta định nghĩa hàm phi tuyến
gmean, sau đó thêm các điểm phụ bằng cách dùng hàm padarray. Cuối cùng gọi hàm colfilt
với các thông số cần thiết.
%% Định nghĩa hàm phi tuyến
function v = gmean(A)
mn = size(A, 1);
v = prod(A, 1).^(1/mn);
%% Kết thúc định nghĩa
>> f = padarray(f, [m n], 'replicate');
% Chèn thêm các pixel
>> g = colfilt(f, [m n], 'sliding', @gmean);
% Lọc phi tuyến
Ngoài các hàm thực hiện bộ lọc phi tuyến tổng quát nói trên, trong MATLAB có sẵn một hàm
lọc phi tuyến cụ thể, đó là bộ lọc hạng (rank filter hoặc order-statistic filter), thực hiện bởi
hàm ordfilt2. Đồng thời, một trường hợp đặc biệt của bộ lọc này, đó là bộ lọc trung vị
(median filter), cũng có thể thực hiện bằng hàm medfilt2.
>> g = ordfilt2(f,order,domain,padopt)
>> g = medfilt2(f,[m n],padopt)
Hàm ordfilt sẽ sắp thứ tự từ nhỏ đến lớn các điểm nằm trong một miền xác định bởi
domain
(
domain
là một ma trận kích thước m x n (kích thước cửa sổ lọc) gồm các giá trị 0 hoặc 1,
trong đó các điểm có giá trị 0 sẽ không thuộc miền khảo sát), sau đó thay thế pixel của ảnh
gốc bằng giá trị mức xám sắp hạng thứ
order
. Ví dụ, muốn lấy phần tử nhỏ nhất trong lân
cận mxn của một pixel, ta dùng lệnh: