You are on page 1of 31

Chương 4.

TÁCH BIÊN VÀ PHÁT


HIỆN VÙNG
1

HUỲNH ĐÍCH
LƯƠNG NHẬT DUY
ĐÀO VĂN MINH

Xử lý ảnh – Image proccessing 04/24/2024


Tách biên
2

Điểm biên: Một điểm ảnh được coi là điểm biên nếu có
sự thay đổi nhanh hoặc đột ngột về mức xám (hoặc
màu).
Đường biên còn gọi là đường bao (boundary): Là tập
hợp các điểm biên liên tiếp.
Đường biên sử dụng để làm phân cách các vùng xám
(hoặc màu) cách biệt. Ngược lại, người ta cũng sử dụng
các vùng ảnh để tìm phân cách.
Tách biên
3

Biên
Mô hình biểu diễn đường biên
4

Biên lý tưởng Biên thay đổi đều Biên thực tế


Phương pháp tách biên
5

Phương pháp này chủ yếu dựa vào


sự biến thiên độ sáng của đểm ảnh để
làm nổi biên bằng kĩ thuật đạo hàm.
 Dùng đạo hàm bậc 1: sử dụng
vector Gadient
 Dùng đạo hàm bậc 2: sử dụng biến

đổi Laplacian
Đạo hàm bậc nhất: Vector Gradient
6

Kĩ thuật Gradient dùng cặp mặt nạ H­1,H2 trực giao. Nếu
định nghĩa Gx, Gy tương ứng là Gradient theo hai hướng
x,y khi đó ta có vector Gradient của một ảnh f(x,y) là:

Ta có: Biên độ f  Gx2  G y2


 f 
 Gx   x  |
f    =  
G y   f  Góc α(x,y) =
 y 
Đạo hàm bậc nhất: Vector Gradient
7

Các công đoạn phát hiện biên theo kỹ thuật Gradient

I(x,y) I’(x,y) I’’(x,y)


Làm nổi biên So sánh ngưỡng

Thực tế, việc làm nổi biên là nhân chập ảnh I với một
mặt nạ (ma trận) trong các mặt nạ sau: Sobel, Prewitt,
Robert.
Kỹ thuật Prewitt
8

Kỹ thuật sử dụng 2 mặt nạ nhập chập xấp xỉ đạo hàm


theo 2 hướng x và y là:

Bước 1: Tính I ⊗ Hx và I ⊗ Hy
Bước 2: Tính I ⊗ Hx + I ⊗ Hy
Kỹ thuật Prewitt
9

Ví dụ:
Kỹ thuật Prewitt
10

Ví dụ
Kỹ thuật Prewitt
11

Tổng theo phương X và Y


Kỹ thuật Prewitt
12

Tổng theo phương X và Y


Kỹ thuật Prewitt
13

Ngoài ra để phát hiện biên theo đường chéo ta sử dụng


2 mặt nạ:
 0 1 1  -1 -1 0 
   
H   -1 0 1  ; H   -1 0 1 
1   2  
 -1 -1 0   0 1 1
 
Kỹ thuật Prewitt
14

def Prewitt(I)
# tạo mặt nạ Prewitt
Hx = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])
Hy = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])

# chập mặt nạ với ảnh I


Ix = cv2.filter2D(I, -1, Hx)
Iy = cv2.filter2D(I, -1, Hy)

# tổng chập theo 2 hướng x và y


Y = Ix + Iy
return Y
Kỹ thuật Prewitt
15

Kết quả:

Chiều
dọc

Chiều
ngang Tổng chiều ngang
với chiều dọc
Kỹ thuật Prewitt
16

Kết quả sau khi lấy ngưỡng cục bộ max*0.2


def threshold_image(image):
tempout = np.zeros_like(image)

# Tính toán ngưỡng


max_val = np.max(image)
threshold = round(max_val *
0.2)

# Áp dụng ngưỡng cho từng


pixel
tempout[image >= threshold] =
255
tempout[image < threshold] = 0

return tempout
Kỹ thuật Sobel
17

Tương tự như kỹ thuật Prewitt kỹ thuật Sobel sử dụng 2


mặt nạ nhân chập theo 2 hướng x, y là:

Bước 1: Tính I ⊗ Hx và I ⊗ Hy
Bước 2: Tính I ⊗ Hx + I ⊗ Hy
Kỹ thuật Sobel
18

Kết quả chập Sobel Kết quả sau lấy ngưỡng


Kỹ thuật Robert
19

Kỹ thuật Robert sử dụng 2 mặt nạ nhân chập đơn giản


là:
Kỹ thuật Robert
20

Kết quả chập Robert Kết quả sau lấy ngưỡng


Nhận xét: đạo hàm bậc 1
21
Đạo hàm bậc hai: biến đổi Laplacian
22

Khi mức xám thay đổi chậm, miền chuyển tiếp trải
rộng, phương pháp cho hiệu quả hơn đó là phương pháp
sử dụng đạo hàm bậc hai Laplace
Toán tử Laplace được xây dựng trên cơ sở đạo hàm bậc
2 của hàm biến đổi mức xám.
2 𝜕2 𝑓 𝜕 2 𝑓
∆ 𝑓= 2
+ 2
𝜕𝑥 𝜕𝑦
Dưới đây là ba kiểu mặt nạ thường dùng:
Biến đổi Laplacian
23

Trước khi áp dụng bộ lọc Laplacian, ta có thể áp


dụng bộ lọc Gaussian để làm mượt

=>

Bộ lọc Gaussian Laplacian of Gausian


Biến đổi Laplacian
24

Ví dụ

Ảnh gốc

Ảnh sau khi áp bộ lọc Gaussian Laplacian of Gaussian


Biến đổi Laplacian
25
Phân vùng
26

Phân vùng bằng watershed: dâng nước lên ngập các


vùng để hiện ra các đường chia nước.
Các bước thực hiện:
 Tính ngưỡng toàn cục của ảnh mức xám ra ảnh đen trắng.
 Tạo ra vùng nền (background) bằng cách dilate ảnh đã loại
bỏ nhiễu.
 Xác định các vùng chắc chắn và không chắc chắn của các
thành phần.
 Đánh dấu nhãn cho các thành phần đã xác định.
 Xác định các vùng bằng hàm watershed.
Phân vùng
27

Tính ngưỡng:

gray = cv2.cvtColor(img,
cv2.COLOR_BGR2GRAY)

# Ngưỡng toàn cục


thresh_value = 127
ret, thresh =
cv2.threshold(gray,
thresh_value, 255,
cv2.THRESH_BINARY_INV)
cv2.imshow("Thresholded",
thresh)
Phân vùng
28

Tạo vùng nền và xác định vùng các vùng chắc chắn.
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(thresh, kernel, iterations=1)
dilation = cv2.dilate(erosion, kernel, iterations=1)

# lấy vùng nền


sure_bg = cv2.dilate(dilation, kernel, iterations=2)

# xác định các vùng chắc chắn


dist_transform = cv2.distanceTransform(dilation, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7 *
dist_transform.max(), 255, 0)

# xác định các vùng không chắc chắn


sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
Phân vùng
29

Vùng chắc chắn Vùng chưa chắc chắn Vùng không xác định
Phân vùng
30

Đánh dấu nhãn và xác định vùng:


# đánh dấu nhãn cho các thành phần
ret, markers =
cv2.connectedComponents(sure_fg)

# thêm một nhãn vào để đảm bảo


vùng nền không phải là 0 hay 1
markers = markers + 1

# đánh dấu vùng chưa biết = 0


markers[unknown == 255] = 0

# xác định các vùng


markers = cv2.watershed(img,
markers)
img[markers == -1] = [0, 0, 255]
Phân vùng
31

Nhận xét:

You might also like