You are on page 1of 78

HCMC University of Technology and Education

Faculty of Electrical & Electronic Engineering

TÁCH BIÊN VÀ PHÂN VÙNG


ẢNH

vietnb@hcmute.edu.vn
Image Segmentation

Segmentation of an image to produce regions


with the same charateristics.

 Segmentation based on brightness


 Segmentation based on a group or type
 Segmentation based on regions

vietnb@hcmute.edu.vn
Image Segmentation

vietnb@hcmute.edu.vn
Image Segmentation

vietnb@hcmute.edu.vn
Image Segmentation

vietnb@hcmute.edu.vn
Image Segmentation
Segmentation based on brightness

Based on a brightness threshold, T or color


components of image. An output image g(x, y) based
on threshold is defined as follows:

Pixels with label 1 correspond to object and others


with label zero are called background.
If T is constant, this method is called the global
threshold method.

vietnb@hcmute.edu.vn
Image Segmentation
Object Separation
- If some object and background pixels have the same grey values,
two thresholds will be chosen instead of one threshold.

(a) (b)

(b) (d)

(a)- Original image; (b)-Histogram; (c)- Separated object with


threshold T=91; (d)- object with T1=68 và T2=100. 7
vietnb@hcmute.edu.vn
Image Segmentation

Chọn ngưỡng: dựa trên việc quan sát lược đồ xám.

Example
Assume that an image has the following histogram, in which its
threshold is T=91. Determine the output image.

1 f ( x, y )  91
g ( x, y )  
0 else

8
vietnb@hcmute.edu.vn
PHÂN NGƯỠNG THRESHOLDING
• Phân ngưỡng dùng để tách một vật ra khỏi ảnh
nền
• Xét histogram ảnh xám bên dưới

Ta có thể kết luận ảnh nhị phân trắng của vật


ứng với f(x,y) >T và nền đen ứng với f(x,y) <T

vietnb@hcmute.edu.vn
PHÂN NGƯỠNG THRESHOLDING
• Ngưỡng T chung cho toàn bộ ảnh gọi là ngưỡng toàn
cục
1. Chọn T bằng phương pháp thử sai dựa vào quan sát hoặc
dùng phương pháp lặp sau:
2. Chọn giá trị ban đầu cho T , thường là trung bình cường
độ cực đại và cực tiểu
3. Phân đoạn ảnh dùng ngưỡng T được hai nhóm G1, G2
4. Tính cường độ trung bình cho mỗi nhóm
5. Tính lại T là trung bình của hai cường độ này
6. Lặp lại bước 3

vietnb@hcmute.edu.vn
PHÂN NGƯỠNG THRESHOLDING

vietnb@hcmute.edu.vn
TÁCH NGƯỠNG DÙNG PHƯƠNG PHÁP OTSU
• Otsu neâu ra phöông phaùp ñeå ñaùnh giaù phöông sai giöõa hai
lôùp. Nhöõng pixel cuûa aûnh coù giaù trò cöôøng ñoä trong daõy L
giaù trò möùc xaùm [0,1,2, … ,L], soá löôïng pixel ôû möùc i laø ni vaø
toång soá pixel cuûa aûnh laø

• Ñeå ñôn giaûn vaán ñeà, bieåu ñoà Histogram ñöôïc bieán ñoåi vaø
xem nhö laø moät phaân boá xaùc xuaát:

vietnb@hcmute.edu.vn
TÁCH NGƯỠNG DÙNG PHƯƠNG PHÁP
OTSU
• Các điểm ảnh chia làm hai lớp C0 và C1 bởi giá trị k,
C0 ñaïi dieän cho nhöõng pixel coù cöôøng ñoä trong
khoaûng [0 ;k-1], vaø C1 ñaïi dieän cho nhöõng pixel coù
cöôøng ñoä trong khoaûng [k ; L-1].
• K chọn để cực đại phương sai giữa lớp

vietnb@hcmute.edu.vn
TÁCH NGƯỠNG DÙNG PHƯƠNG PHÁP OTSU

Matlab có hàm graythres


cho giá trị ngưỡng theo
pp này

Gía trị T này dùng trong hàm


ìmbw để đổi ảnh xám ra ảnh nhị
phân

vietnb@hcmute.edu.vn
TÁCH NGƯỠNG DÙNG PHƯƠNG PHÁP OTSU

(Min variance)

(Max variance)

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
2

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
Giả sử cho 1 ảnh là ảnh màu có những vật thể gồm 1 hình
tròn, 1 hình vuông và 1 hình tam giác với những màu khác
nhau, riêng biệt. Nếu chúng ta muốn tách hình tròn ra và
chuyển sang ảnh nhị phân, trong đó vòng tròn màu trắng và
nền màu đen.
a. Viết sơ đồ khối để thực hiện tách vòng tròn, trong đó
những khối có thể là những phương pháp/thuật toán xử đã
được học để cho ra kết quả ảnh nhị phân.
b. Viết chương trình Matlab.

vietnb@hcmute.edu.vn
TÁCH NGƯỠNG DÙNG PHƯƠNG PHÁP OTSU

I = imread('coins.png');
imshow(I)
level = graythresh(I);
BW = im2bw(I,level);
figure, imshow(BW)

vietnb@hcmute.edu.vn
PHÂN NGƯỠNG CỤC BỘ (PHÂN NGƯỠNG
THÍCH NGHI)
• Nếu độ chiếu sáng thay đổi việc phân ngưỡng
có thể sai

Dùng ngưỡng thích nghi thay đổi theo điểm


ảnh để khắc phục
f0 là opening của f và T0 là
ngưỡng do hàm graythresh tác
động lên f0

vietnb@hcmute.edu.vn
PHÂN NGƯỠNG DÙNG OPENCV
• double cvThreshold(
CvArr* src,
CvArr* dst,
double threshold,
double max_value,
int threshold_type
);
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
void sum_rgb( IplImage* src, IplImage* dst ) {
// Allocate individual image planes.
IplImage* r = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );
IplImage* g = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 );
vietnb@hcmute.edu.vn
PHÂN NGƯỠNG DÙNG OPENCV

IplImage* b = cvCreateImage( cvGetSize(src),


IPL_DEPTH_8U, 1 );
// Split image onto the color planes.
cvSplit( src, r, g, b, NULL );
// Temporary storage.
IplImage* s = cvCreateImage( cvGetSize(src),
IPL_DEPTH_8U, 1 );
// Add equally weighted rgb values.
cvAddWeighted( r, 1./3., g, 1./3., 0.0, s );
cvAddWeighted( s, 2./3., b, 1./3., 0.0, s );

vietnb@hcmute.edu.vn
PHÂN NGƯỠNG DÙNG OPENCV
// Truncate values above 100.
cvThreshold( s, dst, 100, 100, CV_THRESH_TRUNC );
cvReleaseImage( &r );
cvReleaseImage( &g );
cvReleaseImage( &b );
cvReleaseImage( &s );
}
int main(int argc, char** argv)
{
// Create a named window with the name of the file.
cvNamedWindow( argv[1], 1 );
// Load the image from the given file name.
IplImage* src = cvLoadImage( argv[1] );

vietnb@hcmute.edu.vn
PHÂN NGƯỠNG DÙNG OPENCV
IplImage* dst = cvCreateImage( cvGetSize(src), src->depth, 1);
sum_rgb( src, dst);
// Show the image in the named window
cvShowImage( argv[1], dst );
// Idle until the user hits the “Esc” key.
while( 1 ) { if( (cvWaitKey( 10 )&0x7f) == 27 ) break; }
// Clean up and don’t be piggies
cvDestroyWindow( argv[1] );
cvReleaseImage( &src );
cvReleaseImage( &dst );
}

vietnb@hcmute.edu.vn
PHÂN NGƯỠNG THÍCH NGHI DÙNG
OPENCV
void cvAdaptiveThreshold(
CvArr* src,
CvArr* dst,
double max_val,
int adaptive_method =
CV_ADAPTIVE_THRESH_MEAN_C
int threshold_type = CV_THRESH_BINARY,
int block_size = 3,
double param1 =5
);

vietnb@hcmute.edu.vn
SO SÁNH PHÂN NGƯỠNG VÀ PHÂN NGƯỠNG
THÍCH NGHI

vietnb@hcmute.edu.vn
TÁCH ĐiỂM CÔ LẬP
• Tách điểm cô lập: một điểm cô lập có thể tách bằng cách di chuyển
mặt nạ 3x3 trên ảnh, cường độ điểm ảnh ở tâm mặt nạ là tổng các
tích cường độ điểm ảnh bao bởi mặt nạ với các trọng số mặt nạ, nếu
quá mức ngưỡng nào đó thì kết luận là điểm cô lập
• Trong công thức dưới z là cường độ sáng, w là trọng số mặt nạ, R là
cường độ sáng mới, T là ngưỡng không âm

• Dùng dạng tích chập

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
TÁCH ĐƯỜNG
• Với các đường thẳng dầy một pixel theo chiều
ngang dọc hay góc 45o ta có thể dùng các mặt
nạ sau

vietnb@hcmute.edu.vn
TÁCH CẠNH EDGE
• Thường tim sự thay đổi đột ngột của độ sáng bằng
phương pháp gradient, đạo hàm bậc một và bậc hai
(Laplacian) của độ sáng

vietnb@hcmute.edu.vn
• Tìm cạnh ở chỗ đạo hàm bậc nhất lớn hơn gia trị ngưỡng
hay đạo hàm bậc hai bằng không
• Matlab có hàm edge tìm các điểm cạnh tùy theo method
và parameters, kết quả là ma trận g có giá trị 1 chỗ ó cạnh
và 0 ngược lại, và ngưỡng t tương ứng, parameters gồm
ngưỡng T và hướng direction

Các phép tính đạo hàm được thay bằng các tích chập
với các mặt nạ phù hợp
vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
• Tách cạnh gồm ba giai đoạn: lọc, vi phân và so
ngưỡng
• Vi phân thường dùng lọc trung bình hay lọc
Gauss

• Lọc Gauss được tính khi cho trước sigma và tính g


theo x,y rồi chuẩn hóa thành trị nguyên

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
LỌC SOBEL

vietnb@hcmute.edu.vn
LỌC PREWITT

Lọc Prewitt tính toán đơn giản hơn lọc Sobel nhưng kết
quả không trơn bằng

vietnb@hcmute.edu.vn
LỌC ROBERTS

vietnb@hcmute.edu.vn
LỌC LAPLACE
• Thay toán tử đạo hàm bậc hai bằng một trong
các mặt nạ

vietnb@hcmute.edu.vn
LAPLACIAN OF GAUSSIAN
LoG
• Nhân chập ảnh với đạo hàm bậc hai của hàm
Gauss

vietnb@hcmute.edu.vn
LỌC CANNY
• Phương pháp lọc tốt nhất, gồm các bước:
• Lọc Gauss
• Tính gradient và hướng, điểm cạnh ứng với gradient
tối đa theo hướng gradient
• So sánh với hai ngưỡng T1 < T2

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
BiẾN ĐỔI HOUGH
• Sau khi tìm các điểm cạnh ta nối chúng lại để
tạo biên dùng biến đổi Hough
• Cho hai điểm cạnh (xi,yi) và (xj,yj) ta tìm
phương trình đường thẳng nối hai điểm này

• Tìm θ và ρ

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
BiẾN ĐỔI HOUGH
• Cho θ và ρ thay đổi trong phạm vi giới hạn và có giá
trị rời rạc, ta tạo ma trận tích lũy A(θ,ρ) có giá trị ban
đầu 0
• Với mỗi θ và điểm cạnh (xi,yi) ta tính ρ, A(θ,ρ) tương
ứng sẽ tăng thêm 1
• Tìm cặp (θ,ρ) ứng với A cực đại, có nghĩa là có nhiều
đường đi qua điểm cạnh có cùng (θ,ρ), có nghĩa là các
đường này trùng nhau, vậy ta tạo được đường thẳng
nối các điểm cạnh vì (θ,ρ) xác định một đường thẳng
duy nhất

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
VÍ DỤ MATLAB BiẾN ĐỔI HOUGH
• Hàm hough tạo ma trận H(θ,ρ) dùng biến đổi Hough tiêu
chuẩn SHT
[H, theta, rho] = hough(BW)
[H, theta, rho] = hough(BW, ParameterName,
ParameterValue)
RGB = imread('gantrycrane.png');
% Convert to intensity.
I = rgb2gray(RGB);
% Extract edges.
BW = edge(I,'canny');
[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);
% Display the original image.
subplot(2,1,1); imshow(RGB);
title('Gantrycrane Image');
vietnb@hcmute.edu.vn
VÍ DỤ MATLAB BiẾN ĐỔI HOUGH
% Display the Hough matrix.
subplot(2,1,2); imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,...
'InitialMagnification','fit');
title('Hough Transform of Gantrycrane Image');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on; colormap(hot);

vietnb@hcmute.edu.vn
VÍ DỤ MATLAB BiẾN ĐỔI HOUGH
• Hàm houghpeaks tìm giá trị cực đại trong ma trận Hough, trả
về tọa độ hàng cột của điểm cực đại, numpeaks là số điểm cực
đại muốn tìm
peaks = houghpeaks(H, numpeaks)
peaks = houghpeaks(..., param1, val1, param2, val2)
%Read an image into the MATLAB workspace.
I = imread('circuit.tif');
%For this example, rotate and crop the image using the imrotate function.
rotI = imrotate(I,33,'crop'); fig1 = imshow(rotI);
%Find the edges in the image using the edge function.
BW = edge(rotI,'canny'); figure, imshow(BW);
%Compute the Hough transform of the image using the hough function.
[H,theta,rho] = hough(BW);
%Display the transform using the imshow function.
vietnb@hcmute.edu.vn
VÍ DỤ MATLAB BiẾN ĐỔI HOUGH
figure,
imshow(imadjust(mat2gray(H)),[],'XData',theta,'YData',rho,...
'InitialMagnification','fit');
xlabel('\theta (degrees)'), ylabel('\rho');
axis on, axis normal, hold on; colormap(hot)
%Find the peaks in the Hough transform matrix, H, using the
houghpeaks function.
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
%Superimpose a plot on the image of the transform that identifies
the peaks.
x = theta(P(:,2)); y = rho(P(:,1)); plot(x,y,'s','color','black');

vietnb@hcmute.edu.vn
VÍ DỤ MATLAB BiẾN ĐỔI HOUGH

vietnb@hcmute.edu.vn
VÍ DỤ MATLAB BiẾN ĐỔI HOUGH
• Hàm houghlines tách đường thẳng dựa trên theta rho
do hàm hough cung cấp và peaks do hàm houghpeaks
Lines cung cấp tọa độ điểm mút của đoạn thẳng và giá trị
theta rho
lines = houghlines(BW, theta, rho, peaks)
lines = houghlines(..., param1, val1, param2, val2)
%Find lines in the image using the houghlines function.
lines = houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7);
%Create a plot that superimposes the lines on the original image.
figure, imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];

vietnb@hcmute.edu.vn
VÍ DỤ MATLAB BiẾN ĐỔI HOUGH
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
% Plot beginnings and ends of lines
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end
% highlight the longest line segment
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','red');

vietnb@hcmute.edu.vn
VÍ DỤ MATLAB BiẾN ĐỔI HOUGH

vietnb@hcmute.edu.vn
OPEN CV BiẾN ĐỔI HOUGH
CvSeq* cvHoughLines2(
CvArr* image,
void* line_storage,
int method,
double rho,
double theta,
int threshold,
double param1 = 0,
double param2 = 0
);
Image là ảnh nhị phân, method là các phương pháp biến đổi
CV_HOUGH_STANDARD, CV_HOUGH_PROBABILISTIC,
CV_HOUGH_MULTI_SCALE

vietnb@hcmute.edu.vn
OPEN CV BiẾN ĐỔI HOUGH
rho và theta là độ phân giải theo pixel và radian, threshold là
ngưỡng để xác định đường
Giá trị trả về là rho và theta của đường hay tọa độ điểm đầu và
cuối của đường, tham số line_storage trỏ đến địa chỉ này

vietnb@hcmute.edu.vn
THUẬT TÓAN HOUGH TÌM ĐƯỜNG TRÒN
• Vòng tròn có ba tham số là tâm và bán kính,
thuật toán tìm như sau

vietnb@hcmute.edu.vn
THUẬT TÓAN HOUGH TÌM ĐƯỜNG TRÒN
• Phương trình đường tròn có thể viết là

vietnb@hcmute.edu.vn
THUẬT TÓAN HOUGH TÌM ĐƯỜNG TRÒN
CvSeq* cvHoughCircles(
CvArr* image,
void* circle_storage,
int method,
double dp,
double min_dist,
double param1 = 100,
double param2 = 300,
int min_radius = 0,
int max_radius = 0
);

vietnb@hcmute.edu.vn
THUẬT TÓAN HOUGH TÌM ĐƯỜNG TRÒN
• Using cvHoughCircles to return a sequence of circles found in a grayscale
image
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char** argv) {
IplImage* image = cvLoadImage( argv[1],
CV_LOAD_IMAGE_GRAYSCALE
);
CvMemStorage* storage = cvCreateMemStorage(0);
cvSmooth(image, image, CV_GAUSSIAN, 5, 5 );
CvSeq* results = cvHoughCircles( image, storage,
CV_HOUGH_GRADIENT, 2, image->width/10
); vietnb@hcmute.edu.vn
THUẬT TÓAN HOUGH TÌM ĐƯỜNG TRÒN
for( int i = 0; i < results->total; i++ ) {
float* p = (float*) cvGetSeqElem( results, i );
CvPoint pt = cvPoint( cvRound( p[0] ), cvRound( p[1] ) );
cvCircle( image, pt, cvRound( p[2] ),
CV_RGB(0xff,0xff,0xff) );
}
cvNamedWindow( “cvHoughCircles”, 1 );
cvShowImage( “cvHoughCircles”, image);
cvWaitKey(0);
}

vietnb@hcmute.edu.vn
THUẬT TÓAN HOUGH TÌM ĐƯỜNG TRÒN

vietnb@hcmute.edu.vn
THUẬT TOÁN HOUGH SUY RỘNG
• Áp dụng cho một hình bất kỳ
• Đầu tiên tìm trọng tâm hình (centroid)

Với mỗi điểm cạnh (x,y) tìm vectơ r(x’,y’)

vietnb@hcmute.edu.vn
THUẬT TOÁN HOUGH SUY RỘNG

vietnb@hcmute.edu.vn
PHÂN ẢNH DỰA THEO VÙNG
• Phân ảnh dựa theo vùng là chia ảnh thảnh nhiều vùng không
giao nhau, các điểm trong một vùng có tính chất P chung

vietnb@hcmute.edu.vn
PHÂN ẢNH DỰA THEO VÙNG

vietnb@hcmute.edu.vn
PHÂN ẢNH DỰA VÀO ĐƯỜNG PHÂN THỦY
(WATERSHED)

• Ảnh xám có thể xem như một bề mặt có chỗ cao chỗ thấp, chỗ
thấp là lưu vực (catchment basin) nơi các con sông chảy
xuống, đường phân thủy phân chia ranh giơi lưu vực, các con
sông phát xuất từ đường phân thủy chảy ra hai bên. Các lưu
vực chính là các vùng ảnh và đường phân thủy là ranh giới các
vùng, để tìm đường phân thủy ta cho nước dâng lên cho đến
khi các hồ giao nhau , đường phân thủy vẽ đường ranh giới
giữa các vùng chạm nhau
• Để biểu thị độ cao các vùng trũng ta dùng biến đổi khoảng
cách, giả sử nền ảnh đen trắng là đen (0) các vùng có gía trị
trắng (1), ta lấy đảo ảnh, sau đó dùng biến đổi khoảng cách,
các pixel giá trị 1 được thay bằng 0.0, các pixel giá trị 0 được
thay bằng khoảng cách đến pixel giá trị 1 gần nhất
vietnb@hcmute.edu.vn
PHÂN ẢNH DỰA VÀO ĐƯỜNG PHÂN THỦY
(WATERSHED)

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
• Cho ảnh f
• Hàm D=bwdist(-f) biến đổi ảnh ra ảnh biến đổi
khoảng cách
• Hàm L=watershed (-D) vẽ đường phân thủy,
giá trị 0 là đường phân thủy
• w=L==0 có giá trị 1 ở đường phân thủy
• G=f and (-w) vẽ đường phân thủy trên ảnh gốc

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
• Trước khi dùng watershed transform thường
biến đổi ảnh bằng các bộ lọc như
morphological gradient, closing opening

vietnb@hcmute.edu.vn
vietnb@hcmute.edu.vn
• Biến đổi Watershed sinh ra nhiều đường biên
sai (oversegmentation)

vietnb@hcmute.edu.vn

You might also like