You are on page 1of 51

Trường ĐH Bách Khoa TpHCM

Khoa Khoa Học Ứng Dụng


Môn học: Nhận dạng hình ảnh & xử lý ảnh bằng kỹ thuật số

Phần 3: Phân vùng ảnh y sinh


(Biomedical Image Segmentation)

Trần Duy Linh


BM Vật lý Kỹ thuật Y sinh
ĐH Bách Khoa TpHCM

Tháng 3/2011
Khái niệm & Ứng dụng

Phân vùng ảnh là quá trình phân tách các cấu trúc quan
tâm ra khỏi nền (background) hoặc ra khỏi các cấu trúc
khác.
Ứng dụng:
Xác định (vị trí) và định lượng (diện tích, thể tích, số lượng)
– Các khối u, các vùng bất thường (trong ảnh Xquang, CT, MRI)
– Các mạch máu (ảnh DSA)
– Các vùng màu đỏ - xanh (trong ảnh Siêu âm Doppler)
– Các nhiễm sắc thể, tế bào máu (ảnh vi thể)…
Tiền xử lý trước khi nhận dạng ảnh
Tiền xử lý trước khi hợp nhất ảnh
Tiền xử lý trước khi tái tạo 3D
Làm thế nào để phân vùng ảnh?

Phân vùng ảnh

Ảnh thang xám Ảnh màu


Phát hiện

Sự không Sự tương tự nhau Tính khỏang cách điểm


liên tục về cường độ màu trong không gian
màu RGB, HSB…

Phát hiện Ngưỡng,


biên phát triển vùng,
(Sobel, đường phân nước
Canny…)
1. Phân vùng dựa vào sự tương tự về cường độ

1. Đặt ngưỡng (thresholding)

Ngưỡng đơn

Đa ngưỡng
1. Phân vùng dựa vào sự tương tự về cường độ

Matlab code
%Ví dụ đặt ngưỡng đơn
I = imread('rice.png');
BW = im2bw(I); %hay BW = im2bw(I,0.5); %ngưỡng: 0.5*255 = 128
BW1 = im2bw(I,0.3); %ngưỡng: 0.3*255 = 77
BW2 = im2bw(I,0.7); %ngưỡng: 0.7*255 = 179
imshow(I);
figure; imshow(BW);
figure; imshow(BW1);
figure;imshow(BW2);
%BW, BW1, BW2 là các ảnh nhị phân đóng vai trò là các mask (mặt nạ)

I BW BW1 BW2
1. Phân vùng dựa vào sự tương tự về cường độ

Matlab code
%Dùng mask đã có để hiển thị ảnh theo từng vùng
J1=I.*uint8(BW); %hiển thị ra vùng có cường độ >=128
J2=I.*uint8(~BW); %hiển thị ra vùng có cường độ <128
imshow(J1);
figure;imshow(J2);

%Ngưỡng đôi:
J3=I.*uint8(xor(BW1, BW2)); %vùng có cường độ >=77 và <179
J4=I.*uint8(~xor(BW1, BW2)); %vùng có cường độ >=179 và <77
imshow(J3);
figure;imshow(J4);

I J1 J2 J3 J4
1. Phân vùng dựa vào sự tương tự về cường độ

2. Đặt ngưỡng tự động (auto-thresholding)


 Mục tiêu: dùng thuật toán để tìm ra giá trị ngưỡng (T) phân chia 2 vùng, dựa
vào histogram.
 Kỹ thuật 1: Tìm 2 đỉnh cục bộ và điểm cực tiểu giữa 2 đỉnh đó. Giá trị tại
điểm cực tiểu = T
- Ưu điểm: đơn giản
- Khuyết điểm #1: nếu ảnh có nhiễu, rất khó xác định các đỉnh cục bộ & cực
tiểu. Khắc phục: khử nhiễu trước khi tìm ngưỡng.
1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Mục tiêu: dùng thuật toán để tìm ra giá trị ngưỡng (T) phân chia 2 vùng, dựa
vào histogram.
 Kỹ thuật 1 (tt):
- Khuyết điểm #2: nếu 2 vùng cần tìm chồng lấp (về cường độ) lên nhau càng
nhiều, thì càng khó khăn / thậm chí không thể xác định được điểm cực tiểu để
cho T được tối ưu (optimal)
1. Phân vùng dựa vào sự tương tự về cường độ
Nền Đối tượng Nền + Đối tượng

Ngưỡng sẽ chọn

Ngưỡng tối ưu
1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 2: Clustering (K-means Variation): chia histogram thành 2 vùng B
& vùng O. Ta chọn T sao cho các pixels có cường độ < T sẽ gần giá trị μB
hơn và các pixels có cường độ >T sẽ nằm gần giá trị μO hơn. (μB và μO là giá
trị cường độ trung bình của vùng B và O)

- Thuật toán: đầu tiên chọn 4 pixels ở 4 góc ảnh (có khả năng là background
cao nhất) gán vào vùng B. Các pixels còn lại gán vào vùng O. Cập nhật T.
Sau khi cập nhật giá trị T ta sẽ được 2 vùng mới. Tiếp tục cập nhật T cho đến
khi T không đổi nữa.
1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 2: K-means Variation:
- Ưu điểm: Khắc phục được khuyết điểm của kỹ thuật 1.
- Khuyết điểm: Chỉ thực hiện tốt khi phương sai (~bề rộng chóp) của 2 vùng
gần bằng nhau!
1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 3: Otsu’s: Nếu như kỹ thuật 2 không quan tâm đến phương sai của 2
vùng thì kỹ thuật Otsu sẽ tính ra phương sai của 2 vùng (σ2B, σ2O) và chọn T
sao cho tổng phương sai của 2 vùng có trọng số (σ2within) đạt cực tiểu.
Hay nói cách khác, nếu sự “trải ra” của 2 vùng càng bé thì càng giảm thiểu
được sự chồng lấp của 2 vùng. Do ta không thể thay đổi được hình dạng
histogram nên chúng ta phải chọn T sao cho tổng độ trải của 2 vùng là cực
tiểu.

nhỏ nhất có thể


1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 3: Otsu’s:
Ví dụ:
1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 3: Otsu’s:
Ví dụ (tt):
1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 3: Otsu’s:
1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 3: Otsu’s:
- Qua ví dụ trên ta thấy kỹ thuật này phải thực hiện quá nhiều phép toán.
Nhưng trong thực tế không phải như vậy:
Kỹ thuật này được cải thiện số phép tính đáng kể nếu thay vì tính phương
sai của từng vùng (within), ta tính qua phương sai “giao vùng” (between).
Phương sai “giao vùng” = phương sai toàn bộ các vùng trừ cho phương sai
từng vùng. Để σ2within đạt cực tiểu thì σ2between phải cực đại.

Lớn nhất có thể

Mỗi lần chạy T chỉ cần tính 4 giá trị này!


1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 3: Otsu’s:
Quay lại ví dụ trên:
1. Phân vùng dựa vào sự tương tự về cường độ

Matlab code
%Ví dụ đặt ngưỡng tự động theo kỹ thuật
Otsu
I = imread('saturn.png');
I = rgb2gray(I); %đổi ra ảnh thang xám
BW1 = im2bw(I,0.0667); %T=17
BW2 = im2bw(I, 0.5); %lấy ngưỡng ở giữa
BW3 = im2bw(I, graythresh(I)); %tìm
ngưỡng bằng kỹ thuật Otsu
imshow(I);figure;imshow(BW1);figure;ims
how(BW2);
1. Phân vùng dựa vào sự tương tự về cường độ

Đặt ngưỡng tự động (auto-thresholding)


 Kỹ thuật 4: dựa vào tỉ lệ đã biết của các vùng
Trong ảnh MRI, tỉ lệ diện tích (số lượng pixels) giữa các phần ước tính [Ref.3]:
• Xương: 3-6%
• Não + mô: 15-30%
• Da: 10%
1. Phân vùng dựa vào sự tương tự về cường độ

Matlab code
1. Phân vùng dựa vào sự tương tự về cường độ

3. Đặt ngưỡng đáp ứng (adaptive thresholding)

Tiếp tục chia nếu gặp vùng hầu như đồng nhất
1. Phân vùng dựa vào sự tương tự về cường độ

#Tiền xử lý trước khi đặt ngưỡng

Lọc nhiễu bằng bộ lọc thông thấp


Loại bỏ mép
1. Phân vùng dựa vào sự tương tự về cường độ

4. Phát triển vùng (region growing)


Là kỹ thuật nhóm các pixels có cùng tính chất C* lại thành 1
vùng bắt đầu từ pixel hạt giống (seed).
*C: chẳng hạn các pixel đều có giá trị nhỏ hơn giá trị trung bình của vùng…
Thích hợp đối với các ảnh bị nhiễu.

Seed
1. Phân vùng dựa vào sự tương tự về cường độ

Seed points Element in L 1. Xác định hạt giống


Region element Border element 2. Thêm n-pixels lân cận hạt giống
vào danh sách L
3. Kiểm tra từng pixels p lân cận của
các pixels L
Nếu p thoả điều kiện C, thêm p
vào L
4. Nếu không, p là biên
5. Thực hiện lại bước 2 cho đến khi
L không còn pixel nào
1. Phân vùng dựa vào sự tương tự về cường độ

Matlab code
1. Phân vùng dựa vào sự tương tự về cường độ

5. Đường phân nước (watersheding)


 Tưởng tượng ảnh 2D trong không gian 3D: 2 chiều toạ độ & 1 chiều cường độ
 Trong không gian như trên có 3 loại điểm:
 Những điểm thuộc cực tiểu vùng ( minima) (có giá trị cường độ nhỏ nhất

trong vùng)
 Những điểm mà tại đó giả sử có 1 hạt nước rơi xuống thì hạt nước đó sẽ

chảy vào chỉ 1 vùng cực tiểu ( catchment basin)


 Những điểm mà tại đó giả sử có 1 hạt nước rơi xuống thì nó sẽ có khả năng

chảy vào nhiều hơn 1 vùng cực tiểu. ( watershed lines)

Watershed lines
1. Phân vùng dựa vào sự tương tự về cường độ

Đường phân nước (watersheding)


 Mục tiêu là tìm ra được các đường phân nước (watershed lines)!
 Cách thực hiện:
 Tưởng tượng ta “đâm” 1 lỗ tại mỗi điểm cực tiểu (minimum) và toàn bộ không gian
xung quanh (catchment basin) sẽ bị ngập. Nước sẽ từ dưới thoát lên và làm đầy các
catchment basin với cùng 1 tốc độ.
 Khi nước dâng lên và chuẩn bị tràn ra khỏi catchment basin, một đập được dựng lên
để ngăn cản cho nước khỏi bị tràn ra. Những đập này chính là đường phân nước cần
tìm!
1. Phân vùng dựa vào sự tương tự về cường độ

Đường phân nước (watersheding)


1. Phân vùng dựa vào sự tương tự về cường độ

%Tạo ra ảnh binary có hình dạng số 8 như hình bên Matlab code
center1 = -10;
center2 = -center1;
dist = sqrt(2*(2*center1)^2);
radius = dist/2 * 1.4;
lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
[x,y] = meshgrid(lims(1):lims(2));
bw1 = sqrt((x-center1).^2 + (y-center1).^2) <= radius;
bw2 = sqrt((x-center2).^2 + (y-center2).^2) <= radius;
bw = bw1 | bw2;
figure, imshow(bw,'InitialMagnification','fit'), title('bw')
%Tạo ra phân bố cường độ sáng khác nhau trong vùng vừa tạo bằng cách dùng hàm
bwdist - giá trị cường độ sáng tại 1 pixel chính là khoảng cách từ pixel đó đến
pixel khác 0 gần nhất => tạo ra hình thứ 2 ở bên (có dạng như 2 quả núi chồng
lên nhau)
D = bwdist(~bw);
figure, imshow(D,[],'InitialMagnification','fit')
title('Distance transform of ~bw')

%Tuy nhiên ta cần tạo ra 2 thung lũng chứ không phải 2 quả núi, nên ta đảo giá trị lại.
Vùng nằm ngoài hình số 8 sẽ có giá trị -, chổ đỉnh núi giờ là đỉnh đáy của thung lũng

D = -D;
D(~bw) = -Inf;
figure, imshow(D,[],'InitialMagnification','fit')
title('Distance transform of ~bw')
%Nước dâng lên từ đáy thung lũng. Đường giao giữa 2 vùng nước khác nhau chính là
đường biên của vùng.

L = watershed(D);
rgb = label2rgb(L,'jet',[.5 .5 .5]); %đường biên sẽ có màu xám [.5 .5 .5]
figure, imshow(rgb,'InitialMagnification','fit')
title('Watershed transform of D')
1. Phân vùng dựa vào sự tương tự về cường độ

Đường phân nước (watersheding)

Nhiễu có thể tạo ra vô số đường


phân nước không cần thiết!

 Giải quyết*: làm mờ ảnh (lọc thông thấp) đi trước khi thực hiện hoặc giới hạn lại số
lượng những vùng quan tâm (đặt ngưỡng)
1. Phân vùng dựa vào sự tương tự về cường độ
 *Giải quyết 1: làm mờ
Ảnh gốc Ảnh làm mờ Watershed
1. Phân vùng dựa vào sự tương tự về cường độ
Matlab code

I=imread('CT.BMP');
J=watershed(I);
H=fspecial('gaussian',300,1);
K=filter2(H,I); %sau khi đã làm mờ
K=uint8(K);
imshow(I)
improfile
figure;imshow(K)
improfile
Iw=watershed(I);
Kw=watershed(K);
figure;imshow(Iw);
figure;imshow(Kw);
1. Phân vùng dựa vào sự tương tự về cường độ

 *Giải quyết 2: Đặt ngưỡng

Đặt ngưỡng Loại bỏ lỗ nhỏ Đảo BW Watershed

Đếm số vùng
Làm thế nào để phân vùng ảnh?

Phân vùng ảnh

Ảnh thang xám Ảnh màu


Phát hiện

Sự không Sự tương tự nhau Tính khỏang cách điểm


liên tục về cường độ màu trong không gian
màu RGB, HSB…

Phát hiện Ngưỡng,


biên phát triển vùng,
(Sobel, đường phân nước
Canny…)
2. Phân vùng dựa vào sự không liên tục

Bước 1: Xác định biên (xem các kỹ thuật dò biên trong phần 2 - tăng cường ảnh)
Bước 2: Nối các biên lại với nhau tạo thành các vùng:
1. Kỹ thuật Erosion / Dilation
2. Kỹ thuật Edge Relaxation
1. Phân vùng dựa vào sự tương tự về cường độ

Matlab code
1. Erosion / Dilation
%Đọc ảnh vào
I = imread('cell.tif');
figure, imshow(I), title('Anh goc');
%Lấy biên
[BWs nguong] = edge(I, 'sobel'); %lấy giá trị ngưỡng tự động
heso = .5;
BWs = edge(I,'sobel', nguong*heso); %giảm giátrị ngưỡng tựđộng đi 1/2 để lấy nhiều biên hơn
figure, imshow(BWs), title('Mat na chua bien');
%Làm dày biên lên bằng kỹ thuật “Dilate”
se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);
BWsdil = imdilate(BWs, [se90 se0]);
figure, imshow(BWsdil), title('Mat na chua bien duoc lam day len');
%Làm đầy các lỗ trống
BWdfill = imfill(BWsdil, 'holes');
figure, imshow(BWdfill);
%Bỏ đi các thành phần sát ở biên
BWnobord = imclearborder(BWdfill, 4);
figure, imshow(BWnobord),
%Làm mượt biên
seD = strel('diamond',1); %seD = strel('square',3);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
figure, imshow(BWfinal),
%Vẽ đường biên (màu trắng) và hiển thị lên ảnh kết quả
BWoutline = bwperim(BWfinal);
Segout = I;
Segout(BWoutline) = 255;
figure, imshow(Segout), title('Te bao duoc xac dinh');
1. Phân vùng dựa vào sự tương tự về cường độ

1. Erosion
 Mục đích: lược bỏ bớt đi đường biên của vùng (vùng: màu trắng; nền: màu
đen)  vùng đối tượng sẽ bị co lại
 Mô tả:
- Ngõ vào: 2 tập dữ liệu: 1 là ảnh cần eroded (X - original image); 1 thành phần
cấu trúc (K - structuring element) là một mảng các giá trị 1 (trắng) tạo thành dạng
hình vuông / hình đĩa / hình dạng bất kỳ (tùy mục đích)
- Phần tử nằm giữa cấu trúc K sẽ trượt lần lượt qua từng pixel trong X (gọi là
input pixel). Input pixel có giá trị là đen nếu có bất kỳ một pixel nào bên dưới
K là đen; Input pixel không đổi nếu tất cả các pixels bên dưới K đều trắng.

K có dạng vuông → tác


dụng làm cho vùng co lại
1. Phân vùng dựa vào sự tương tự về cường độ

1. Erosion
 So sánh khi K dạng hình vuông (square) 3x3 và hình thoi (diamond) x1

 Hình thoi giúp làm mượt rìa vùng rất tốt

 Xem thêm các hình dạng khác >> help strel

Matlab code

imerode
1. Phân vùng dựa vào sự tương tự về cường độ

1. Dilation
 Mục đích: thêm vào (“bồi đắp”) cho vùng (vùng: màu trắng; nền: màu đen) 
vùng đối tượng sẽ lớn lên
 Mô tả:
- Ngõ vào: 2 tập dữ liệu: 1 là ảnh cần eroded (X - original image); 1 thành phần
cấu trúc (K - structuring element) là một mảng các giá trị 1 (trắng) tạo thành dạng
hình vuông / hình đĩa / hình dạng bất kỳ (tùy mục đích)
- Phần tử nằm giữa cấu trúc K sẽ trượt lần lượt qua từng pixel trong X (gọi là
input pixel). Input pixel có giá trị là trắng nếu có bất kỳ pixels nào bên dưới K
là trắng; sẽ không đổi nếu tất cả các pixel nào bên dưới K là đen.
K có dạng vuông → tác
dụng làm cho vùng giãn
ra

Matlab code

imdilate
1. Phân vùng dựa vào sự tương tự về cường độ

1. Kết hợp Dilation & Erosion


 Erosion → Dilation = Opening Morphology: loại đi những vùng có kích thước
nhỏ hơn kích thước thành phần cấu trúc (K)
Matlab code

bwareaopen

 Dilation → Erosion = Closing Morphology: thêm vào những lỗ trống có kích


thước nhỏ hơn kích thước thành phần cấu trúc (K)

Matlab code

imclose
1. Phân vùng dựa vào sự tương tự về cường độ

2. Edge Relaxation
 Mục đích: Nối dài các mép để tạo thành vùng kín hoặc bỏ đi các mép giả (sinh
ra do nhiễu…)
 Mô tả:
- Ngõ vào: ảnh chứa nhiều mép khác nhau.
- Xử lý: xét đặc tính của từng loại mép dựa vào những mép ở sát xung quanh.

a f
e
b g

c h
Xung quanh 2 đầu mép e có thể tồn tại các mép khác
1. Phân vùng dựa vào sự tương tự về cường độ

2. Edge Relaxation
1. Phân vùng dựa vào sự tương tự về cường độ

2. Edge Relaxation

• Thực hiện 1 lần cho tất cả các mép rời rạc (cracked edge) rồi lặp lại
nhiều lần như vậy.
1. Phân vùng dựa vào sự tương tự về cường độ

2. Edge Relaxation
Làm thế nào để phân vùng ảnh?

Phân vùng ảnh

Ảnh thang xám Ảnh màu


Phát hiện

Sự không Sự tương tự nhau Tính khỏang cách điểm


liên tục về cường độ màu trong không gian
màu RGB, HSB…

Phát hiện Ngưỡng,


biên phát triển vùng,
(Sobel, đường phân nước
Canny…)
3. Phân vùng ảnh màu

1. Không gian màu RGB


Ví dụ: ảnh gồm 3 vùng màu: đỏ, xanh lá, trắng; cần
phân thành 3 vùng theo 3 màu này.
Trong không gian màu RGB, xét khoảng cách (D1, D2, D3)
lần lượt từng pixel trên ảnh so với 3 điểm màu đỏ tf1,
xanh lá tf2, trắng tf3 bằng cách dùng công thức tính
khoảng cách trong không gian Descartes

D1^2 = (img(i,j,1)-tf1(1))^2 + (img(i,j,2)-tf1(2))^2 + (img(i,j,3)-tf1(3))^2;


D2^2 = (img(i,j,1)-tf2(1))^2 + (img(i,j,2)-tf2(2))^2 + (img(i,j,3)-tf2(3))^2;
D3^2 = (img(i,j,1)-tf3(1))^2 + (img(i,j,2)-tf3(2))^2 + (img(i,j,3)-tf3(3))^2;

Nếu khoảng cách từ điểm màu đang xét đến điểm màu nào (tf1, tf2 hoặc
tf3) nhỏ nhất → điểm màu này thuộc vùng màu đó.
3. Phân vùng ảnh màu

1. Không gian màu RGB

Tách ra 3 vùng xanh (vùng


mô gan bị xơ hóa); đỏ (bình
thường); trắng (nền) & tính
tỉ lệ diện tích giữa các vùng
3. Phân vùng ảnh màu

1. Không gian màu HSB / HSL a) Phân vùng màu ra khỏi vùng trắng
đen:
Ảnh siêu âm Doppler, thông thường vùng
phổ đỏ và xanh có giá trị S & L >= 0.28.
Các vùng còn lại (trắng đen, xám chứa
thông tin về cấu trúc) có S & L < 0.28.
 Dùng kỹ thuật đặt ngưỡng để loại

Ví dụ minh hoạ: ảnh siêu âm Doppler


3. Phân vùng ảnh màu

1. Không gian màu HSB / HSL


b) Phân vùng đỏ và xanh:
Màu đỏ trong không gian màu HSL có H=0
hoặc 360; màu xanh có H=240.
Ta lần lượt khảo sát từng pixel để tính ra
khoảng cách góc giữa điểm màu của pixel
đó với 2 màu đỏ và xanh.
Điểm có khoảng cách so với màu nào nhỏ
hơn thì thuộc vùng màu đó.
Bài tập! (3 SV thực hiện 1 bài)
Viết 1 chương trình có giao diện (GUI) để thực hiện: việc mở ảnh, hiển thị ảnh lên cửa sổ
giao diện, và có 1 thanh trượt (Slider) để đặt giá trị ngưỡng cho ảnh (ngưỡng đơn).
Khi kéo thanh trượt thì ảnh kết quả (đã được phân vùng) hiện lên tương ứng.

Lưu ý:
Bài tập giải được lưu dưới dạng M-file (*.m) +
file FIG (chứa giao diện chương trình). Nếu
cần ghi chú thì ghi ngay trong file .m bằng
cách dùng ký tự %

Thời hạn nộp:


Hết ngày thứ 2 – 12/10/2009

Cách thức nộp:


Nén tất cả các file thành 1 file duy nhất, tên file
là tên sinh viên & gửi thông qua hệ thống
E-learning
Tham khảo (Ref.)

1) http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/
MORSE/threshold.pdf
2) http://www.labbookpages.co.uk/software/imgProc/otsuThreshol
d.html
3) 3D Segmentation & Visualization of MRI brain images - By
Yuzhu Lu, Liangshou Wu, May. 4, 2005
4) Computer Vision - S. Narasimhan, Spring 2006

You might also like