Tải bản đầy đủ (.docx) (60 trang)

Xây dựng một số phương pháp phát hiện biên đối tượng từ ảnh số bằng ngôn ngữ c++/c# kết hợp thư viện opencv/emgu

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.98 MB, 60 trang )

TRƯỜNG ĐẠI HỌC KỸ THUẬT - HẬU CẦN CAND

KHOA CÔNG NGHỆ THÔNG TIN
----------

BÁO CÁO
THỰC TẬP CHUYÊN ĐỀ
Đề tài: “Xây dựng một số phương pháp phát hiện biên
đối tượng từ ảnh số bằng ngôn ngữ lập trình C++/C# kết
hợp thư viện OpenCV/Emgu”
Giáo viên hướng dẫn:

TS. NGUYỄN VĂN CĂN

Bắc Ninh, tháng 06 năm 2016


LỜI CẢM ƠN
Để hoàn thành chuyên đề này, cho phép em được bày tỏ lời cảm ơn tới
thầy cô giáo trong khoa Công nghệ thông tin trường Đại Học Kỹ Thuật - Hậu
Cần Công an nhân dân đã giúp đỡ em. Đặc biệt, em xin cảm ơn sự giúp đỡ quý
báu của thầy giáo Thượng tá - Tiến sĩ Nguyễn Văn Căn - Trưởng Khoa Công
nghệ thông tin đã tận tình hướng dẫn em trong suốt quá trình hoàn thành chuyên
đề.
Tuy nhiên, do thời gian có hạn cũng như kinh nghiệm còn hạn chế, nên
trong quá trình thực hiện chuyên đề này sẽ không tránh khỏi những thiếu sót,
hạn chế nhất định. Vì vậy, em rất mong nhận được sự chỉ bảo, đóng góp ý kiến
của các thầy cô cùng toàn thể các bạn để em có điều kiện bổ sung, nâng cao kiến
thức của mình, phục vụ tốt hơn cho việc học tập và thực tế sau này.
Em xin chân thành cảm ơn!
Bắc Ninh, ngày tháng 06 năm 2016


Học viên thực hiện


MỤC LỤC
Trang

3


DANH MỤC CHỮ VIẾT TẮT
Chữ viết tắt
CGA
OpenCV
RBG
NNLT

Ý nghĩa
Độ phân giải của ảnh trên màn hình (Color
Graphic Adaptor)
Thư viện mã nguồn mở (Open Source Computer Vision)
Không gian màu (Red, Blue, Green)
Ngôn ngữ lập trình

4


DANH MỤC HÌNH
Trang

5



DANH MỤC BẢNG
Trang

6


MỞ ĐẦU
1. Lý do chọn đề tài
Thời đại công nghệ thông tin phát triển như vũ bão đã đi vào từng ngõ
ngách của cuộc sống. Hiện nay, bất cứ sự phát triển của ngành công nghiệp nào
đều có sự hiện diện và đóng góp rất to lớn của công nghệ thông tin. Xử lý ảnh là
một trong những chuyên ngành quan trọng và lâu đời của Công nghệ thông tin.
Xử lý ảnh được áp dụng trong nhiều lĩnh khác nhau như y học, vật lý, hoá học,
tìm kiếm tội phạm, trong quân sự và trong một số lĩnh vực khác....
Phần lớn con người thu nhận thông tin bằng thị giác, cụ thể đó là các hình
ảnh. Vì vậy xử lý ảnh là vấn đề không thể thiếu và hết sức quan trọng để thu được
hình ảnh tốt hơn, đẹp hơn, nhằm đáp ứng yêu cầu thông tin khác nhau của người
nhận.
Trong xử lý ảnh, việc nhận dạng và phân lớp đối tượng cần trải qua các
quá trình và các thao tác khác nhau. Phát hiện biên là một giai đoạn rất quan
trọng vì các kỹ thuật phân đoạn ảnh chủ yếu dựa vào giai đoạn này. Mục đích
của việc dò biên sẽ đánh dấu những điểm trong một ảnh số mà có sự thay đổi
đột ngột về độ xám, tập hợp nhiều điểm biên tạo nên một đường bao quanh ảnh
(đường biên). Nhờ có đường biên mà chúng ta có thể phân biệt giữa đối tượng
và nền, phân biệt giữa các vùng khác nhau và định vị được đối tượng từ đó mà
nhận dạng đối tượng. Đây là cơ sở quan trọng trong việc ứng dụng phương pháp
này vào thực tiễn của cuộc sống, đặc biệt là trong điều kiện đất nước ta đang
từng bước phát triển và đi lên nên việc nghiên cứu các ứng dụng vấn đề này cần

được quan tâm và phát triển.
Xuất phát từ thực tế đó, em lựa chọn chuyên đề “Xây dựng một số
phương pháp phát hiện biên đối tượng từ ảnh số bằng NNLT C++/C# kết hợp
thư viện OpenCV/Emgu”.
2. Mục tiêu
- Trình bày một số phương pháp phát hiện biên đối tượng từ ảnh.
- Sắp xếp, phân loại tập các lệnh xử lý ảnh trong thư viện OpenCV/Emgu
thông qua một phần mềm phát hiện biên đối tượng từ ảnh.
- Xây dựng một phần mềm demo để mô phỏng việc tách biên từ ảnh bằng
một số phương pháp phát hiện biên.
3. Đối tượng và phạm vi nghiên cứu
- Đối tượng nghiên cứu:
+ Một số phương pháp phát hiện biên.
+ Các tài liệu ảnh thu thập từ thực tế.
+ Các công thức tính toán, lưu đồ thuật toán phát hiện biên, ngôn ngữ lập
trình ứng dụng phát hiện biên.

7


+ Thư viện mã nguồn mở xứ lý Multimedia OpenCV/Emgu phục vụ cho
công tác lập trình xử lý ảnh để phát hiện biên.
- Phạm vi nghiên cứu:
+ Tổng hợp một số phương pháp phát hiện biên, đánh giá và nhận xét
từng phương pháp này.
+ Lập trình thử nghiệm một số phương pháp này.
+ Tài liệu về ngôn ngữ lập trình C#/C++.
+ Tài liệu về thư viện mã nguồn mở Multimedia OpenCV/Emgu.
+ Tài liệu về các phương pháp phát hiện biên đối tượng từ ảnh số.
+ Nghiên cứu và học tập kinh nghiệm từ các chuyên gia.

4. Phương pháp nghiên cứu
- Phương pháp nghiên cứu, tổng hợp tài liệu: Tìm kiếm nguồn tài liệu liên
quan đến C++/C# và thư viện mã nguồn mở OpenCV/Emgu, các phương pháp
phát hiện biên từ ảnh số.
- Phương pháp phân tích và tổng hợp: Phân tích các chương trình nhận
dạng ảnh của các chuyên gia, phân tích các tài liệu liên quan đến việc xây dựng
chương trình.
- Phương pháp thực nghiệm: Lập trình thực nghiệm trên ngôn ngữ lập
trình C# và thư viện Emgu.
5. Nội dung nghiên cứu
- Nội dung 1: Nghiên cứu tổng quan về xử lý ảnh và biên.
Trong chương này trình bày sơ lược về xử lý ảnh, giới thiệu các bước xử
lý trong một hệ thống xử lý ảnh. Một số thành phần cốt tử trong xử lý ảnh, như
điểm ảnh, mức xám, độ phân giải, … được trình bày như là các khái niệm. Giới
thiệu biên và vai trò của biên trong nhận dạng.
- Nội dung 2: Nghiên cứu tổng quan thư viện OpenCV/Emgu.
Nội dung này đề cập tới thư viện OpenCV/Emgu, các hoạt động cơ bản
của thư viện OpenCV/Emgu.
- Nội dung 3: Một số phương pháp phát hiện biên.
Nội dung này đề cập đến một số phương pháp phát hiện biên, các kỹ thuật
thường được sử dụng để phát hiện biên, như: Gradient, Canny, Laplace,…
- Nội dung 4: Xây dựng chương trình từ các phương pháp phát hiện biên
đối tượng.
Qua việc cài đặt chương trình từ kỹ thuật phát hiện biên Sobel, Prewit,
Laplace… làm rõ quá quá trình hoạt động của các kỹ thuật này và những nhận
xét đánh giá các kỹ thuật này.
7. Cấu trúc báo cáo
8



Cấu trúc bài báo cáo gồm:
- Phần Mở đầu: Giới thiệu về đề tài, lý do chọn đề tài,...
- Chương 1: Tổng quan về xử lý ảnh và biên
- Chương 2: Tổng quan về thư viện OpenCV/Emgu
- Chương 3: Một số phương pháp phát hiện biên
- Chương 4: Xây dựng chương trình
- Phần Kết luận: Đưa ra một số đánh giá tổng quan các kết quả nghiên
cứu, xác định hướng phát triển.
8. Ý nghĩa lý luận và thực tiễn của chuyên đề
- Ý nghĩa lý luận: Qua kết quả của chuyên đề bổ sung và củng cố hệ thống
lý thuyết, quy trình, phương pháp phát hiện biên ảnh.
- Ý nghĩa thực tiễn:
+ Làm rõ một số thuật toán phát hiện biên ảnh.
+ Trên cơ sở thực nghiệm kiểm nghiệm các thuật toán có tác dụng trong
quá trình xử lý ảnh nhằm phát hiện biên.

9


CHƯƠNG 1
TỔNG QUAN VỀ XỬ LÝ ẢNH VÀ BIÊN
1.1. Tổng quan về xử lý ảnh
1.1.1. Xử lý ảnh
Con người thu nhận thông tin qua các giác quan trong đó thị giác đóng vai
trò quan trọng nhất. Cùng với sự phát triển nhanh của phần cứng máy tính, xử lý
ảnh và đồ hoạ đã phát triển mạnh mẽ và ngày càng có nhiều ứng dụng trong
cuộc sống. Chính vì thế, xử lý ảnh đóng một vai trò quan trọng trong tương tác
người máy.
Xử lý ảnh (Image Processing) là đối tượng nghiên cứu của lĩnh vực thị
giác máy, là quá trình biến đổi ảnh từ một ảnh ban đầu sang một ảnh mới với

các đặc tính mà tuân theo ý muốn của việc xử lý. Kết quả đầu ra của một quá
trình xử lý ảnh có thể là một ảnh “tốt hơn” hoặc một kết luận.
Xử lý ảnh thông thường gồm 3 bước:

Hình 1.1. Quá trình xử lý ảnh

- Bước 1: Nhập một hình ảnh với một máy quét quang học hoặc trực tiếp
thông qua nghệ thuật chụp ảnh số.
- Bước 2: Thao tác hoặc phân tích các hình ảnh bằng một cách nào đó.
Giai đoạn này có thể bao gồm kỹ thuật nâng cao chất lượng hình ảnh và nén dữ
liệu, hoặc hình ảnh có thể được phân tích để tìm ra các hình dáng mà mắt người
không thể thấy được. Ví dụ: các nhà khí tượng học sử dụng xử lý ảnh để phân
tích các ảnh vệ tinh.
- Bước 3: Kết quả đầu ra - hình ảnh có thể bị thay đổi bằng cách này hay
cách khác, nó có thể là một ảnh “tốt hơn” (ảnh mờ được xử lý để nhìn rõ hơn)
hoặc một kết luận (phân tích ảnh để trích chọn các đặc trưng vân tay hay ảnh
một tai nạn giao thông phác họa hiện trường tại nạn) [1] Đặng Thị Thương
(2011), đồ án tốt nghiệp "Tìm hiểu phương pháp phát hiện biên cho ảnh đa cấp
xám và ảnh màu", Trường Đại học Dân lập Hải Phòng..
1.1.2. Các bước xử lý ảnh
Quá trình xử lý một ảnh đầu vào nhằm thu được một ảnh đầu ra mong
muốn thường phải trải qua rất nhiều bước khác nhau. Các bước cơ bản của một
quá trình xử lý ảnh được thể hiện thông qua hình sau:

10


Hình 1.2. Sơ đồ tổng quát của một hệ thống nhận dạng trong xử lý ảnh

Để thực hiện được quá trình đầu tiên trong hệ thống xử lý ảnh, ta cần sử

dụng các thiết bị thu nhận ảnh để chuyển các thông tin dưới dạng hình ảnh thành
các cấu trúc lưu trữ được trong máy tính và được hiển thị ra màn hình, máy
in, ... Ảnh có thể thu nhận từ vệ tinh qua các bộ cảm ứng, qua camera, máy chụp
ảnh đơn sắc (màu), hay các tranh, ảnh được quét trên máy quét ảnh.
Ảnh sau khi thu nhận được qua hệ thống thu nhận, ảnh sẽ được lấy mẫu
và số hóa, sau đó sẽ được phân tích theo các loại ảnh.
Như vậy mục tiêu của xử lý ảnh có thể chia làm ba hướng như sau:
- Xử lý ảnh ban đầu để cho ra một ảnh mới tốt hơn theo một mong muốn
của người dùng (ví dụ: ảnh mờ cần xử lý để được rõ hơn).
- Phân tích ảnh để thu được thông tin nào đó giúp cho việc phân loại và
nhận biết ảnh (ví dụ: phân tích ảnh vân tay để trích chọn các đặc trưng vân tay).
- Từ ảnh đầu vào mà có những nhận xét, kết luận ở mức cao hơn, sâu hơn
(ví dụ: ảnh một tai nạn giao thông phác hoạ hiện trường tai nạn).
1.2. Một số khái niệm cơ bản về ảnh số
1.2.1. Điểm ảnh – Pixel/Picture
Element
Gốc của ảnh là ảnh liên tục về không gian và độ sáng. Để xử lý bằng máy
tính, ảnh cần phải được số hoá. Quá trình số hóa là quá trình biến đổi tín hiệu
liên tục sang tín hiệu rời rạc thông qua quá trình lấy mẫu (rời rạc hóa về không
gian) và lượng hóa thành phần giá trị (rời rạc hóa biên độ giá trị) mà về nguyên
tắc mắt người không phân biệt được 2 điểm kề nhau. Khoảng cách giữa các
điểm ảnh đó được thiết lập sao cho mắt người không phân biệt được ranh giới
giữa chúng. Mỗi một điểm như vậy gọi là điểm ảnh (PEL: Picture Element) hay
gọi tắt là Pixel.
Điểm ảnh (Pixel) là một phần tử của ảnh số tại toạ độ (x, y) với độ xám
hoặc màu nhất định. Kích thước và khoảng cách giữa các điểm ảnh đó được
11


chọn thích hợp sao cho mắt người cảm nhận sự liên tục về không gian và mức

xám (hoặc màu) của ảnh số gần như ảnh thật. Mỗi phần tử trong ma trận được
gọi là một phần tử ảnh [3] Nguyễn Quang Hoan (2006), giáo trình Xử lý ảnh,
Học viện Bưu chính Viễn thông..
1.2.2. Độ phân giải – Resolution
Độ phân giải của ảnh là mật độ điểm ảnh được ấn định trên một ảnh số
được hiển thị.
Khoảng cách giữa các điểm ảnh phải được chọn sao cho mắt người vẫn
thấy được sự liên tục của ảnh. Việc lựa chọn khoảng cách thích hợp tạo nên một
mật độ phân bố, đó chính là độ phân giải và được phân bố theo trục x và y trong
không gian hai chiều.
Ví dụ: Độ phân giải của ảnh trên màn hình CGA (Color Graphic Adaptor)
là một lưới điểm theo chiều ngang màn hình: 320 điểm chiều dọc * 200 điểm
ảnh (320*200). Rõ ràng, cùng màn hình CGA 12” ta nhận thấy mịn hơn màn
hình CGA 17” độ phân giải 320*200. Lý do: cùng một mật độ (độ phân giải)
nhưng diện tích màn hình rộng hơn thì độ mịn (liên tục của các điểm) kém hơn
[3] Nguyễn Quang Hoan (2006), giáo trình Xử lý ảnh, Học viện Bưu chính Viễn
thông..

Hình 1.3. Biểu diễn ảnh với độ phân giải

1.2.3. Nhiễu
Có 2 loại nhiễu cơ bản trong quá trình thu nhận ảnh
- Nhiễu hệ thống: Là nhiễu có quy luật có thể khử bằng các phép biến đổi
Fourier và loại bỏ các đỉnh điểm.
- Nhiễu ngẫu nhiên: Vết bẩn không rõ nguyên nhân được khắc phục bằng
các phép lọc (lọc trung bình, lọc trung vị,…) [4] Nguyễn Quang Sơn (2008),
luận văn thạc sĩ "Nghiên cứu một số phương pháp phát hiện biên", Trường Đại
học Thái Nguyên..

12



1.2.4. Mức xám – Gray level – và
phân đoạn ảnh
Một điểm ảnh có hai đặc trưng cơ bản là vị trí (x,y) của điểm ảnh và độ
xám của nó. Dưới đây chúng ta xem xét một số khái niệm và thuật ngữ thường
dùng trong xử lý ảnh.
- Mức xám của điểm ảnh là cường độ sáng của nó được gán bằng giá trị
số và là kết quả của quá trình lượng tử hóa tại điểm đó.
- Các thang giá trị mức xám thông thường: 16, 32, 64, 128, 256 (mức 256
là mức phổ dụng. Lý do từ kỹ thuật máy tính dùng 1 byte để biểu diễn mức xám.
Mức xám dùng 1 byte để biểu diễn 28 = 256 mức, tức là từ 0 đến 255).
Từ định nghĩa mức xám, ta phân loại ảnh theo giá trị mức xám của nó:
- Ảnh nhị phân: Ảnh chỉ có 2 mức đen trắng phân biệt tức dùng 1 bit mô
tả 2 mức khác nhau. Nói cách khác mỗi điểm ảnh nhị phân chỉ có thể là 0 hoặc
1. Trong đó, bit 1 biểu diễn đối tượng ảnh và được gọi là điểm đen, bit 0 biểu
diễn nền (phông ảnh) và được gọi là điểm trắng.
1

- Ảnh xám: Giá trị nằm trong khoảng từ 0 đến 255, như vậy mỗi điểm ảnh
trong ảnh xám được biểu diễn bằng 1 byte. Ảnh có nhiều mức xám được gọi là
ảnh đa cấp xám. Ta có thể chuyển đổi từ ảnh xám về ảnh nhị phân theo công
thức:
1

nếu X(m,n) >= θ

0

nếu X(m,n) < θ


với θ là ngưỡng tự chọn

Y(m,n)=
- Ảnh màu: Trong hệ màu RGB (Red, Blue, Green) để tạo nên thế giới
màu, người ta thường dùng 3 byte để mô tả mức màu, khi đó các giá trị màu:
28*3 = 224 ≈ 16,7 triệu màu.
Với ảnh màu, cách biểu diễn cũng tương tự như với ảnh đen trắng, chỉ
khác là tại mỗi phần tử của ma trận biểu diễn cho ba màu riêng rẽ gồm: đỏ, lục
và lam.
Ta có thể chuyển đổi ảnh màu về ảnh đa mức xám theo công thức:
G = 0.299R + 0.587G + 0.114B
(ảnh hưởng của màu đến mức xám giảm dần từ G, R đến B)
hoặc:
G = 0.333R + 0.333G + 0.333B
(Coi ảnh hưởng của R, G, B là như nhau).
Như vậy để xử lý ảnh màu ta phải xử lý trên 3 ảnh xám R, G, B của nó và
kết hợp lại sẽ có kết quả như mong muốn.

13


1.2.5. Lược đồ mức xám
Lược đồ xám của một ảnh là hàm cung cấp tần suất xuất hiện của mỗi
mức xám. Lược đồ xám được biểu diễn trong hệ tọa độ vuông góc (x, y); trục
hoành biểu diễn số mức xám, trục tung biểu diễn số điểm ảnh có cùng mức xám.
Lược đồ ảnh cung cấp nhiều thông tin về phân bố mức xám của ảnh, nó còn
được gọi là tính động của ảnh [6] Nguyễn Văn Căn (2010), chuyên đề "Phân
đoạn ảnh", Trường Đại học Kỹ thuật - Hậu cần CAND..
1.2.6. Láng giềng

Trong xử lý ảnh có hai loại láng giềng: [6] Nguyễn Văn Căn (2010),
chuyên đề "Phân đoạn ảnh", Trường Đại học Kỹ thuật - Hậu cần CAND.
4-láng giềng của một điểm (x,y) là một tập hợp bao gồm láng giềng dọc
và láng giềng ngang của nó:
N4((x,y)) = {(x+1,y), (x-1,y), (x,y+1), (x,y-1)}
8-láng giềng của (x, y) là một tập cha của 4-láng giềng và bao gồm láng
giềng ngang, dọc và chéo:
N8((x,y))=N4((x,y)) ∪ {(x+1,y+1),(x-1,y-1),(x+1,y-1),(x-1),(y+1)}
1.2.7. Vùng liên thông
Một vùng R được gọi là liên thông nếu bất kỳ hai điểm (x A, yA) và (xB, yB)
thuộc vào R có thể được nối bởi một đường (x A, yA) ... (xi-1,yi-1), (xi,yi),
(xi+1,yi+1)... (xB,yB), mà các điểm (xi,yi) thuộc vào R và bất kỳ điểm (xi,yi) nào đều
kề sát với điểm trước (xi-1,yi-1) và điểm tiếp theo (xi+1,yi+1) trên đường đó.
Một điểm (xk,yk) được gọi là kề với điểm (x l,yl) nếu (xl,yl) thuộc vào láng
giềng trực tiếp của (xk,yk) [6] Nguyễn Văn Căn (2010), chuyên đề "Phân đoạn
ảnh", Trường Đại học Kỹ thuật - Hậu cần CAND..
1.3. Tổng quan về biên
1.3.1. Biên và các kiểu biên cơ bản
1.3.1.1. Biên
Cho tới nay chưa có định nghĩa chính xác về biên và mỗi định nghĩa được
sử dụng trong một số trường hợp nhất định. Biên có thể được tạo ra bởi bóng tối,
kết cấu hình học... Biên cũng có thể được định nghĩa là không liên tục ở cường
độ hình ảnh do sự thay đổi trong cấu trúc hình ảnh. Biên trong một hình ảnh
thường xảy ra với độ phân giải hoặc quy mô khác nhau và đại diện cho quá trình
chuyển đổi của mức xám khác nhau, hay mức độ gradient. Tuy nhiên, nhìn
chung biên có thể được định nghĩa như sau:
Đ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 (đường bao của ảnh - boundary) 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. Mỗi một biên là một thuộc tính gắn
14


liền với một điểm riêng biệt và được tính toán từ những điểm lân cận nó. Đó là
một biến Vector bao gồm hai thành phần:
- Độ lớn của Gadient.
- Hướng φ được quay đối với hướng Gradient ψ.
1.3.1.2. Các kiểu biên cơ bản
- Biên lý tưởng:
Việc phát hiện biên một cách lý tưởng là việc xác định được tất cả các
đường bao trong đối tượng. Biên là sự thay đổi đột ngột về mức xám nên sự thay
đổi cấp xám giữa các vùng trong ảnh càng lớn thì càng dễ dàng nhận ra biên.
Một biên được coi đó là biên lý tưởng khi mà có sự thay đổi cấp xám lớn
giữa các vùng trong ảnh. Biên này thường chỉ xuất hiện khi có sự thay đổi cấp
xám qua một điểm ảnh.

Hình 1.4. Đường biên lý tưởng

- Biên dốc:
Biên dốc hay còn gọi là biên bậc thang, xuất hiện khi sự thay đổi cấp xám
trải rộng qua nhiều điểm ảnh. Vị trí của cạnh được xem như vị trí chính giữa của
đường dốc nối giữa cấp xám thấp và cấp xám cao.
Tuy nhiên đây chỉ là đường dốc trong toán học, từ khi ảnh được kỹ thuật
số hoá thì đường dốc không còn là đường thẳng mà thành những đường lởm
chởm, không trơn.

Hình 1.5. Đường biên bậc thang

- Biên không trơn:


15


Trên thực tế, ảnh thường có biên không lý tưởng, các điểm ảnh trên ảnh
thường có sự thay đổi mức xám đột ngột và không đồng nhất, đặc biệt là ảnh
nhiễu. Trong trường hợp không nhiễu (biên lý tưởng), bất cứ một sự thay đổi
cấp xám nào cũng thông báo sự tồn tại của một biên. Trường hợp đó khó có khả
năng xảy ra, ảnh thường là không lý tưởng, có thể là do các nguyên nhân sau:
Hình dạng không sắc nét.
Nhiễu: kết quả của nhiễu trên ảnh gây ra một sự biến thiên ngẫu nhiên
giữa các điểm ảnh. Sự xuất hiện ngẫu nhiên của các điểm ảnh có mức xám
chênh lệch cao làm cho các đường biên dốc trở lên không trơn chu mà trở thành
các đường biên gồ ghề, mấp mô, không nhẵn, đây chính là đường biên trên thực
tế.

Hình 1.6. Đường biên thực

Ngày nay, những phương pháp phát hiện biên hiện đại thường kết hợp
nhiễu vào trong mô hình của bài toán và trong quá trình phát hiện biên cũng
được tính đến. Còn khái niệm về biên nêu ở trên được sử dụng để xây dựng các
phương pháp phát hiên biên trong quá khứ, những mô hình về cách này được coi
là đơn giản và sơ sài.
1.3.2. Vai trò của biên trong nhận
dạng
Có thể hình dung tầm quan trọng của biên thông qua ví dụ sau: Khi một
người hoạ sĩ vẽ một cái bàn gỗ, chỉ cần phác thảo vài nét về hình dáng như cái
mặt bàn, cái chân bàn mà không cần thêm các chi tiết khác, người xem đã có thể
nhận ra đó là cái bàn. Vài nét phác thảo của người hoạ sĩ chính là đường biên
bao quanh đối tượng. Nếu ứng dụng của ta là phân lớp nhận diện các đối tượng

thì coi như nhiệm vụ đã hoàn thành. Tuy nhiên, nếu đòi hỏi thêm các chi tiết
khác như vân gỗ, màu sắc, kích thước… thì chừng ấy thông tin là chưa đầy đủ.
Tại sao phải tìm biên?
Tìm biên là làm nổi bật lên được những điểm ảnh mà tại đó có sự biến đổi
lớn về giá trị độ sáng so với các điểm xung quanh, thực chất đây là công đọan
quan trọng trong công việc phân tích ảnh, bởi vì do các nguyên nhân khác nhau
làm cho ảnh bị suy biến, do vậy phải tăng cường và khôi phục lại ảnh.

16


Tìm biên còn chính là đi tìm được các đường bao quanh của đối tượng,
quá trình định vị các điểm biên trong khi mà biên lại làm tăng độ tương phản
giữa biên và nền, cho đến khi biên có thể được nhìn thấy một cách dễ dàng.
Như đã đề cập tới ở phần tổng quan về một hệ thống nhận dạng và xử lý
ảnh, quá trình nhận dạng có hai giai đoạn cần thực hiện:
- Giai đoạn học: Các đặc điểm của đối tượng mẫu được lưu trữ (gọi là học
mẫu) và tập các phần tử mẫu được chia thành các lớp.
- Giai đoạn nhận dạng: Khi có đối tượng cần nhận dạng, các đặc điểm của
đối tượng sẽ được trích chọn và sử dụng hàm quyết định để xác định đối tượng
cần nhận dạng thuộc lớp nào.
Như vậy, việc nhận dạng sẽ chính xác nếu các đặc điểm được trích chọn
chính xác. Trong thực tế, các đặc điểm trích chọn phục vụ cho việc nhận dạng
thường là các bất biến, bởi vì vấn đề cơ bản trong bài toán nhận dạng ảnh là xác
định các đối tượng không phụ thuộc vào vị trí, kích thước và hướng quay.
- Có nhiều loại bất biến được trích chọn như:
+ Bất biến thống kê: Các mô men, độ lệch chuẩn của tập ảnh hay các độ
đo thống kê khác không phụ thuộc các phép biến đổi tuyến tính.
+ Bất biến hình học: Số đo kích thước của các đối tượng ảnh.
+ Bất biến tô-pô: Biểu diễn các cấu trúc tô-pô của các ảnh như số điểm

đỉnh, số lỗ hổng v. v…
+ Bất biến đại số: Chu tuyến, phân bố của các điểm ảnh, v. v... dựa vào
các việc tổ hợp các hệ số của đa thức mô tả đối tượng ảnh.
Các bất biến dùng trong nhận dạng thường được trích chọn từ biên, xương
của đối tượng. Do vậy, việc nhận dạng có hiệu quả hay không phụ thuộc nhiều
vào cách biểu diễn hình dạng và mô tả của vật thể.
1.3.3. Hướng giải quyết bài toán
phát hiện biên
Hiện nay trên thế giới có rất nhiều nghiên cứu về bài toán phát hiện biên
của đối tượng. Tuy nhiên có 2 hướng nghiên cứu chủ yếu đó là:
- Sử dụng NNLT C++ kết hợp với thư viện OpenCV.
- Sử dụng NNLT C# kết hợp với thư viện Emgu.

17


CHƯƠNG 2
TỔNG QUAN VỀ THƯ VIỆN OPENCV/EMGU
2.1. Thư viện OpenCV
2.1.1. Giới thiệu
OpenCV (Open Source Computer Vision) [7] Nguyễn Văn Căn (2014),
giáo trình "Tổng quan về thư viện OpenCV", Trường Đại học Kỹ thuật - Hậu
cần CAND. là một thư viện mã nguồn mở về thị giác máy tính. OpenCV được
tích hợp hơn 500 hàm và hơn 2500 thuật toán đã tối ưu về xử lý ảnh, nhận dạng,
phân loại, ... và các vấn đề liên quan tới thị giác máy. OpenCV được thiết kế
một cách tối ưu, sử dụng tối đa sức mạnh của các CPU chip đa lõi… để thực
hiện các phép tính toán trong thời gian thực, nghĩa là tốc độ đáp ứng của nó có
thể đủ nhanh cho các ứng dụng thông thường. OpenCV là thư viện được thiết kế
để chạy trên nhiều nền tảng khác nhau (cross-platform), nghĩa là nó có thể chạy
trên hệ điều hành Window, Linux, Mac, iOS… Việc sử dụng thư viện OpenCV

tuân theo các quy định về sử dụng phần mềm mã nguồn mở BSD (Berkely
Software Distribution) do đó người dùng có thể sử dụng thư viện này một cách
miễn phí cho cả mục đích thương mại lẫn phi thương mại.
Dự án về OpenCV được khởi động từ những năm 1999, đến năm 2000 nó
được giới thiệu trong một hội nghị của IEEE về các vấn đề trong thị giác máy và
nhận dạng, tuy nhiên bản OpenCV 1.0 mãi tới tận năm 2006 mới chính thức
được công bố và năm 2008 bản 1.1 (pre-release) mới được ra đời. Tháng 10 năm
2009, bản OpenCV thế hệ thứ hai ra đời (thường gọi là phiên bản 2.x), phiên bản
này có giao diện của C++ (khác với phiên bản trước có giao diện của C) và có
khá nhiều điểm khác biệt so với phiên bản thứ nhất.
Thư viện OpenCV ban đầu được sự hỗ trợ từ Intel, sau đó được hỗ trợ bởi
Willow Garage, một phòng thí nghiệm chuyên nghiên cứu về công nghệ robot.
Cho đến nay, OpenCV vẫn là thư viện mở, được phát triển bởi nguồn quỹ không
lợi nhuận (none-profit foundation) và được sự hưởng ứng rất lớn của cộng đồng.

Hình 2.7. Icon của thư viện OpenCV

2.1.2. Phiên bản OpenCV
2.1.2.1. Phiên bản OpenCV 1
Cho tới nay, trải qua hơn 6 năm từ lúc phiên bản OpenCV đầu tiên được
công bố, đã có lần lượt nhiều phiên bản OpenCV ra đời, tuy nhiên có thể chia
18


thư viện này thành hai bản chính dựa trên những đặc điểm khác biệt lớn nhất của
chúng: phiên bản OpenCV thế hệ thứ nhất (hay còn gọi là phiên bản OpenCV
1.x) và phiên bản OpenCV thứ hai (hay còn gọi là phiên bản OpenCV 2.x).
OpenCV 1.x (bao gồm bản 1.0 và bản pre-release 1.1) dựa trên giao diện
C, cấu trúc của một ảnh số dựa trên cấu trúc của IplImage.
- Trong OpenCV 1.x, người sử dụng phải hoàn toàn quản lý bộ nhớ của

các đối tượng, nghĩa là khi một đối tượng mới được tạo ra, ta phải luôn chú ý, để
giải phóng nó khi không còn sử dụng nữa (trong nhiều trường hợp có thể sẽ bị
tràn bộ nhớ nếu không chú đều này).
2.1.2.2. Phiên bản OpenCV 2
Thư viện OpenCV 2.x việc quản lý bộ nhớ trở nên dễ dàng hơn nhờ các
hàm hủy các các lớp đối tượng trong OpenCV 2.x đã thực hiện điều này khi một
đối tượng không còn được sử dụng nữa.
- Việc viết các dòng lệnh để thực hiện cùng một chức năng trong OpenCV
2.x là dễ dàng hơn nhiều so với OpenCV 1.x, một phần là là giao diện C++ có
phần dễ hiểu hơn so với C, một phần là các hàm trong OpenCV 2.x đã được tối
ưu hóa nhiều bước trung gian không cần thiết về mặt giao diện người sử dụng.
Chẳng hạn ta hãy xét ví dụ về việc phát hiện đường tròn trong ảnh mầu dựa vào
thuật toán Hough, các bước để thực hiện là load một ảnh mầu, chuyển sang ảnh
nhị phân, tìm biên dựa trên bộ lọc canny và phát hiện đường tròn dựa trên thuật
toán Hough. OpenCV 2.x thực hiện như sau:
// Phát hiện đường tròn trong ảnh OpenCV 2.x
Mat src = imread(“image.jpg”);
Mat gray;
CvtColor (src, gray, CV_BGR2GRAY);
Canny (gray, gray, 10, 30, 3);
Vector<Vec3f> circles;
HoughCircles (gray, circles, CV_HOUGH_GRADIENT, 1, 50, 100,
50);

Đối tượng ảnh gray trong OpenCV 2.x không cần phải khởi tạo, đối tượng
storage (đối tượng trung gian, không có ý nghĩa về mặt sử dụng) cũng không
cần phải khởi tạo (và do đó không cần giải phóng).
- Thư viện OpenCV 2.x chứa khá nhiều hàm, thuật toán về xử lý ảnh và
được tối ưu khá nhiều đặc biệt trong các khía cạnh về phát hiện đối tượng
(detection), nhận dạng đối tượng (partten regconition) và theo dỗi đối tượng

(tracking).
Trong các ví dụ của tài liệu này, các nội dung cài đặt, thuật toán, ứng dụng…
chỉ dành cho OpenCV phiên bản 2.x trên nền tảng hệ điều hành Windows [7]
Nguyễn Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại
học Kỹ thuật - Hậu cần CAND..

19


2.1.3. Cài đặt OpenCV
Đầu tiên là Download và cài đặt OpenCV, tiếp theo tiến hành tùy chỉnh để
có thể làm kết hợp OpenCV với Microsoft Visual Studio.
Trong hướng dẫn ở đây sử dụng phiên bản Visual Studio 2013 và
OpenCV2.3.0, hệ điều hành Windows10 64 bit. Đối với các phiên bản khác thao
tác tương tự.
- Bước 1. Download và cài đặt thư viện OpenCV
Để download thư viện OpenCV về máy tính, thường thì download phiên
bản mới nhất tại địa chỉ />Sau khi download, tiến hành cài đặt bình thường, để mặc định ở ổ C với
tên là OpenCV. Sau khi cài đặt xong đường dẫn có dạng C:\OpenCV.
- Bước 2. Sao chép các hàm trong OpenCV vào Visual Studio
Mục tiêu là sao chép 2 thư mục OpenCV và OpenCV2 trong đường dẫn:
“C:\OpenCV\build\include” sang “C:\Program Files\Microsoft Visual Studio
11.0\VC\include”
- Bước 3. Copy các thư viện của OpenCV về thư viện của MS Visual
Studio
Mục tiêu là copy tất cả các file thư viện trong OpenCV sang thư viện của
MS Visual Studio.
Đánh dấu tất cả các file trong “C:\OpenCV\build\x86\vc11\lib\*.*”
Copy sang “C:\Program Files\Microsoft Visual Studio 11.0\VC\lib”
Ở đây có một số lựa chọn cần thực hiện tùy chọn cho phù hợp:

+ Chọn thư mục x64, do sử dụng Window 8, 64 bit.
+ Chọn thư mục vc11, do sử dụng Visual Studio phiên bản 2012 (nếu là
Visual Studio 2010 chọn thư mục vc10, nếu là Visual Studio 2008 chọn thư mục
vc9).
- Bước 4. Sao chép các thư viện từ OpenCV sang Windows
Mục tiêu là copy tất cả các file dll từ: “C:\OpenCV\build\x86\vc11\bin”
sang “C:\Windows\System32”.
- Bước 5. Cấu hình thuộc tính của Project
Các Project lập trình trong Visual Studio C++ có sử dụng các hàm của thư
viện OpenCV, cần phải cấu hình thuộc tính của nó có sử dụng đến các thư viện
cần thiết:
+ Mở cửa sổ dự án (Project)
+ Vào Menu Project, chọn Properties
+ Chọn bên trái cửa sổ: Configuration Properties, chọn Linker, chọn Input

20


+ Sau khi chọn bên trái, thì chọn bên phải tương ứng ở mục Additional
Dependency và thêm các file thư viện cần thiết:
opencv_core248d.lib: các hàm chuẩn
opencv_highgui248d.lib: các thao tác giao diện
opencv_imgproc248d.lib: các hàm xử lý ảnh cơ bản
Tùy thuộc vào mục đích của Project sử dụng đến đâu, khai báo đến đó.
Cần phải tìm hiểu thêm các thư viện của OpenCV từng thư viện có những ứng
dụng gì. Có thể nghiên cứu thêm trên mạng internet hoặc tài liệu về OpenCV.
2.1.4. Một số phép xử lý ảnh cơ bản
sử dụng thư viện OpenCV
2.1.4.1. Gọi và hiển thị ảnh
Ở đây, xây dựng một chương trình Hello World để gọi và hiển thị một ảnh.

Chương trình như sau:
#include<opencv\cv.h>
#include<opencv\highgui.h>
using namespace std;
using namespace cv;
int main()
{
printf("Hello World");
Mat img = imread("images.jpg", CV_LOAD_IMAGE_COLOR);
namedWindow("Quoc Tu Giam", CV_WINDOW_AUTOSIZE);
imshow("Quoc Tu Giam ", img);
waitKey(0);
return 0;
}

Như đã nói ở trên, trong OpenCV với giao diện C#, tất cả các kiểu dữ liệu
ảnh, ma trận điều được lưu ở dạng cv::Mat. Hàm imread sẽ đọc ảnh đầu vào và
lưu vào biến img. Nguyên mẫu của hàm này như sau:
cv::Mat imread(const std::string &filename, int flags) [7] Nguyễn Văn
Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại học
Kỹ thuật - Hậu cần CAND.
Trong đó,
- Filename là đường dẫn tới file ảnh, nếu file ảnh không nằm trong thư mục
làm việc hiện hành thì ta phải chỉ ra đường dẫn tương đối dạng như
D:\Anh\vietnam.jpg hoặc D://Anh//Vietnam.jpg.
- Flags là tham số loại ảnh mà ta muốn load vào, cụ thể nếu nếu muốn load
ảnh mầu thì ta để CV_LOAD_IMAGE_COLOR, nếu là ảnh xám thì ta để
CV_LOAD_IMAGE_GRAYSCALE…

21



Sau khi đã load ảnh thành công, muốn hiển thị ảnh lên màn hình ta phải
tạo ra một cửa sổ, hàm namedWindow sẽ tạo ra cửa sổ với tiêu đề cửa sổ là một
chuỗi string winname. Cấu trúc hàm namedWindow có dạng:
namedWindow(const std::string &winname, int flags) [7] Nguyễn
Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại
học Kỹ thuật - Hậu cần CAND.
Tham số flags sẽ chỉ ra kiểu cửa sổ muốn tạo: nếu tham số
CV_WINDOW_AUTOSIZE được sử dụng thì kích cỡ cửa sổ tạo ra sẽ được
hiển thị một cách tự động tùy thuộc vào kích thước của ảnh, nếu là tham
sốCV_WINDOW_AUTOSIZE_FULLSCREEN kích thước cửa sổ sẽ khít với
màn hình máy tính…
Cuối cùng, hàm imshow sẽ hiển thị ảnh ra cửa sổ đã được tạo ra trước đó.
Cấu trúc tổng quát của hàm là:
imshow(const std::string &winname, cv::InputArray Mat)[7] Nguyễn
Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại
học Kỹ thuật - Hậu cần CAND.
Hàm waitKey(int delay) sẽ đợi cho đến khi có một phím được bấm vào
trong khoảng thời gian là delay. Chú ý là nếu không có hàm này thì chương
trình sau khi chạy sẽ không dừng lại màn hình và kết thúc luôn, ta dung hàm này
mục đích là để dừng màn hình lại trong một khoảng thời gian bằng tham số
delay (tính theo đơn vị milisecond). Nếu muốn dừng màn hình lại mãi ta đặt các
tham số delay bằng 0.
Và sau đây là kết quả chương trình chạy:

Hình 2.8. Ảnh được gọi ra

2.1.4.2. Điều chỉnh độ sáng và độ tương phản trong ảnh
Một ảnh số được lưu trữ trên máy tính là một ma trận các điểm ảnh (hay

pixel) [7] Nguyễn Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV",
22


Trường Đại học Kỹ thuật - Hậu cần CAND.. Trong OpenCV nó được biểu diễn
dưới dạng cv::Mat. Ta xét một kiểu ảnh thông thường nhất, đó là ảnh RGB. Với
ảnh này, mỗi pixel ảnh quan sát được là sự kết hợp của các thành phần màu R
(Red), Green (Green) và Blue (Blue). Sự kết hợp này theo những tỉ lệ R, G, B
khác nhau sẽ tạo ra vô số các màu sắc khác nhau. Giả sử ảnh được mã hóa bằng
8 bit với từng kênh màu, khi đó mỗi giá trị của R, G, B sẽ nằm trong khoảng [0,
255]. Như vậy ta có thể biểu diễn tới 255*255*255 ~ 1.6 triệu màu sắc từ ba
màu cơ bản trên. Ta có thể xem cách biểu diễn ảnh trong OpenCV ở định dạng
cv::Mat qua hình ảnh sau:

Hình 2.9. Biểu diễn độ sáng và tương phản

Như vậy, mỗi ảnh sẽ có n hàng và m cột, m gọi là chiều dài của ảnh
(width) và n gọi là chiều cao của ảnh (heigh). Mỗi pixel ở vị trí (i,j) trong ảnh sẽ
tương ứng với 3 kênh màu kết hợp trong nó. Để truy xuất tới từng pixel ảnh với
những kênh màu riêng rẽ ta sử dụng mẫu sau:
img.at<cv::Vec3b>(i,j)[k]
Trong đó, i, j là pixel ở hàng thứ i và cột thứ j, img là ảnh mà ta cần truy
xuất tới các pixel của nó. cv::Vec3b là kiểu vector uchar 3 thành phần, dùng để
biểu thị 3 kênh màu tương ứng. k là kênh màu thứ k, k = 0, 1, 2 tương ứng với
kênh màu B, G, R. Chú ý là trong OpenCV, hệ màu RGB được biểu diễn theo
thứ tự chữ cái là BGR Error: Reference source not found.
Sau đây ta sẽ áp dụng kiến thức trên để làm tăng, giảm độ sáng và tương
phản của một ảnh màu, việc làm này cũng hoàn toàn tương tự đối với ảnh xám,
chỉ khác biệt là ảnh dùng một kênh duy nhất để biểu diễn ảnh xám [7] Nguyễn
Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại học

Kỹ thuật - Hậu cần CAND..
Chương trình tăng, giảm độ sáng và độ tương phản của một ảnh:
Giả sử f là một hàm biểu diễn cho một ảnh nào đó, f(x,y) là giá trị của
pixel trong ảnh ở vị trí (x,y).
Đặt
Khi đó,
- Nếu α ≠ 1, thì ta nói ảnh g(x,y) có độ tương phản gấp α lần so với ảnh f(x,y).
- Nếu β ≠ 0 ta nói độ sáng của ảnh g(x,y) đã thay đổi một lượng là β.
Dựa vào công thức trên ta có chương trình thay đổi độ sáng và tương phản
của ảnh như sau:
23


#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
printf("Chuong trinh dieu chinh do sang va tuong
phan");
Mat src = imread("images.jpg", 1); // Hàm gọi ảnh ra
Mat dst = src.clone(); //sao chép hàm gọi ảnh ở trên
tạo ra cửa sổ mới
double alpha = 2.0; // Độ tương phản của ảnh muốn chỉnh
sửa
int beta = 30; // Độ sáng của ảnh muốn chỉnh sửa
for (int i = 0; i < src.rows; i++) //Xét ảnh theo dòng
for (int j = 0; j < src.cols; j++) // Xét ảnh

theo cột
for (int k = 0; k < 3; k++)
dst.at<Vec3b>(i,j)
[k]=saturate_cast<uchar>(alpha*(src.at<Vec3b>(i, j)[k]) +
beta);
//tránh tình trạng dữ liệu ảnh làm tràn số, ta sử dụng
hàm uchar convert kiểu dữ liêu type = uchar
imshow("Anh Goc", src); // Đặt tên cho cửa sổ hiển thị
ảnh gốc
imshow("Anh sau khi chinh sua", dst); // Đặt tên cho
cửa sổ hiển thị ảnh đã chỉnh sửa tăng độ sáng
waitKey(0);
return 0;
}

Trong chương trình trên, hàm clone() sẽ sao chép một ảnh giống hệt như
ảnh gốc cho vào ảnh đích (dst = src.clone()). Giá trị của các pixel ảnh f(x,y) và
g(x,y) ở đây phải nằm trong khoảng [0, 255], trong khi phép biến đổi g(x,y) =
αf(x,y) + β có thể khiến cho giá trị của g(x,y) vượt qua ngưỡng đó. Để tránh tình
trạng tràn số hoặc kiểu dữ liệu không tương thích, ta dùng thêm hàm
saturate_cast<uchar>(type). Hàm này sẽ biến kiểu dữ liệu type nếu
không phải là uchar thành kiểu dữ liệu uchar [7] Nguyễn Văn Căn (2014), giáo
trình "Tổng quan về thư viện OpenCV", Trường Đại học Kỹ thuật - Hậu cần
CAND..
Sau đây là kết quả chương trình với giá trị α = 2.0 và β=30

24


Hình 2.10. Ảnh trước và sau khi chỉnh sửa tăng độ sáng và tương phản


2.1.4.3. Phóng to, thu nhỏ ảnh
Ảnh số thực chất là một ma trận các điểm ảnh, do đó để có thể phóng to,
thu nhỏ hay xoay một tấm ảnh ta có thể sử dụng các thuật toán tương ứng trên
ma trận [7] Nguyễn Văn Căn (2014), giáo trình "Tổng quan về thư viện
OpenCV", Trường Đại học Kỹ thuật - Hậu cần CAND..
Ta sẽ sử dụng biển đổi affine để quay và thay đổi tỉ lệ to, nhỏ của một ma
trận.
Biến đổi affine:
Giả sử ta có vector và ma trận M 2x2. Phép biển đổi affine trong không
gian hai chiều có thể được định nghĩa trong đó. Viết một cách tường minh ta có:

 x' 
 y ' =
 

α δ   x 
γ β   y

 

Hay
Xét ma trận trên, nếu δ = γ = 0, khi đó x’ = αx và y’ = βy, phép biến đổi
này làm thay đổi tỉ lệ của ma trận. Nếu là trong ảnh nó sẽ phóng to hoặc thu nhỏ
ảnh. Hình sau mô tả phép biến đổi với tỉ lệ α = β = 2

Hình 2.11. Mô tả phép biến đổi với tỉ lệ α = β = 2

Nếu định nghĩa ma trận thì phép quay sẽ quay p thành p’ với góc quay là
θ.


25


×