Mục lục
- Các kiểu ảnh , các thao tác ảnh cơ bản trong Toolbox ------------- Trang 1
- Phép xử lý trên vùng chọn ------------------------------------------------- Trang 16
- Xử lý ảnh mờ ------------------------------------------------------------------Trang 23
- Màu sắc------------------------------------------------------------------------- Trang 38
- Biến đổi ảnh ------------------------------------------------------------------- Trang 52
- Biến đổi không gian ảnh ---------------------------------------------------- Trang 78
- Phân tích và làm giàu ảnh -------------------------------------------------- Trang 98
- Các biến đổi hình thái ảnh ------------------------------------------------- Trang 129
Tag: cách xử lý ảnh trong matlab
I – Các kiểu ảnh , các thao tác ảnh cơ bản trong Toolbox
- Ả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 mất kì bản đồ màu nào. Hình sau đây minh hoạ
cấu trúc của một ảnh chỉ số. Các pixel trong ảnh được đại diện bởi một số nguyên ánh xạ
tới một giá trị tương ứng trong bản đồ màu.
(ẢNH )
Lớp và độ lệch của bản đồ màu ( Colormap Offsets )
- Quan hệ giữa giá trị trong ma trận ảnh và giá trị trong bản đồ màu phụ thuộc vào kiểu
giá trị của các phần tử ma trận ảnh. Nếu các phần tử ma trận ảnh thuộc kiểu double , giá
trị 1 sẽ tương ứng với giá trị trong hàng thứ nhất của bản đồ màu , giá trị 2 sẽ tương ứng
với giá trị trong hàng thứ 2 của bản đồ màu ... Nếu các phần tử của ma trận ảnh thuộc
kiểu uint8 hay uint16 sẽ có một độ lệch (offset ) – giá trị 0 trong ma trận ảnh sẽ tương
ứng với giá trị trong hàng đầu tiên của bản đồ màu , giá trị 1 sẽ tương ứng với giá trị
trong hàng thứ 2 của bản đồ màu ....
- Độ lệch cũng được sử dụng trong việc định dạng file ảnh đồ hoạ để tăng tối đa số lượng
màu sắc có thể được trợ giúp.
Giới hạn trong việc trợ giúp ảnh thuộc lớp unit
- Toolbox xử lý ảnh của Matlab trợ giúp có giới hạn ảnh chỉ số thuộc lớp uint16. Ta có
thể đọc những ảnh đó và hiển thị chúng trong Matlab nhưng trước khi xử lý chúng , ta
phải chuyển đổi chúng sang kiểu uint8 hoặc double. Để chuyển đổi ( convert ) tới kiểu
double ta dùng hàm im2double. Để giảm số lượng màu của ảnh xuống 256 màu (uint8 )
sử dụng hàm imapprox.
- Ả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
dơ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
- Hai giá trị này tương ứng với bật hoặ tắt ( on hoặc off ). Một ảnh nhị phân được lưu
trữ như một mảng lôgíc 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
- Mảng ảnh nhiều khung hình ( Multiframe Image Arrays )
- Với một vài ứng dụng , ta có thể cần làm việc với một tập hợp các ảnh quan hệ với thời
gian hoặc khung nhìn như MRI hay khung hình phim.
- Toolbox xử lý ảnh trong Matlab cung cấp sự trợ giúp cho việc lưu trữ nhiều ảnh trong
cùng một mảng. Mỗi ảnh được gọi là một khung hình ( Frame ). Nếu một mảng giữ
nhiều frame , chúng được nối theo 4 chiều. Chẳng hạn , một mảng với năm ảnh có kích
thước 400x300 sẽ là một mảng có kích thước 400x300x3x5. Một ảnh chỉ số hoặc ảnh
cường độ nhiều khung tương tự sẽ là 400x300x1x.
- Sử dụng lệnh cat để chứa các ảnh riêng rẽ trong một mảng nhiều khung hình. Chẳng
hạn , nếu ta có một nhóm các ảnh A1,A2,A3,A4 và A5 , ta có thể chứa chúng trong một
mảng duy nhất sử dụng
A=cat(4,A1,A2,A3,A4,A5 )
- Ta cũng có thể trích các khung hình từ một ảnh nhiều khung hình. Chẳng hạn , nếu ta
có một ảnh nhiều khung hình MULTI , lệnh sau đây sẽ trích ra khung hình thứ 3
FRM3=MULTI( : , : , : , 3 )
- Ghi nhớ rằng , trong một mảng ảnh nhiều khung hình , mỗi ảnh phải có cùng kích thước
và có cùng số mặt phẳng. Trong một ảnh chỉ số nhiều khung , mỗi ảnh phải sử dụng
cùng một bản đồ màu
Sự trợ giúp giới hạn với ảnh nhiều khung
- Nhiều hàm trong toolbox hoạt động chỉ trên 2 hoặc 3 chiều đầu tiên. Ta có thể sử dụng
chiều thứ 4 với những hàm này nhưng ta phải xử lý mỗi khung hình một cách độc lập.
Chẳng hạn , lời gọi hàm sau sẽ hiển thị khung hình thứ 7 trong một mảng MULTI
imshow(MULTI(: , : , : , 7 ))
- Nếu ta truyền một mảng vào hàm và mảng có nhiều chiều hơn số chiều mà hàm đã
được thiết kế để hoạt động , kết quả có thể không đoán trước được. Trong một số trường
hợp , hàm đơn giản chỉ xử lý khung hình đầu tiên nhưng trong các trường hợp khác , sự
hoạt động không tạo ra kết quả nào có ý nghĩa.
- 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 màu ảnh được lưu trữ dưới dạng ảnh chỉ
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 độ trong ảnh tương ứng. Nếu ta cố gắng lọc ảnh chỉ số
, Matlab đơn giản chỉ áp đặt phép lọc tới ma trận ảnh chỉ số và kết quả sẽ không có ý
nghĩa
Chú ý : Khi convert 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 convert 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 convert ả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
- 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 3
phần copy 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.
- Thêm vào những công cụ chuyển đổi chuẩn đã nói ở trên , cũng có một số hàm mà trả
lại kiểu ảnh khác như một phần trong thao tác mà chúng thực hiện. Xem thêm Help
Online
Chuyển đổi không gian màu
- Toolbox xử lý ảnh biểu diễn màu sắc như các giá trị RGB ( trực tiếp trong ảnh RGB
hoặc gián tiếp trong ảnh chỉ số ). Tuy nhiên , có các phương pháp khác cho việc biểu
diễn màu sắc. Chẳng hạn , một màu có thể được đại diện bởi các giá trị hue , saturation
for frame=1:
[mri(:,:,:,frame),map] = imread('mri',frame);
end
- Khi file chứa nhiều ảnh theo một số kiểu nhất định chẳng hạn theo thứ tự thời gian , ta
có thể lưu ảnh trong Matlab dưới dạng mảng 4 chiều. Tất cả các ảnh phải có cùng kích
thước.
- Ghi một ảnh đồ hoạ
- Hàm imwrite sẽ ghi một ảnh tới một file đồ hoạ dưới một trong các định dạng được trợ
giúp. Cấu trúc cơ bản nhất của imwrite sẽ yêu cầu một biến ảnh và tên file. Nếu ta gộp
một phần mở rộng trong tên file , Matlab sẽ nhận ra định dạng mong muốn từ nó. Ví dụ
sau tải một ảnh chỉ số X từ một file Mat với bản đồ màu kết hợp với nó map sau đó ghi
ảnh xuống một file bitmap.
load clown
whos
Name Size Bytes Class
X 200x320 512000 double array
caption 2x1 4 char array
map 81x3 1944 double array
Grand total is 64245 elements using 513948 bytes
imwrite(X,map,'clown')
Chỉ ra định dạng phụ - Tham số đặc biệt
- Khi sử dụng imwrite với một số định dạng đồ hoạ , ta có thể chỉ ra các tham số phụ.
Chẳng hạn , với định dạng PNG ta có thể chỉ ra độ sâu bít như một tham số phụ. Ví dụ
sau sẽ chi một ảnh cường độ I với một file ảnh 4 bít PNG
imwrite(I,'clown','BitDepth',4 );
- Để biết thêm các cấu trúc khác của hàm xem phần trợ giúp trực tuyến của Matlab.
Đọc và ghi ảnh nhị phân theo định dạng 1 bít
- Trong một số định dạng file , một ảnh nhị phân có thể được lưu trong một định dạng 1
bít. Nếu định dạng file trợ giúp nó ,Matlab ghi ảnh nhị phân như ảnh 1 bít theo mặc
định. Khi ta đọc một ảnh nhị phân với định dạng 1 bít , Matlab đại diện nó trong không
gian làm việc như một mảng lôgíc.
- Ví dụ sau đọc một ảnh nhị phân và ghi nó dưới dạng file TIFF. Bởi vì định dạng TIFF
trợ giúp ảnh 1 bít , file được ghi lên đĩa theo định dạng 1 bít :
BW = imread('text');
imwrite(BW,'test');
Để kiểm tra chiều sâu bít của file test , gọi hàm iminfo và kiểm tra trường BitDepth
của nó :
info = imfinfo('test');
info
ans =
1
Chú ý : Khi gi file nhị phân , Matlab thiết lập trường ColorType thành ‘grayscale’
Xem lớp lưu trữ của file
- Hàm imwrite sử dụng luật sau đây để quyết định lớp lưu trữ được sử dụng trong ảnh kết
quả :
- logical : Nếu định dạng ảnh ra ( Output Image ) được chỉ rõ là trợ giúp ảnh 1 bít , hàm
imwrite tạo một file ảnh 1 bít. Nếu định dạng ảnh ra được chỉ rõ là không trợ giúp ảnh 1
bít ( như JPEG ) , hàm imwrite chuyển ảnh tới một ảnh thuộc lớp uint
- uint8 : Nếu định dạng ảnh ra được chỉ rõ là trợ giúp ảnh 8 bít , hàm imwrite tạo một
ảnh 8 bít
+uint16 : Nếu định dạng ảnh ra được chỉ rõ trợ giúp ảnh 16 bít ( PNG hoặc TIFF ) , hàm
imwrite tạo một ảnh 16 bít. Nếu định dạng ảnh ra không trợ giúp ảnh 16 bít , hàm
chuyển đổi dữ liệu ảnh tới lớp uint8 và tạo một ảnh 8 bít.
+double : Matlab chuyển dữ liệu ảnh tới dạng uint8 và tạo một ảnh 8 bít bởi vì hầu hết
các file ảnh sử dụng định dạng 8 bít.
- Truy vấn một file đồ hoạ
- Hàm iminfo cho phép ta có thể nhận được thông tin về một file ảnh được trợ giúp bởi
toolbox. Thông tin mà ta nhận được phụ thuộc vào kiểu của file nhưng nó luôn bao gồm
những thông tin sau :
khác của dữ liệu như : cách thức được sử dụng để tạo dữ liệu , thiết lập thiết bị dùng để
chụp ảnh , thông tin về việc nghiên cứu ..àm dicomread có thể xử lý hầu hết tất cả các
trường metadata được định nghĩa bởi đặc trưng DICOM ( hay chuẩn DICOM )
- Để đọc metadata từ một file DICOM , sử dụng hàm dicominfo. Hàm này trả về một cấu
trúc metadata mà mọi trường trong cấu trúc là một phần đặc trưng của metadata trong file
DICOM đó.
info = dicominfo('CT-MONO2-16-ankle');
info =
Filename: [1x47 char]
FileModDate: '24-Dec-2000 19:54:47'
FileSize: 525436
Format: 'DICOM'
FormatVersion: 3
Width: 512
Height: 512
BitDepth: 16
ColorType: 'grayscale'
SelectedFrames: []
FileStruct: [1x1 struct]
StartOfPixelData: 1140
MetaElementGroupLength: 192
FileMetaInformationVersion: [2x1 double]
MediaStorageSOPClassUID: '1.2.840.10008.5.1.4.1.1'
MediaStorageSOPInstanceUID: [1x50 char]
TransferSyntaxUID: '1.2.840.10008.1'
ImplementationClassUID: '1.2.840.113619.6'
.
.
.
Ta có thể sử dụng cấu trúc metadata được trả lại bởi hàm dicominfo để chỉ định file
DICOM ta muốn đọc sử dụng hàm dicomread. Chẳng hạn , ta có thể sử dụng đoạn mã
sau đây để đọc metadata từ một file DICOM mẫu và sau đó truyền metadata đó tới hàm
dicomread để đọc ảnh từ file :
info = dicominfo('CT-MONO2-16-ankle');
I = dicomread(info);
3. Ghi dữ liệu lên một file DICOM
- Để ghi dữ liệu lên một file DICOM , sử dụng hàm dicomwrite. Ví dụ sau ghi một ảnh I
tới file DICOM ankle
dicomwrite(I,'h:\matlab\tmp\ankle')
Ghi metadata lên một file DICOM
Khi ta ghi dữ liệu ảnh lên một file DICOM , hàm dicomwrite bao gồm một tập hợp nhỏ
nhất của các trường trong metadata được yêu cầu bởi kiểu của đối tượng thông tin
DICOM ( IOD ) mà ta đang tạo. dicomwrite trợ giúp 3 kiểu DICOM IOD :
- Secondary capture ( mặc định )
- Magnetic resonance
- Computed tomography
- Ta có thể chỉ rõ matadata nào ta muốn ghi lên file bằng cách truyền tới hàm dicomwrite
một cấu trúc metadata nhận được từ hàm dicominfo
info = dicominfo('CT-MONO2-16-ankle');
I = dicomread(info);
dicomwrite(I,'h:\matlab\tmp\ankle',info)
- Trong trường hợp này , hàm dicomwrite ghi thông tin trong cấu trúc metadata info lên
một file DICOM mới. Khi ghi dữ liệu tới file , có một số trường mà dicomwrite phải cập
nhật. Chẳng hạn , dicomwrite phải cập nhật ngày tháng sửa đổi của file mới. Để minh
hoạ , so sánh ngày sửa đổi của metadata gốc với ngày sửa đổi file trong file mới :
info
ans =
24-Dec-2000 19:54:
Sử dụng dicominfo , đọc metadata từ một file mới được ghi , kiểm tra ngày sửa đổi file :
Ta có thể nhập vào như sau :
I = imread('rice');
I2 = imread('cameraman');
K = imdivide(imadd(I,I2), 2); % not recommended
- Khi được sử dụng với kiểu uint8 hay uint16 , mỗi hàm số học cắt kết quả của nó trước
khi truyền nó cho hàm thiếp theo. Sự cắt bỏ này có thể giảm đáng kể lượng thông tin
trong ảnh cuối cùng. Một cách làm tốt hơn để thực hiện một chuỗi các tính toán là sử
dụng hàm imlincomb. Hàm này thi hành tất cả các phép toán số học trong sự kết hợp
tuyến tính của độ chính xác kép và chỉ cắt bỏ kết quả cuối cùng :
K = imlincomb(.5,I,.5,I2); % recommended
- Hệ thống toạ độ
- Vị trí trong một ảnh có thể được biểu diễn trong các hệ thống toạ độ khác nhau phụ
thuộc vào ngữ cảnh. Có hai hệ thống toạ độ trong Matlab là : hệ thống toạ độ pixel và hệ
thống toạ độ không gian.
- Toạ độ pixel
- Nhìn chung , phương pháp thuận tiện nhất cho việc biểu diễn vị trí trong một ảnh là sử
dụng toạ độ pixel. Trong hệ toạ độ này , ảnh được xử lý như một lưới của các phần tử
riêng biệt được đánh thứ tự từ đỉnh tới đáy và từ trái sang phải.
- Với toạ độ pixel , thành phần đầu tiên r ( hàng ) được tăng từ khi đi từ trên xuống dưới
trong khi c ( cột ) được tăng khi đi từ trái sang phải. Hệ toạ độ pixel là giá trị nguyên và
khoảng giữa 1 và chiều dài của hàng hay cột
- Có một tương ứng 1-1 giữa toạ độ pixel và toạ độ Matlab sử dụng để mô tả ma trận. Sự
tương ứng này tạo một quan hệ gữa ma trận dữ liệu ảnh và cách ảnh được hiển thị.
Chẳng hạn , dữ liệu cho pixel trên hàng thứ 5 , cột thứ 2 được lưu trữ tại phần từ (5,2) của
ma trận.
- Toạ độ không gian
- Trong hệ toạ độ pixel , một pixel được xử lý như một đơn vị riêng rẽ được phân biệt
duy nhất bởi một cặp toạ độ chẳng hạn (5,2 ). Từ quan điểm này , một vị trí chẳng hạn
(5,2) không có ý nghĩa. Tuy nhiên , sẽ hữu ích khi nghĩ đến một pixel như một miếng vá
hình vuông. Từ quan điểm này , một vị trí chẳng hạn (5,2) là có nghĩa và được phân
biệt với (5,2). Trong toạ độ không gian này , vị trí trong một ảnh được định vị trên một
mặt phẳng và chúng được mô tả bằng một cặp x và y ( không phải r và c như toạ độ
pixel ).
- Hệ toạ độ không gian này gần tương ứng với hệ toạ độ pixel trong một chừng mực nào
đó. Chẳng hạn , toạ độ không gian của điểm gữa của bất kì pixel nào được phân biệt với
toạ độ pixel của pixel đó. Cũng có một vài khác biệt , tuy nhiên , trong toạ độ pixel , góc
trên trái của một ảnh là (1,1 ) trong khi trong toạ độ không gian , vị trí này mặc định là
(0,0 ). Sự khác nhau này là do hệ toạ độ pixel là rời rạc trong khi toạ độ không gian
là liên tục. Cũng vậy , góc trên trái luôn là (1,1 ) trong hệ pixel , nhưng ta có thể chỉ ra
một điểm gốc không chính quy cho hệ toạ độ không gian. Một sự khác biệt dễ gây nhầm
lẫn nữa là quy ước : thứ tự của các thành phần nằm ngang và thẳng đứng được phục vụ
cho kí hiệu của hai hệ thống. Như đã đề cập trước đây , toạ độ pixel được đại diện bởi
một cặp (r,c ) trong khi toạ độ không gian được biểu diễn bởi (x,y). Khi cú pháp cho một
hàm sử dụng r và c , nó tham chiếu đến hệ toạ độ pixel. Khi cú pháp sử dụng x, y nó
đang ngầm định sử dụng hệ toạ độ không gian.
Sử dụng hệ toạ độ không gian không chính quy
- Theo mặc định , toạ độ không gian của một ảnh tương ứng với toạ độ pixel. Chẳng
hạn , điểm giữa của pixel tại (5,3) có một toạ độ không gian là x=3, y=5 ( nhớ rằng thứ tự
của toạ độ bị đảo ngược ). Sự tương ứng này làm đơn giản nhiều hàm trong toolbox.
Một vài hàm ban đầu làm việc với toạ độ không gian hơn là toạ độ pixel nhưng khi ta
đang sử dụng toạ độ không gian theo mặc định , ta có thể chỉ ra vị trí trong toạ độ pixel
- Trong một số tình huống , tuy nhiên , ta có thể muốn sử dụng toạ độ không gian không
chính quy ( không mặc định ). Chẳng hạn , ta có thể chỉ ra góc trên trái của một ảnh tại
điểm (19,7 ) thay cho (0,0,5 ). Nếu ta gọi một hàm mà trả về toạ độ cho ảnh này ,
toạ độ được trả lại sẽ là giá trị trong hệ toạ độ không chính quy.
- Để thành lập toạ độ không chính quy , ta có thể chỉ ra Xdata và Ydata của một ảnh khi
hiển thị nó. Những thuộc tính này là véc tơ 2 phần tử để điều khiển khoảng của góc quay
của một ảnh. Theo mặc định , một ảnh A , Xdata là [1 size(A,2)] , và Ydata là [
size(A,1)]. Chẳng hạn , nếu A là 100 hàng x 200 cột , giá trị Xdata mặc định là [1 200]
và Ydata là [1 100]. Những giá trị trong những véc tơ này thực là toạ độ của điểm giữa
của pixel đầu tiên và cuối cùng vì vậy , khoảng toạ độ thực được quay là lớn hơn , chẳng
hạn , nếu Xdata là [ 1 200] thì khoảng của x là [0 200]. Những lệnh sau hiển thị một
ảnh sử dụng các giá trị không mặc định Xdata và Ydata :
Khi sử dụng cấu trúc này thì dữ liệu ảnh không được nhập vào trong không gian làm việc
. Tuy nhiên ,ta có thể mang ảnh vào trong không gian làm việc bằng cách sử dụng hàm
getimage. Hàm này sẽ nhận dữ liệu ảnh từ handle của một đối tượng ảnh hiện tại. Chẳng
hạn :
moon = getimage;
Sẽ gán dữ liệu ảnh từ moon vào biến moon.
II. Xử lý trên cơ sở vùng chọn ( Region – Based Processing )
- Trong phần này , ta sẽ xem xét những khía cạnh sau :
- Bảng thuậ ngữ : Cung cấp các thuật ngữ được sử dụng trong các phép xử lý
- Chỉ định rõ một vùng ta quan tâm : Mô tả làm sao để chỉ ra một vùng quan tâm sử dụng
hàm roipoly
- Lọc một vùng : Diễn tả làm sao để áp đặt một phép lọc lên mộg vùng nhất định của ảnh
sử dụng hàm roifilt
- Tô đầy một vùng : Sử dụng hàm roifill để tô đầy một vùng đã chọn
- Bảng các thuật ngữ :
Tên thuật ngữ Diễn tả
Binary mask Ảnh nhị phân với cùng kích thước như ảnh
ta muốn xử lý. Mặt nạ chứa giá trị 1 cho
tất cả các pixel thuộc trong vùng ta quan
tâm và chứa giá trị 0 cho các vùng khác
Filling a region Là quá trình xử lý điền đầy ( hay tô màu )
một vùng nhất định bằng cách nội suy giá
trị pixel từ viền của vùng. Quá trình xử lý
này có thể được sử dụng để tạo một đối
tượng trong một ảnh dường như biến mất
khi chúng được thay thế với giá trị được
trộn với vùng nền
Filtering a region Áp đặt một phép lọc lên một vùng nhất
định. Chẳng hạn , ta có thể áp đặt một sự
phép lọc điều chỉnh cường độ lên một vùng
của ảnh
Nội suy Phương pháp được sử dụng để ước lượng
một giá trị ảnh ở một vị trí nhất định giữa
các pixel của ảnh
Masked filtering Thao tác chỉ áp đặt một phép lọc lên một
vùng quan tâm trong một ảnh được phân
biệt bằng mặt nạ nhị phân. Giá trị được lọc
được trả lại cho các pixel mà mặt nạ nhị
phân chứa giá trị 1 , giá trị không được lọc
được trả về cho các pixel mà mặt nạ nhị
phân chứa giá trị 0
- Chỉ định một vùng quan tâm trên ảnh
- Một vùng quan tâm là một phần của ảnh mà ta muốn lọc hoặc thi hành các thao tác khác
trên nó. Ta định nghĩa một vùng quan tâm bằng cách tạo ra một mặt nạ nhị phân , đó là
một ảnh nhị phân có cùng kích thước với ảnh ta muốn xử lý. Mặt nạ chứa giá trị 1 cho tất
cả các pixel nằm trong vùng quan tâm và chứa giá trị 0 cho các pixel ở những vùng khác.
a - Chọn một hình đa giác
- Ta có thể sử dụng hàm roipoly để chỉ ra một vùng hình đa giác quan tâm. Nếu ta gọi
hàm roipoly không có tham số , con trỏ thay đổi thành hình chữ thập khi nó đi qua ảnh
đang được hiển thị trên trục hiện tại. Sau đó , ta có thể chỉ ra đỉnh của đa giác bằng cách
kích trỏ chuột trên ảnh. Khi thực hiện xong việc chọn các đỉnh , nhấn phím Enter để kết
thúc. hàm roipoly trả về một ảnh nhị phân có cùng kích thứơc với ảnh gốc chứa giá trị 1
trong vùng được chọn và 0 ở phần còn lại.
I = imread('pout');
imshow(I)
BW = roipoly;
- Ta cũng có thể sử dụng hàm roipoly mà không tương tác. Cú pháp của hàm này như
sau :
BW = roipoly(I,c,r)
BW = roipoly(I)
ảnh đang được lọc. Chẳng hạn , giả sử ta muốn lọc ảnh cường độ I , chỉ lọc những pixel
mà giá trị của nó lớn hơn 0. Ta có thể tạo một mặt nạ tương ứng với lệnh :
BW = (I > 0);
- Ta cũng có thể sử dụng hàm poly2mask để tạo một mặt nạ nhị phân. Không giống hàm
roipoly , poly2mask không yêu cầu một ảnh vào. Ngoài ra , ta còn có thể sử dụng hàm
roicolor để định nghĩa một vùng quan tâm trên cơ sở một màu hoặc một vùng cường độ
nào đó. Cú pháp của hàm này như sau :
BW = roicolor(A,low,high)
BW = roicolor(A,v)
Diễn giải
- Hàm roicolor lựa chọn một vùng quan tâm trong một ảnh chỉ số hoặc ảnh cường độ và
trả về một ảnh nhị phân
- BW=roicolor(A,low,high) : trả về một vùng quan tâm được lựa chọn với những pixel
nằm trong khoảng giữa low và high trong bản đồ màu sắc
BW = (A >= low) & (A <= high)
BW là một ảnh nhị phân
+BW = roicolor(A,v): Trả về một vùng quan tâm được lựa chọn với những pixel trong A
mà hợp với các giá trị trong véc tơ v. BW là một ảnh nhị phân.
Lớp trợ giúp
- Ảnh vào A phải thuộc lớp numeric. Ảnh ra BW thuộc lớp logical
Ví dụ
I = imread('rice');
BW = roicolor(I,128,255);
imshow(I);
figure, imshow(BW)
- Lọc một vùng
- Ta có thể sử dụng hàm roifilt2 để xử lý một vùng quan tâm. Khi ta gọi hàm roifilt2 , ta
chỉ ra một ảnh cường độ , một mặt nạ nhị phân và một bộ lọc. Hàm roifilt2 lọc ảnh vào
và trả về một ảnh mà chứa các giá trị đã được lọc cho các pixel mà mặt nạ nhị phân chứa
1 và các giá trị cho các pixel mà mặt nạ nhị phân chứa 0. Kiểu lọc này được gọi là lọc có
mặt nạ. Cú pháp của hàm roifilt2 như sau :
J = roifilt2(h,I,BW)
J = roifilt2(I,BW,fun)
J = roifilt2(I,BW,fun,P1,P2,...)
Diễn giải
- J=roifilt2(h,I,BW ) : Lọc dữ liệu trong I với bộ lọc tuyến tính hai chiều h. BW là một
ảnh nhị phân có cùng kích thước với ảnh gốc và được sử dụng như một mặt nạ cho việc
lọc. Hàm roifilt2 trả về một ảnh chứa các giá trị được lọc ở trong vùng chọn ( hay các
pixel mà BW có giá trị 1 )
- J=roifilt2(I,BW,fun) : Xử lý dữ liệu trong I sử dụng hàm fun. Kết quả , J chứa các giá
trị đã được tính toán cho các pixel mà tại đó BW chứa 1 và giá trị thực trong I cho các
pixel mà tại đó BW chứa giá trị 0.
- J=roifilt2(I,BW,fun,P1,P2...) Truyền thêm các tham số P1,P2 cho hàm fun
Lớp trợ giúp
- Với cấu trúc mà có chứa bộ lọc h , ảnh vào I có thể thuộc lơp uint ,uint16 hoặc double
và ảnh ra J có cùng lớp với ảnh vào.
Ví dụ
I = imread('eight');
c = [222 272 300 270 221 194];
r = [21 21 75 121 121 75];
BW = roipoly(I,c,r);
h = fspecial('unsharp');
J = roifilt2(h,I,BW);
imshow(J), figure, imshow(J)
Để hiểu rõ hơn về áp dụng bộ lọc cho một vùng , ta hãy xem xét cụ thể một ví dụ sau :
- Đọc một ảnh :
I = imread('pout');
- Tạo mặt nạ : Sử dụng chuột để tạo vùng chọn và lấy mặt nạ trả về qua BW
- Tạo bộ lọc
h = fspecial('unsharp');
- Gọi hàm roifilt2 , chỉ ra ảnh cần lọc , mặt nạ và bộ lọc
I2 = roifilt2(h,I,BW);
imshow(I)
figure, imshow(I2)