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)
51 trang |
Chia sẻ: huongthu9 | Lượt xem: 575 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bà giảng Xử lý tín hiệu nâng cao - Chương 6: Xử lý ảnh trong Matlab, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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ả
Các file đính kèm theo tài liệu này:
- ba_giang_xu_ly_tin_hieu_nang_cao_chuong_6_xu_ly_anh_trong_ma.pdf