Xử lý tín hiệu nâng cao - Chương 6: Xử lý ảnh trong Matlab

Biểu diễn ảnh

 Một ảnh được biểu diễn dưới dạng một hàm f(x,y)

 Đối với ảnh số đơn sắc, giá trị f tại (x,y) được gọi

là mức xám

 Kết quả của quá trình lấy mẫu và lượng tử hóa là

một ma trận số liệu.

 Một ảnh có kích thước M x N là một ma trận có M

hàng và N cột, mỗi một giá trị trên ma trận gọi là

một điểm ảnh (pixel)

pdf 51 trang dienloan 11960
Bạn đang xem 20 trang mẫu của tài liệu "Xử lý tín hiệu nâng cao - Chương 6: Xử lý ảnh trong Matlab", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Xử lý tín hiệu nâng cao - Chương 6: Xử lý ảnh trong Matlab

Xử lý tín hiệu nâng cao - Chương 6: Xử lý ảnh trong Matlab
Xử lý tín hiệu nâng cao
-Advanced signal processing-
Chương 6
Xử lý ảnh trong Matlab
Tín hiệu hai chiều (ảnh số)
Biểu diễn ảnh
 Một ảnh được biểu diễn dưới dạng một hàm f(x,y) 
 Đối với ảnh số đơn sắc, giá trị f tại (x,y) được gọi 
là mức xám 
 Kết quả của quá trình lấy mẫu và lượng tử hóa là 
một ma trận số liệu. 
 Một ảnh có kích thước M x N là một ma trận có M 
hàng và N cột, mỗi một giá trị trên ma trận gọi là 
một điểm ảnh (pixel).
Biểu diễn ảnh
 Một ma trận tọa độ ảnh trong Matlab được biểu diễn
Các kiểu ảnh trong Matlab 
Ảnh được định chỉ số (Indexed Images) 
Ảnh cường độ (Intensity Images) 
Ảnh nhị phân (Binary Images)
Ảnh RGB (RGB Images) 
Ảnh được định chỉ số (Indexed Images) 
Một ảnh chỉ số bao gồm một ma trận dữ liệu X và ma trận bản 
đồ màu map. Ma trận dữ liệu có thể có kiểu thuộc lớp uint8, 
uint16 hoặc kiểu double. Ma trận bản đồ màu là một mảng 
mx3 kiểu double bao gồm các giá trị dấu phẩy động nằm giữa 
0 và 1. Mỗi hàng của bản đồ chỉ ra các giá trị mà: red, green 
và blue của một màu đơn. Một ảnh chỉ số sử dụng ánh xạ trực 
tiếp giữa giá trị của pixel ảnh tới giá trị trong bản đồ màu. Màu 
sắc của mỗi pixel ảnh được tính toán bằng cách sử dụng giá 
trị tương ứng của X ánh xạ tới một giá trị chỉ số của map. Giá 
trị 1 chỉ ra hàng đầu tiên, giá trị 2 chỉ ra hàng thứ hai trong bản 
đồ màu 
Một bản đồ màu thường được chứa cùng với ảnh chỉ số và 
được tự động nạp cùng với ảnh khi sử dụng hàm imread để 
đọc ảnh. Tuy nhiên, ta không bị giới hạn khi sử dụng bản đồ 
màu mặc định, ta có thể sử dụng bất kì bản đồ màu nào.
Ảnh cường độ (Intensity Images) 
Một ảnh cường độ là một ma trận dữ liệu ảnh I mà giá trị của 
nó đại diện cho cường độ trong một số vùng nào đó của ảnh. 
Matlab chứa một ảnh cường độ như một ma trận đơn, với mỗi 
phần tử của ma trận tương ứng với một pixel của ảnh. Ma 
trận có thể thuộc lớp double, uint8 hay uint16. Trong khi ảnh 
cường độ hiếm khi được lưu với bản đồ màu, Matlab sử dụng 
bản đồ màu để hiển thị chúng.
 Những phần tử trong ma trận cường độ đại diện cho các 
cường độ khác nhau hoặc độ xám. Những điểm có cường độ 
bằng 0 thường được đại diện bằng màu đen và cường độ 
1,255 hoặc 65535 thường đại diện cho cường độ cao nhất 
hay màu trắng.
Ảnh nhị phân (Binary Images)
Trong một ảnh nhị phân, mỗi pixel chỉ có thể 
chứa một trong hai giá trị nhị phân 0 hoặc 1. 
Hai giá trị này tương ứng với bật hoặc tắt (on 
hoặc off). Một ảnh nhị 
phân được lưu trữ như một mảng logic của 0 
và 1.
Ảnh RGB (RGB Images) 
 Một ảnh RGB - thường được gọi là true-color, được lưu trữ trong Matlab 
dưới dạng một mảng dữ liệu có kích thước 3 chiều mxnx3 định nghĩa các 
giá trị màu red, green và blue cho mỗi pixel riêng biệt. Ảnh RGB không sử 
dụng palette. Màu của mỗi pixel được quyết định bởi sự kết hợp giữa các 
giá trị R, G, B (Red, Green, Blue) được lưu trữ trong một mặt phẳng màu 
tại vị trí của pixel. Định dạng file đồ hoạ lưu trữ ảnh RGB giống như một 
ảnh 24 bits trong đó R, G, B chiếm tương ứng 8 bit một. Điều này cho 
phép nhận được 16 triệu màu khác nhau. 
 Một mảng RGB có thể thuộc lớp double, uint8 hoặc uint16. Trong một 
mảng RGB thuộc lớp double, mỗi thành phần màu có giá trị giữa 0 và 1. 
Một pixel mà thành phần màu của nó là (0, 0, 0) được hiển thị với màu đen 
và một pixel mà thành phần màu là (1, 1, 1 ) được hiển thị với màu trắng. 
Ba thành phần màu của mỗi pixel được lưu trữ cùng với chiều thứ 3 của 
mảng dữ liệu. Chẳng hạn, giá trị màu R, G, B của pixel (10, 5) được lưu 
trữ trong RGB(10, 5, 1), RGB(10, 5, 2) và RGB(10, 5, 3) tương ứng. 
Để tính toán màu sắc của pixel tại hàng 2 và cột 3 chẳng hạn, ta nhìn vào 
bộ ba giá trị được lưu trữ trong (2, 3, 1:3). Giả sử (2, 3, 1) chứa giá trị 
0.5176; (2, 3, 2) chứa giá trị 0.1608 và (2, 3, 3) chứa giá trị 0.0627 thì màu 
sắc của pixel tại (2, 3) sẽ là (0.5176, 0.1608, 0.0627).
Đọc và hiển thị 1 ảnh
Xóa các biến và các cửa sổ ảnh
clear, close all
Đọc ảnh
I = imread('pout.tif');
Hiển thị ảnh
imshow(I)
Có thể xem các thông tin về biến trong 
workspace bằng lệnh whos
whos
Name Size Bytes Class
I 291x240 69840 uint8 array
Grand total is 69840 elements using 69840 bytes
Thực hiện cân bằng Histogram trên ảnh
 Ta thấy, pout.tif là một hình ảnh có độ tương phản hơi thấp. 
 Để xem sự phân bố cường độ trong pout.tif, ta có thể tạo ra 
một lược đồ histogram bằng cách gọi hàm imhist. 
 Trước khi gọi hàm imhist, sử dụng lệnh figure để lược đồ histogram 
không ghi đè lên màn hình hiển thị của ảnh I trong cửa sổ hiện tại.
1600
figure, imhist(I) 
0 50 100 150 200 250
0
200
400
600
800
1000
1200
1400
Phạm vi cường độ khá hẹp. 
Nó không che hết phạm 
tiềm năng của [0, 255], và 
thiếu các giá trị cao và thấp 
sẽ cho kết quả tương phản 
tốt.
Thực hiện cân bằng Histogram trên ảnh
Hộp công cụ cung cấp nhiều cách để cải thiện 
độ tương phản trong một hình ảnh. 
Hàm histeq để dàn trải các giá trị cường độ 
trên toàn bộ phạm vi ảnh, gọi là quá trình cân 
bằng histogram. 
I2 = histeq(I);
 Xem thêm hàm histeq, imadjust, adapthisteq
Thực hiện cân bằng Histogram trên ảnh
Hiển thị ảnh sau khi đã được cân bằng histogram
figure, imshow(I2)
Xem lược đồ histogram của ảnh I2
figure, imhist(I2) 
0 50 100 150 200 250
0
200
400
600
800
1000
1200
1400
1600
Thực hiện cân bằng Histogram trên ảnh
 Ảnh trước và sau khi được cân bằng histogram
0 50 100 150 200 250
0
200
400
600
800
1000
1200
1400
1600
0 50 100 150 200 250
0
200
400
600
800
1000
1200
1400
1600
Lưu một ảnh từ ma trận ra một file
Dùng lệnh imwrite:
imwrite (I2, 'pout2.png')
Xem các thông tin của ảnh
Dùng lệnh imfinfo
imfinfo('pout2.png')
Ví dụ 2
Đọc và hiển thị ảnh 
 Xóa các biến trong workspace, đóng các cửa sổ figure, và 
đóng tất cả các Image Viewers. 
clear, close all, imview close all
 Đọc và hiển thị ảnh rice.png. 
I = imread('rice.png');
imview(I)
Ví dụ 2
Ước lượng giá trị của điểm ảnh Background:
 Ví dụ gọi hàm imopen để thực hiện các thao tác mở về 
hình thái học. Chú ý lời gọi đến hàm strel, tạo ra một 
phần tử cấu trúc hình đĩa với bán kính 15. Để loại bỏ các 
hạt gạo từ hình ảnh, các phần tử cấu trúc phải đủ lớn để 
nó không thể đặt vừa toàn bộ bên trong một hạt gạo.
background = imopen(I,strel('disk',15));
 Để xem ảnh background ước lượng, gõ lệnh:
imview(background)
Ví dụ 2
 Xem xấp xỉ Background như một bề mặt.
 Sử dụng lệnh surf để tạo ra một màn hình hiển thị bề mặt của xấp xỉ 
nền. Lệnh surf tạo bề mặt màu tham số cho phép bạn xem các hàm 
toán học trong một vùng chữ nhật . Hàm surf yêu cầu dữ liệu lớp
double, do đó, trước tiên bạn cần phải chuyển đổi nền bằng lệnh 
double
figure, surf(double(background(1:8:end,1:8:end))),zlim([0 255]);
set(gca,'ydir','reverse');
0
10
20
30
40
0
10
20
30
40
0
50
100
150
200
250
Ví dụ 2
Tạo một hình ảnh với Uniform Background
 Để tạo một nền đồng nhất, trừ ảnh nền, hình nền, từ hình 
ảnh ban đầu I
I2 = imsubtract(I,background);
 Vì phép trừ, giống như nhiều phép toán trong MATLAB, chỉ 
hỗ cho dữ liệu lớp double, bạn phải sử dụng hàm 
imsubtract Image Processing Toolbox.
 Hiển thị hình ảnh với nền đồng nhất hơn.
imview(I2)
Ví dụ 2
 Điều chỉnh độ tương phản trong ảnh đã xử lý
 Sau phép trừ, hình ảnh có một nền thống nhất nhưng ảnh hơi tối quá.
 Sử dụng imadjust để điều chỉnh độ tương phản của hình ảnh.
I3 = imadjust(I2);
 imadjust làm tăng độ tương phản của hình ảnh bằng cách làm bão 
hòa 1% dữ liệu ở cả hai cường độ thấp và cao của I2 và bằng cách trải 
dài các giá trị cường độ để điền đầy phạm vi động uint8.
 Hiển thị ảnh I3 đã được điều chỉnh. 
imview(I3);
Ví dụ 2
Tạo ra một Phiên bản nhị phân của ảnh
 Tạo một phiên bản nhị của hình ảnh bằng cách sử 
dụng ngưỡng. 
• Hàm Graythresh tự động tính ra một ngưỡng thích 
hợp sử dụng để chuyển đổi ảnh cường độ sang ảnh nhị 
phân.
• Hàm Im2bw thực việc chuyển đổi.
level = graythresh(I3);
bw = im2bw(I3,level); 
imview(bw)
Ví dụ 2
Tạo ra một Phiên bản nhị phân của ảnh
 ảnh nhị phân bw tạo ra bởi lệnh im2bw thuộc lớp 
logical, xem bằng lệnh whos
whos
Ví dụ 2
 Xác định số lượng đối tượng trong Image
 Sau khi chuyển đổi ảnh sang một ảnh nhị phân, có thể sử dụng hàm 
bwlabel để xác định số hạt cơm trong hình ảnh. 
 Hàm bwlabel gán nhãn tất cả các thành phần trong ảnh nhị phân bw
và trả về số lượng các thành phần mà nó tìm thấy trong ảnh tại tham số 
đầu ra, numObjects
[labeled,numObjects] = bwlabel(bw,4)
numObjects =
101
Ví dụ 2
Xác định số lượng đối tượng trong Image
 Độ chính xác của kết quả phụ thuộc vào một số 
yếu tố, bao gồm:
• Kích thước của các đối tượng
• Có hay không có đối tượng được chạm vào (trong 
trường hợp chúng được gán nhãn là một trong những 
đối tượng)
• Độ chính xác của xấp xỉ nền
• Các kết nối được chọn .
• Tham số 4, trong hàm bwlabel, có nghĩa là điểm ảnh 
được chạm dọc theo một cạnh để được xem xét kết nối
Ví dụ 2
Xem xét ma trận nhãn
 Để hiểu rõ hơn về ma trận nhãn trả về bởi hàm bwlabel, 
bước này khám phá các giá trị điểm ảnh trong hình ảnh. 
 Có một số cách để có được một cái nhìn cận cảnh các giá 
trị điểm ảnh, ví dụ:
• sử dụng imcrop để chọn một phần nhỏ của hình ảnh.
• sử dụng imview để hiển thị ma trận nhãn và sử dụng các tính 
năng của Image Viewer để kiểm tra giá trị điểm ảnh.
imview(labeled)
Ví dụ 2
Xem xét ma trận nhãn
Ví dụ 2
 Hiển thị Ma trận Nhãn như một ảnh chỉ số PseudoColor
 Một cách tốt để xem một ma trận nhãn là để hiển thị nó như một ảnh 
chỉ số PseudoColor. 
 Trong hình ảnh PseudoColor, con số xác định một đối tượng trong bản 
đồ ma trận nhãn với một màu sắc khác nhau trong ma trận bản đồ màu 
được liên kết . Các màu trong ảnh làm các đối tượng dễ phân biệt 
được. 
 Để xem một ma trận nhãn theo cách này, sử dụng hàm label2rgb. 
Sử dụng hàm này, bạn có thể chỉ định bản đồ màu, màu nền, và cách 
các đối tượng trong bản đồ ma trận nhãn có màu nào bản đồ màu.
pseudo_color = label2rgb(labeled, @spring, 'c', 'shuffle');
imview(pseudo_color); 
Ví dụ 2
 Hiển thị Ma trận Nhãn như một ảnh chỉ số PseudoColor
pseudo_color = label2rgb(labeled, @spring, 'c', 'shuffle');
imview(pseudo_color); 
Phép lọc tuyến tính
Trong Matlab, sử dụng hàm fspecial để tạo 
mặt nạ lọc
>> H= fspecial('type',parameter) 
'average' averaging filter
'disk' circular averaging filter
'gaussian' Gaussian lowpass filter
'motion' motion filter
'prewitt' Prewitt horizontal edge-emphasizing filter
'sobel' Sobel horizontal edge-emphasizing filter
'unsharp' unsharp contrast enhancement filter
Phép lọc tuyến tính
Tự tạo bộ lọc
>>h=1/10*[1 1 1; 1 2 1; 1 1 1]
 Sử dụng hàm imfilter để lọc ảnh
>> I2=imfilter(I1,H)
 Trong đó:
•I1: ma trận chứa dữ liệu điểm ảnh
•H: mặt nạ lọc
•I2: Ảnh đã qua phép lọc
Phép lọc tuyến tính
Mặt nạ average
 H= fspecial('average',[r c])
 Bộ lọc trung bình, kích thước mặc định 3x3
 Ví dụ:










111
111
111
9
1
Phép lọc tuyến tính
Mặt nạ disk
 H= fspecial('disk',r)
 Bộ lọc tròn chung bình, r có mặc định bằng 5
 Mặt nạ lọc có kích thước 2r+1
 Ví dụ: H= fspecial('disk',3)
Mặt nạ gaussian
 H= fspecial('gaussian',[r c],sig)
 Mặc định là 3x3 và sig=0.5
 Các hệ số của là các phần tử rời rạc của phân bố 
Gauss 
Phép lọc tuyến tính
Mặt nạ motion
 H= fspecial('motion',len,theta)
 Giá trị mặc định len=9, theta=0
 Được sử dụng để làm nhòe ảnh có hướng
 Ví dụ:
I = imread('saturn.tif');
subplot(1,2,1);imshow(I);title('Original'); 
H = fspecial('motion',50,45);
I2 = imfilter(I,H);
subplot(1,2,2);imshow(I2);title('Motion Blurred');
Phép lọc tuyến tính
 Mặt nạ prewitt
H=fspecial('prewitt')
 Mặt nạ sobel
H=fspecial('sobel')










−−− 111
000
111










−−− 121
000
121
Phép lọc tuyến tính
Mặt nạ unsharp
 H= fspecial('unsharp',alpha)
 Tăng cường độ nét và tương phản
 Kích thước 3x3, tham số alpha mặc định = 0.2
 Ví dụ:
I = imread('moon.tif');
h =fspecial('unsharp');
imshow(I)
I2 = imfilter(I,h);
figure,imshow(I2)
Phép lọc tuyến tính
Lọc tuyến tính
Mặt nạ Lapalacian
 fspecial('laplacian', alpha) 
 Tăng độ sắc nét cho ảnh
Phép lọc tuyến tính
Ví dụ
I=imread('cameraman.tif');
H = fspecial('average');
I2 = imfilter(I,H);
imshow(I);figure,imshow(I2);
Loại bỏ viền đen
Loại bỏ viền đen
Để loại bỏ viền đen
I3 = imfilter(I,H,'replicate');
imshow(I2);figure,imshow(I3);
Phép lọc phi tuyến
 Mục đích giảm nhiễu xung
 Các loại bộ lọc phi tuyến
 Bộ lọc hạng bậc
 Bộ lọc trung vị
 Bộ lọc co giãn
 Bộ lọc bậc r
 Bộ lọc k láng giềng
Lọc phi tuyến
Bộ lọc hạng: là phương pháp lọc trong đó 
mức xám tại một điểm được tính dựa trên sự 
xếp hạng các điểm ảnh lân cận. 
Hàm ordfilt2 cung cấp cho ta bộ lọc dạng này
g= ordfilt2(f, order, domain) 
Ví dụ
g=ordfilt2(f,1,ones(m,n)); 
g=ordfilt2(f,m*n,ones(m,n)); 
Bộ lọc phi tuyến
Lọc trung vị
g=ordfilt2(f,median(1:m*n),ones(m,n)); 
Matlab cũng cung cấp hàm medfilt2 để thực hiện lọc 
trung vị. 
g=medfilt2(f); 
Ví dụ
I = imread('eight.tif');
J = imnoise(I,'salt & pepper',0.02);
K = medfilt2(J);
imshow(J), figure, imshow(K)
Khôi phục ảnh
Khôi phục ảnh tập trung vào việc loại bỏ hay 
giảm thiểu sự biến dạng xảy ra trong quá trình 
thu nhận ảnh. 
Sự biến dạng ảnh có thể bao gồm : 
 Nhiễu-là những sai khác trong giá trị của pixel, 
 Ảnh hưởng quang học : sự mở do việc chuyển 
động của camera
 Ta có dạng tổng quát của ảnh bị biến dạng:
g(x,y) = f(x,y)*h(x,y) + n(x,y) 
Khôi phục ảnh
Nhiễu muối tiêu
I2= imnoise(I1,'salt & pepper') 
Khôi phục ảnh
Nhiễu gaussian
t = imnoise(image,’gaussian’) 
Khôi phục ảnh
Các phương pháp
 Sử dụng bộ lọc trung bình
 Bộ lọc hạng
 Bộ lọc chắn dải
 Bộ lọc thông dải
Tách biên ảnh
Biên ảnh là các điểm có cường độ thay đổi 
nhanh.
Tìm biên ảnh bằng cách sử dụng một trong hai 
tiêu chuẩn tổng quát sau:
 Tìm các nơi đạo hàm bậc nhất của cường độ sáng 
có biên độ hơn một ngưỡng. 
 Tìm các nơi đạo hàm bậc hai của cường độ sáng 
có sự thay đổi qua mức 0 
Tách biên ảnh
 Trong Matlab ta sử dụng hàm edge, cú pháp
I2 = edge (I1,'method') 
 Trong đó 'method' gồm : Sobel, Prewitt, Roberts, Cany...
 Ví dụ
I= imread('rice.tif');
BW1 = edge(I,'prewitt');
BW2 = edge(I,'canny');
imshow(BW1)
figure, imshow(BW2)
Tách biên ảnh
Kết quả

File đính kèm:

  • pdfxu_ly_tin_hieu_nang_cao_chuong_6_xu_ly_anh_trong_matlab.pdf