Tải bản đầy đủ (.pdf) (51 trang)

Bài giảng Xử lý tín hiệu nâng cao (Advanced signal processing) - Chương 6: Xử lý ảnh trong Matlab

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.21 MB, 51 trang )

Xử lý tín hiệu nâng cao
-Advanced signal processingChươ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)

1400
1200

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.

1000
800
600
400
200
0
0

50

100

150

200


250


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)
1600
1400
1200
1000
800
600
400
200
0
0


50

100

150

200

250


Thực hiện cân bằng Histogram trên ảnh
Ảnh trước và sau khi được cân bằng histogram

1600
1400

1600

1200

1400
1200

1000

1000

800


800

600
600

400
400

200
200

0

0

0

50

100

150

200

250

0


50

100

150

200

250


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');
250
200
150
100
50

0
0
10

40
30

20

20

30

10
40

0


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



×