Canny là một thuật toán phát hiện biên edge detection nổi tiếng và được sử dụng rộng rãi trong lĩnh vực xử lý ảnh.. Thuật toán Canny, một trong những phương pháp phát hiện biên hiệu quả
Trang 1ỦY BAN NHÂN DÂN TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC SÀI GÒN
BÁO CÁO CUỐI KÌ
MÔN: PHÂN TÍCH THIẾT KẾ XỬ LÝ ẢNH
Chủ đề: Kỹ thuật Canny trong xử lý ảnh.
Họ và tên: Võ Dũng Phát
Mã số sinh viên: 3120410389
Khoa: Công Nghệ Thông Tin
Thành phố Hồ Chí Minh – Tháng 5/2024
Trang 2MỤC LỤC
LỜI MỞ ĐẦU …… ………1
PHẦN I: GIỚI THIỆU……… 2
1 Mục tiêu đề tài……… 2
2 Tầm quan trọng của đề tài……….2
3 Lý do chọn đề tài……… 2
PHẦN II: CƠ SỞ LÝ THUYẾT……… 3
1 Biên ảnh……….3
2 Phương pháp phát hiện biên bằng kỹ thuật Canny……….3
PHẦN III: THỰC HIỆN CÀI ĐẶT THUẬT TOÁN CANNY… …………5
1 Làm trơn ảnh……… 9
2 Tính Gradient của ảnh bằng cách sử dụng mặt nạ Sobel……… 10
3 Tính độ lớn và hướng của Gradient tại mỗi điểm……….11
4 Tìm cực trị địa phương theo Gradient hướng……… .12
5 Tách ngưỡng kép……… 12
Trang 4Lời mở đầu
Trong thời đại công nghệ số hiện nay, xử lý ảnh số đang ngày càng trở thành một lĩnh vực quan trọng và có nhiều ứng dụng trong đời sống Từ những ứng dụng đơn giản như chỉnh sửa ảnh, nhận diện khuôn mặt, đến các ứng dụng phức tạp hơn như xe tự lái, y tế và giám sát
an ninh, công nghệ xử lý ảnh đã chứng minh được khả năng và tầm quan trọng của mình
Xử lý ảnh là một nhánh của trí tuệ nhân tạo và khoa học máy tính, bao gồm các phương pháp và kỹ thuật để biến đổi và phân tích ảnh nhằm thu thập thông tin có giá trị hoặc tạo ra những hình ảnh có chất lượng cao hơn Nó bao gồm nhiều công đoạn từ việc tiền xử lý ảnh, trích xuất đặc trưng, đến phân loại và nhận diện đối tượng trong ảnh
Trang 5Phần I: Giới thiệu
1 Mục tiêu của đề tài.
Canny là một thuật toán phát hiện biên (edge detection) nổi tiếng và được sử dụng rộng rãi trong lĩnh vực xử lý ảnh Thuật toán này được phát triển bởi John F Canny vào năm
1986 và kể từ đó, nó đã trở thành một trong những phương pháp cơ bản và hiệu quả nhất để phát hiện các biên trong ảnh số Mục tiêu của đề tài này là phân tích chi tiết thuật toán Canny
và ứng dụng của nó trong xử lý ảnh
2 Tầm quan trọng của đề tài.
Thuật toán Canny, một trong những phương pháp phát hiện biên hiệu quả và phổ biến nhất trong xử lý ảnh, đóng vai trò quan trọng trong nhiều ứng dụng khác nhau Việc nghiên cứu và phát triển các ứng dụng của thuật toán Canny mang lại nhiều giá trị quan trọng Thuật toán Canny đóng vai trò không thể thiếu trong nhiều lĩnh vực ứng dụng và nghiên cứu xử lý ảnh Tầm quan trọng của đề tài này không chỉ nằm ở việc cải thiện các hệ thống hiện có mà còn mở ra những cơ hội mới cho các nghiên cứu và ứng dụng trong tương lai Bằng cách hiểu
rõ và áp dụng hiệu quả thuật toán Canny, chúng ta có thể đạt được những bước tiến quan trọng trong khoa học và công nghệ, góp phần nâng cao chất lượng cuộc sống và thúc đẩy sự phát triển của xã hội
3 Lý do chọn đề tài.
Việc chọn nghiên cứu về thuật toán Canny trong xử lý ảnh dựa trên nhiều lý do quan trọng, bao gồm cả các khía cạnh học thuật, ứng dụng thực tiễn và tiềm năng phát triển Dưới đây là những lý do chính cho việc chọn đề tài này:
- Độ Phổ Biến và Ứng Dụng Rộng Rãi
- Tính Hiệu Quả và Chính Xác Cao
- Nhu Cầu Thực Tiễn Cao
- Nền Tảng Cho Nghiên Cứu Tiếp Theo
- Thách Thức Kỹ Thuật và Cơ Hội Sáng Tạo
- Phát Triển Kỹ Năng Chuyên Môn
- Góp Phần Vào Sự Phát Triển Cộng Đồng Khoa Học
- Khả Năng Ứng Dụng Cao Trong Đời Sống Hằng Ngày
Trang 6PHẦN II: CƠ SỞ LÝ THUYẾT
1 Biên ảnh:
- Điểm biên: một điểm ảnh được coi là điểm biên nếu có sự thay đổi đột ngột về mức xám Ví dụ: đối với ảnh đen trắng, một điểm được gọi là điểm biên nếu nó là điểm đen có ít nhất một điểm trắng bên cạnh
- Đường biên của đối tượng: được tạo thành bởi một tập các điểm biên liên tiếp
2 Phương pháp phát hiện biên bằng kỹ thuật Canny:
Giới thiệu:
Mục đích của việc phát hiện biên nói chung là giảm thiểu đáng kể số lượng dữ liệu trong một hình ảnh, trong khi các đặc tính cấu trúc vẫn được giữ để sử dụng cho việc xử lý hình ảnh hơn nữa Phương pháp Canny – được phát triển bởi John F Canny (JFC) vào năm 1986, là một trong những công cụ xử lý hình ảnh thông dụng nhất Phương pháp này khá tốt, có khả năng cho ra đường biên mảnh và phát hiện chính xác điểm biên với điểm nhiễu
Mục tiêu (ràng buộc) của JFC để phát triển thuật toán đó là tối ưu những vấn đề liên quan đến các tiêu chuẩn sau:
- Phát hiện: Xác suất phát hiện những điểm biên thực sự phải là cực đại hóa, trong khi xác suất lỗi phát hiện những điểm không phải biên cần được giảm thiểu Điều này tương ứng với tối đa hóa tỷ lệ báo hiệu nhiễu
- Cục bộ hóa: Các biên phát hiện nên càng gần biên thực càng tốt Có nghĩa là độ chênh lệch cấp xám giữa các điểm trên cùng một biên càng nhỏ càng tốt
- Số lượng trả lời – hiệu suất: biên không được nhận ra nhiều, trong khi chỉ
có một biên tồn tại giảm số lượng biên được phát hiện không được nhận ra
Chi tiết các bước thực hiện:
1 Làm trơn ảnh:
Nhân chập ảnh với mặt nạ Gauss:
Trang 7G = 1591 ∗[2 4 5 4 2
4 9 12 9 4
5 12 15 12 5
4 9 12 9 4
2 9 5 4 2]
Gọi I’ là kết quả sau khi lọc nhiễu: I’ = I ⊗ G
Trang 82 Tính Gradient của ảnh bằng cách sử dụng mặt nạ Prewitt hoặc mặt nạ Sobel:
Mặt nạ Prewitt:
Px = [−1 0 1
−1 0 1
1 1 1 ] Mặt nạ Sobel:
Sx = [−1 0 1
−2 0 2
1 2 1 ] Thực hiện nhân chập ảnh I’ ở trên với một trong 2 phương pháp (ở đây sử dụng mặt nạ Sobel):
3 Tính độ lớn và hướng của Gradient tại mỗi điểm:
Tính độ lớn tại mọi điểm: M = √G x
2
+G y2
Tính Gradient hướng tại mọi điểm: θ = tan−1
(G y
G x)
4 Tìm cực trị địa phương theo Gradient hướng:
Tại đây tiến hành loại bỏ các biên dư thừa bằng cách: tại mỗi điểm
ta xét 2 điểm bên cạnh theo hướng θ đã tính được ở trên Hướng được nguyên hóa để xác định cho 8 điểm xung quanh:
Trang 9Ví dụ xét điểm M(x, y) có θ(x, y) = 11,6° Vì -22,5 ≤ 11,6 < 22,5 nên hướng sẽ được nguyên hóa về 0° Tại đó xét độ lớn của 3 điểm M(x-1, y), M(x, y) và M(x+1, y) Nếu M(x, y) không nhỏ hơn 2 điểm còn lại thì giữ lại điểm M(x, y) Ngược lại, loại điểm M(x, y) bằng cách chuyển điểm M(x, y)
về 0
5 Tách ngưỡng kép:
Phương pháp Canny sử dụng ngưỡng kép, gọi ngưỡng thấp là t và ngưỡng cao là T Xét điểm M(x, y), so sánh M(x, y) với hai ngưỡng t và T:
- Nếu M(x, y) ≥ T: Đánh dấu và giữ lại điểm biên này (đặt giá trị bằng max)
- Nếu M(x, y) < T: Loại bỏ điểm biên này (đặt giá trị bằng 0)
- Nếu t ≤ M(x, y) < T: So sánh giá trị M(x,y) với giá trị của các của 8 điểm lân cận Nếu một trong 8 điểm lân cận có giá trị lớn hơn ngưỡng trên T thì đánh dấu và giữ lại điểm biên này Ngược lại thì loại bỏ điểm biên này (đặt giá trị bằng 0)
PHẦN III: THỰC HIỆN CÀI ĐẶT THUẬT TOÁN CANNY Ngôn ngữ lập trình: Python 3.6.5
Thư viên hỗ trợ:
- OpenCV: đọc ảnh và ghi ảnh.
Trang 10- matplotlib: hiển thị kết quả.
- numpy: tính toán số học và các phép tính ma trận.
- Trình soạn thảo: Sublime Text 3 ver.3143
Chương trình hoạt động dưới CLI (Windows Powershell/Windows CMD/Terminal):
- Syntax: python canny.py [absolute_image_file_path]
- Example: python canny.py sample1.jpg
Mã nguồn hàm xử lý:
import numpy as np
from copy import deepcopy
from scipy.signal import convolve2d
def convolve(image, kernel, m, div):
height = image.shape[0]
width = image.shape[1]
img = np.zeros_like(image)
for y in range(m//2, height-m//2):
for x in range(m//2, width-m//2):
# Kiểm tra biên và tích chập
if y >= m//2 and y < height-m//2 and x >= m//2 and x < width-m//2:
img[y, x] = ((kernel*image[y-m//2:y+m//2+1,
x-m//2:x+m//2+1]).sum())/div
return img
def cannyED(image):
height = image.shape[0]
width = image.shape[1]
Trang 11gaussian = np.array([[2, 4, 5, 4, 2],
[4, 9, 12, 9, 4],
[5, 12, 15, 12, 5],
[4, 9, 12, 9, 4],
[2, 4, 5, 4, 2]])
sobel_x = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]])
sobel_y = np.array([[-1, -2, -1],
[0, 0, 0],
[1, 2, 1]])
print("Smoothing Image ")
smImg = convolve(image, gaussian, 5, 159)
print("Calculating Gradient x-direction ")
gx = convolve(smImg, sobel_x, 3, 1)
print("Calculating Gradient y-direction ")
gy = convolve(smImg, sobel_y, 3, 1)
print("Calculating Magnitude and Gradient Direction ") mag = np.zeros_like(gx)
theta = np.zeros_like(gx)
for y in range(0, gx.shape[0]):
for x in range(0, gx.shape[1]):
mag[y, x] = np.sqrt(gx[y, x]**2 + gy[y, x]**2)
theta[y, x] = np.arctan2(gy[y, x], gx[y, x]) * 180 / np.pi res = deepcopy(mag)
Trang 12print("Calculate Non-maximum Suppression ")
for y in range(1, mag.shape[0]-1):
for x in range(1, mag.shape[1]-1):
if (theta[y, x] >= -22.5 and theta[y, x] < 22.5) or (theta[y, x] >= 157.5 or theta[y, x] < -157.5):
if not (mag[y, x] >= mag[y, x+1] and mag[y, x] >= mag[y, x-1]):
res[y, x] = 0
elif (theta[y, x] >= 22.5 and theta[y, x] < 67.5) or (theta[y, x] >= -157.5 and theta[y, x] < -112.5):
if not (mag[y, x] >= mag[y-1, x+1] and mag[y, x] >= mag[y+1, x-1]):
res[y, x] = 0
elif (theta[y, x] >= 67.5 and theta[y, x] < 112.5) or (theta[y, x]
>= -112.5 and theta[y, x] < -22.5):
if not (mag[y, x] >= mag[y-1, x] and mag[y, x] >= mag[y+1, x]):
res[y, x] = 0
else:
if not (mag[y, x] >= mag[y-1, x-1] and mag[y, x] >= mag[y+1, x+1]):
res[y, x] = 0
print("Double Thresholding ")
MAX = np.max(image) # Sử dụng image thay cho iamge
upperT = 0.2*MAX
lowerT = 0.1*MAX
a = [-1, 0, 1, -1, 1, -1, 0, 1]
b = [-1, -1, -1, 0, 0, 1, 1, 1]
Trang 13for i in range(8):
if (y+b[i] >= 0 and y+b[i] < height and x+a[i] >= 0 and x+a[i] < width):
if (res[y+b[i], x+a[i]] > upperT):
return True
return False
for y in range(1, mag.shape[0]-1):
for x in range(1, mag.shape[1]-1):
if (res[y, x] >= upperT):
res[y, x] = 255
elif (res[y, x] < lowerT):
res[y, x] = 0
else:
if (check(x, y) == True):
res[y, x] = 255
else:
res[y, x] = 0
print("DONE!")
return res
Trang 14Ảnh gốc:
Kết quả từng bước thực hiện thuật toán:
1 Làm trơn ảnh:
Trang 162 Tính Gradient của ảnh bằng cách sử dụng mặt nạ Sobel:
Kết quả với mặt nạ Sx
Kết quả với mặt nạ Sy
Trang 173 Tính độ lớn và hướng của Gradient tại mỗi điểm:
Độ lớn Gradient tại các điểm:
Gradient hướng (minh họa dưới dạng ảnh):
Trang 184 Tìm cực trị địa phương theo Gradient hướng:
5 Tách ngưỡng kép:
Trang 19PHẦN IV: KẾT LUẬN
Thuật toán Canny tạo ra các biên mịn và rõ ràng trong hình ảnh, đặc biệt hiệu quả trong việc phát hiện biên trong điều kiện nhiễu Nó là một trong những công cụ quan trọng trong xử lý hình ảnh và được sử dụng rộng rãi trong các ứng dụng:
- Phát hiện biên và đường nét trong hình ảnh: Canny được sử dụng để phát hiện biên và các đường nét trong hình ảnh, giúp trong việc phân tích hình ảnh y tế, nhận diện vật thể, nhận diện ký tự trong OCR (Nhận dạng ký tự quang học), và xác định đối tượng trong các ứng dụng thị giác máy
- Xử lý ảnh y tế: Trong lĩnh vực y học, thuật toán Canny được sử dụng
để phát hiện và phân tích các cấu trúc anh và các biến đổi trong hình ảnh y tế như MRI, CT scans và hình ảnh siêu âm
- Phân tích hình ảnh công nghiệp: Trong công nghiệp, Canny được sử dụng để kiểm tra chất lượng sản phẩm, phát hiện các dấu vết và khuyết điểm trong quá trình sản xuất, và kiểm tra bề mặt của các vật liệu
- Xử lý ảnh y sinh: Trong lĩnh vực y sinh, Canny được sử dụng để phát hiện cạnh của tế bào, phân tích hình dạng tế bào và cấu trúc mô trong hình ảnh từ kính hiển vi
- Xử lý hình ảnh trong tự động hóa và robot: Trong các ứng dụng tự động hóa và robot, Canny được sử dụng để phát hiện vật cản, xác định vị trí và hình dạng của đối tượng, và thực hiện các nhiệm vụ dựa trên hình ảnh như tự động lái xe
- Xử lý hình ảnh trong định vị và nhận dạng: Trong các ứng dụng định
vị và nhận dạng, Canny được sử dụng để phát hiện biên và các đặc điểm cần thiết để nhận dạng đối tượng, khuôn mặt, hoặc vật thể