LỜI MỞ ĐẦU Trong sự phát triển của các phương pháp xử lý hình ảnh hiện đại, việc sử dụngcác bộ lọc để phát hiện biên ảnh trở thành một công cụ không thể thiếu trong nhiềuứng dụng khác nh
Trang 1TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO HỌC PHẦN NHẬP MÔN XỬ LÝ ẢNH
ĐỀ TÀI :
TÌM HIỂU VỀ THUẬT TOÁN PHÁT HIỆN CẠNH CANNY
Sinh viên thực hiện : TẠ QUỐC TÙNG
Giảng viên hướng dẫn : NGUYỄN THỊ THANH TÂN Ngành : CÔNG NGHỆ THÔNG TIN
Hà Nội, tháng 8 năm 2024
Trang 3MỤC LỤC
LỜI CẢM ƠN
LỜI MỞ ĐẦU
CHƯƠNG 1 TỔNG QUAN VỀ XỬ LÝ ẢNH 1
1.1 Tổng quan về xử lý ảnh 1
1.2 Giới thiệu OpenCV 2
1.3 C++ và OpenCV 3
CHƯƠNG II THUẬT TOÁN PHÁT HIỆN CẠNH CANNY 4
2.1 Thuật toán phát hiện cạnh Canny 4
2.2.Các bước thực hiện thuật toán phát hiện cạnh Canny 6
2.2.1.Giảm nhiễu 6
2.2.2 Tính toán Gradient độ xám 7
2.2.3 Lọc bằng phương pháp non-maximum suppression 9
2.2.4 Ngưỡng kép (Double threshold) 12
2.2.5 Theo dõi cạnh theo độ trễ (Edge Tracking by Hysteresis) 13
CHƯƠNG 3: SỬ DỤNG OPENCV ĐỂ PHÁT HIỆN CẠNH BẰNG THUẬT TOÁN CANNY 15
3.1 Cài đặt OpenCV 15
3.2 Chạy chương trình 20
3.2.1 Thư viện cần thiết 20
3.2.2 Hàm main 20
Trang 4Chúng em xin chân thành cảm ơn!
Trang 5LỜI MỞ ĐẦU
Trong sự phát triển của các phương pháp xử lý hình ảnh hiện đại, việc sử dụngcác bộ lọc để phát hiện biên ảnh trở thành một công cụ không thể thiếu trong nhiềuứng dụng khác nhau, từ phân tích y tế, nhận diện khuôn mặt đến công nghệ thị giácmáy tính Trong số các phương pháp phát hiện biên ảnh, bộ lọc Canny nổi bật nhờkhả năng phát hiện chính xác các đường biên trong hình ảnh, đồng thời loại bỏnhiễu hiệu quả Bộ lọc này không chỉ đơn thuần là một công cụ kỹ thuật mà còn làyếu tố quyết định trong việc cải thiện chất lượng và độ chính xác của các hệ thống
xử lý hình ảnh Ngày nay, ứng dụng bộ lọc Canny không chỉ phổ biến trong lĩnhvực nghiên cứu mà còn được triển khai rộng rãi trong nhiều lĩnh vực công nghiệp
và thương mại, góp phần vào sự phát triển mạnh mẽ của công nghệ thị giác máytính Việc sử dụng bộ lọc Canny để tìm biên ảnh đã trở thành một giải pháp hiệuquả, giúp tối ưu hóa quy trình xử lý hình ảnh và đáp ứng nhanh chóng các yêu cầuphức tạp của cuộc sống hiện đại
Trang 6CHƯƠNG 1 TỔNG QUAN VỀ XỬ LÝ ẢNH 1.1 Tổng quan về xử lý ảnh
Xử lý ảnh là một lĩnh vực quan trọng trong công nghệ thông tin và kỹ thuật
số, liên quan đến việc thao tác và phân tích hình ảnh để trích xuất thông tin, cảithiện chất lượng, hoặc thực hiện các chức năng cụ thể như nhận dạng, phát hiện, vàtheo dõi đối tượng Ngành này đã phát triển mạnh mẽ nhờ vào sự tiến bộ của phầncứng máy tính, các thuật toán, và trí tuệ nhân tạo
Xử lý ảnh bao gồm nhiều bước, bắt đầu từ thu thập và tiền xử lý dữ liệu hìnhảnh để loại bỏ nhiễu, cân bằng sáng, và chuẩn hóa màu sắc Sau đó, các kỹ thuậtnhư biến đổi Fourier, lọc không gian, và phân tích tần số có thể được áp dụng đểtrích xuất các đặc điểm quan trọng từ hình ảnh Một số kỹ thuật phổ biến trong xử
lý ảnh bao gồm:
- Phát hiện biên: Nhận diện các cạnh hoặc đường ranh giới trong hình ảnh
để xác định đối tượng hoặc khu vực quan tâm Các bộ lọc như Sobel,Canny thường được sử dụng để phát hiện biên
- Phân đoạn ảnh: Chia hình ảnh thành các vùng nhỏ dựa trên các đặc tínhnhư màu sắc, độ sáng hoặc kết cấu Phân đoạn là bước cơ bản trong việcnhận diện đối tượng hoặc phân loại hình ảnh
- Nâng cao chất lượng hình ảnh: Các kỹ thuật như tăng cường độ sáng,tương phản, và giảm nhiễu giúp cải thiện chất lượng hình ảnh, làm cho
Trang 7- Nén ảnh: Giảm kích thước tệp ảnh để tiết kiệm dung lượng lưu trữ và băngthông truyền tải mà không làm mất quá nhiều chất lượng hình ảnh Cácphương pháp nén như JPEG và PNG là những tiêu chuẩn phổ biến.
1.2 Giới thiệu OpenCV
OpenCV (Open Source Computer Vision Library) là một thư viện mã nguồn
mở, được thiết kế dành riêng cho các ứng dụng thị giác máy tính và xử lý ảnh.OpenCV được phát triển bởi Intel vào cuối những năm 1990 và đã trở thành mộttrong những thư viện phổ biến nhất trong lĩnh vực này.Trong các ứng dụng sử dụng.NET Framework, mã nguồn chương trình (C#, VB.NET) được biên dịch thành mãngôn ngữ trung gian MSIL (Microsoft intermediate language)
Một số đặc điểm nổi bật của OpenCV bao gồm:
- Đa nền tảng: OpenCV có thể chạy trên nhiều hệ điều hành khác nhau nhưWindows, macOS, Linux, Android và iOS
- Hỗ trợ nhiều ngôn ngữ lập trình: OpenCV hỗ trợ C++, Python, Java, vàMATLAB, giúp dễ dàng tích hợp vào các dự án hiện có
- Thư viện phong phú: OpenCV cung cấp hàng ngàn hàm và thuật toán xử
lý ảnh, từ các tác vụ cơ bản như đọc và ghi ảnh, lọc, phát hiện biên, đếncác tác vụ phức tạp hơn như nhận dạng khuôn mặt, theo dõi đối tượng, vàthị giác 3D
- Hiệu suất cao: Được tối ưu hóa để tận dụng các kiến trúc phần cứng hiệnđại, OpenCV có khả năng xử lý ảnh và video với tốc độ cao, phù hợp cho
cả các ứng dụng thời gian thực
2
Trang 8Sự kết hợp này đã được ứng dụng rộng rãi trong các ngành công nghiệp như
ô tô (hệ thống lái tự động), y tế (chẩn đoán hình ảnh), an ninh (giám sát video), vànhiều lĩnh vực khác, nơi xử lý ảnh và thị giác máy tính đóng vai trò quan trọngtrong việc tự động hóa và nâng cao hiệu quả công việc
Trang 9CHƯƠNG II THUẬT TOÁN PHÁT HIỆN CẠNH CANNY
2.1 Thuật toán phát hiện cạnh Canny.
Khi nói đến nhận diện hình ảnh, mắt người chỉ mất vài phần nghìn giây để
xử lý và xác định nội dung của một bức ảnh Khả năng đáng kinh ngạc này có thểđược thực hiện dù dữ liệu là tranh vẽ hay ảnh chụp Đây cũng là mục đích hướngtới của thị giác máy tính Một trong những ý tưởng ngày nay là xây dựng một thuậttoán có thể phác thảo các cạnh của bất kỳ đối tượng nào có trên một hình ảnh, sửdụng thuật toán phát hiện cạnh Canny (Canny edge detection)
Thuật toán phát hiện cạnh Canny bao gồm 5 bước:
- Giảm nhiễu
- Tính toán Gradient độ xám của ảnh;
- Áp dụng Non-maximum suppression;
- Ngưỡng kép (Double threshold);
- Theo dõi cạnh bằng độ trễ (Edge Tracking by Hysteresis)
Sau khi áp dụng các bước này, ta có thể nhận được kết quả sau:
4
Trang 10Hình ảnh gốc ở bên trái – Hình ảnh đã xử lý ở bên phải
Một điều quan trọng cuối cùng cần đề cập, đó là thuật toán dựa trên ảnh xám
Do đó, điều kiện tiên quyết là phải chuyển hình ảnh sang thang độ xám trước khithực hiện các bước nêu trên
Trang 112.2.Các bước thực hiện thuật toán phát hiện cạnh Canny
Phương trình cho một kernel bộ lọc Gaussian có kích thước (2k + 1) × (2k + 1):
Sau khi áp dụng hiệu ứng mờ Gaussian, ta nhận được kết quả sau:
Hình ảnh gốc (trái) – Hình ảnh bị làm mờ với bộ lọc Gaussian (sigma = 1.4 và kíchthước kernel là 5×5)
6
Trang 122.2.2 Tính toán Gradient độ xám
Bước tính toán Gradient độ xám phát hiện các cạnh thông qua cường độ vàhướng của gradient độ xám
Các cạnh tương ứng với sự thay đổi cường độ sáng của pixel Để phát hiện
nó, cách dễ nhất là áp dụng các Filter làm nổi bật sự thay đổi cường độ này theo cảhai hướng: ngang (x) và dọc (y)
Sau Khi hình ảnh được làm mịn, các đạo hàm Ix và Iy w.r.t x và y được tính.Việc này có thể được thực hiện bằng cách nhân chập I với các Sobel kernel Kx và
Trang 13Hình ảnh bị mờ (trái) – Cường độ gradient (phải)
Kết quả gần như là mong đợi, nhưng chúng ta có thể thấy rằng một số cạnh dày và một số cạnh mỏng Bước non-maximum suppression sẽ giúp ta giảm thiểu các cạnh dày
Hơn nữa, mức cường độ gradient nằm trong khoảng từ 0 đến 255 nên độ sáng của các cạnh không đồng nhất Các cạnh trên kết quả cuối cùng phải có cùng cường độ (i-e Pixel trắng = 255)
8
Trang 142.2.3 Lọc bằng phương pháp non-maximum suppression
Tốt nhất, hình ảnh cuối cùng nên có các cạnh mỏng Vì vậy, ta phải thực hiệnthuật toán Non-maximum suppression để làm mỏng chúng
Nguyên tắc rất đơn giản: thuật toán đi qua tất cả các điểm trên ma trận cường
độ gradient và tìm các pixel có giá trị lớn nhất theo các hướng cạnh
Lấy một ví dụ:
Hộp màu đỏ ở góc trên bên trái đại diện cho một pixel cường độ của ma trậnCường độ Gradient đang được xử lý Hướng gradient tương ứng được biểu diễnbằng mũi tên màu cam với góc -pi radian (+/- 180 độ)
Trang 15Hướng gradient là đường chấm màu cam (nằm ngang từ trái sang phải) Mụcđích của thuật toán là để kiểm tra xem các pixel trên cùng một hướng có cường độcao hơn hay thấp hơn các pixel đang được xử lý Trong ví dụ trên, pixel (i, j) đangđược xử lý và các pixel trên cùng một hướng được đánh dấu bằng màu xanh lam (i,j-1) và (i, j + 1) Nếu một trong hai pixel đó có cường độ cao hơn pixel đang được
xử lý, thì chỉ có một pixel có cường độ cao hơn được giữ lại Pixel (i, j-1) có vẻsáng hơn, vì nó có màu trắng (giá trị 255) Do đó, giá trị cường độ của pixel hiệntại (i, j) được đặt thành 0 Nếu không có pixel nào ở hướng cạnh có giá trị cường độcao hơn thì giá trị của pixel hiện tại được giữ nguyên
Bây giờ chúng ta hãy tập trung vào một ví dụ khác:
Trong trường hợp này, hướng là đường chéo chấm màu cam Do đó, pixelcường độ cao nhất theo hướng này là pixel (i-1, j + 1)
10
Trang 16Tóm gọn lại, mỗi pixel được đánh giá bằng 2 tiêu chí chính (hướng cạnh tínhbằng radian và cường độ pixel (từ 0–255) Dựa trên các đầu vào này, các bước non-maximum suppression là:
- Tạo một ma trận được khởi tạo bằng 0 có cùng kích thước của ma trậncường độ gradient ban đầu
- Xác định hướng của gradient dựa trên giá trị góc từ ma trận góc;
- Kiểm tra xem pixel ở cùng một hướng có cường độ cao hơn pixel hiện đangđược xử lý hay không
-Trả lại hình ảnh được xử lý bằng thuật toán non-maximum suppression
Trang 17sáng hơn những pixel khác và điều này sẽ được khắc phục bằng hai bước cuốicùng.
2.2.4 Ngưỡng kép (Double threshold)
Bước này nhằm mục đích xác định 3 loại pixel: mạnh, yếu và ngoại lai:
- Pixel mạnh là pixel có cường độ cao và trực tiếp góp phần vào sự hìnhthành cạnh
- Pixel yếu là pixel có giá trị cường độ không đủ để được coi là mạnhnhưng chưa đủ nhỏ để được coi là ngoại lai
- Các pixel khác được coi là ngoại lai
Bây giờ bạn có thể thấy vai trò của ngưỡng kép:
- Ngưỡng cao được sử dụng để xác định các pixel mạnh (cường độ cao hơnngưỡng cao)
- Ngưỡng thấp được sử dụng để xác định các pixel ngoại lai (cường độ thấphơn ngưỡng thấp)
- Tất cả các điểm ảnh có cường độ giữa cả hai ngưỡng đều được gắn là yếu
Cơ chế Độ trễ (bước tiếp theo) sẽ giúp ta xác định xem các Pixel yếu sẽđược giữ lại như các pixel mạnh hay bị loại bỏ như pixel ngoại lai.Kết quả của bước này là một hình ảnh chỉ có 2 giá trị cường độ pixel (mạnh
và yếu):
12
Trang 18Hình ảnh trước non-maximum suppression (trái) – Kết quả (phải): pixel yếu
có màu xám và pixel mạnh có màu trắng
2.2.5 Theo dõi cạnh theo độ trễ (Edge Tracking by Hysteresis)
Dựa trên kết quả sau khi áp dụng ngưỡng, Hysteresis Tracking chuyển đổicác pixel yếu thành mạnh, khi và chỉ khi ít nhất một trong các pixel xung quanhpixel đang xét là pixel mạnh, các pixel yếu còn lại bị loại bỏ, như được mô tả bêndưới:
Trang 19Kết quả của quá trình
14
Trang 20CHƯƠNG 3: SỬ DỤNG OPENCV ĐỂ PHÁT HIỆN CẠNH BẰNG THUẬT
TOÁN CANNY 3.1 Cài đặt OpenCV
Để cài đặt OpenCV vào Microsoft Visual Studio và thiết lập môi trường
để phát triển ứng dụng C++ với OpenCV, bạn có thể làm theo các bước sau:
Bước 1: Tải và cài đặt OpenCV
Tải OpenCV:
- Truy cập trang chủ của OpenCV: OpenCV Releases
- Tải phiên bản OpenCV mới nhất dành cho Windows
Trang 21Bước 2: Cài đặt Microsoft Visual Studio
Tải Visual Studio:
- Truy cập Microsoft Visual Studio và tải phiên bản Visual Studio(Community, Professional, hoặc Enterprise)
Cài đặt Visual Studio:
- Khi cài đặt, hãy đảm bảo rằng bạn đã chọn: Desktop development with C++: Đảm bảo cài đặt tất cả các công cụ cần thiết để phát triển ứng dụng
C++
Bước 3: Thiết lập dự án trong Visual Studio
Tạo dự án mới:
16
Trang 22- Mở Visual Studio và tạo một dự án C++ mới bằng cách chọn Create anew project.
- Chọn Console App (hoặc Empty Project nếu bạn không muốn mẫu mãnào sẵn) và đặt tên cho dự án
Thiết lập các đường dẫn trong dự án:
- Nhấp chuột phải vào tên dự án trong Solution Explorer và chọnProperties
a Thiết lập Include Directories:
Đi tới C/C++ -> General -> Additional Include Directories
Thêm đường dẫn đến thư mục include của OpenCV, ví dụ: C:\opencv\build\include
b Thiết lập Library Directories:
Trang 23c Thiết lập Linker Input:
Đi tới Linker -> Input -> Additional Dependencies
Thêm tên các tệp .lib của OpenCV mà bạn cần sử dụng (ví dụ:opencv_world480.lib) Đảm bảo rằng bạn chọn đúng tệp lib cho cấu hìnhDebug hoặc Release
Bước 4: Thiết lập các biến môi trường
18
Trang 24Copy 2 file: opencv_world420d.dll và opencv_world420.dll
Dán 2 file vừa copy vào đường dẫn C:\Windows\System32
Trang 253.2 Chạy chương trình
3.2.1 Thư viện cần thiết
20
Trang 26Thư viện cần thiết:
opencv2/core.hpp: Chứa các lớp cơ bản và hàm cho xử lý ảnh cơ bản.opencv2/imgcodecs.hpp: Cung cấp các hàm để đọc và ghi ảnh
opencv2/highgui.hpp: Cung cấp các hàm để hiển thị ảnh và tương tác với người dùng
opencv2/opencv.hpp: Bao gồm tất cả các thành phần của OpenCV
iostream: Để sử dụng các luồng nhập/xuất chuẩn của C++
Trang 27Làm mờ ảnh: Sử dụng bộ lọc Gaussian để làm mờ ảnh xám Điều này giúp giảmnhiễu và làm cho việc phát hiện cạnh chính xác hơn Size(9, 9) xác định kích thướccủa bộ lọc và 2 là độ lệch chuẩn của bộ lọc Gaussian.
Phát hiện cạnh với ngưỡng đầu tiên:
- t1 = 30 và t2 = 200 là các giá trị ngưỡng thấp và cao cho thuật toán Canny
- Canny(gray, dst1, t1, t2, 3, false);: Hàm Canny thực hiện việc phát hiện cạnh Cáctham số:
+ gray: Ảnh đầu vào
+ dst1: Ảnh đầu ra chứa các cạnh được phát hiện
+ t1: Ngưỡng thấp
+ t2: Ngưỡng cao
+ 3: Kích thước của bộ lọc Sobel (cũng là một tham số của hàm Canny)
+ false: Không sử dụng thuật toán Canny với phương pháp Aperture
Phát hiện cạnh với ngưỡng thứ hai:
t1 và t2 được đặt lại với các giá trị khác để thực hiện phát hiện cạnh với cácngưỡng khác
22
Trang 28Hiển thị kết quả phát hiện cạnh: Sử dụng hàm imshow để hiển thị hai kết quả pháthiện cạnh với các ngưỡng khác nhau.
Chờ người dùng nhấn phím: Hàm waitKey(0) dừng chương trình và chờ ngườidùng nhấn phím để tiếp tục Tham số 0 có nghĩa là chờ vô thời hạn
Kết quả:
Trang 29TÀI LIỆU THAM KHẢO
1 OpenCV Bootcamp
2 OpenCV-Python Tutorials
24