Tìm hiểu về các kỹ thuật xử lý ảnh . Áp dụng các kỹ thuật xử lý ảnh với thư viên xử lý ảnh Opencv và so sánh với thư viện xử lý ảnh đã được hỗ trợ cho Python. Đánh giá ưu nhược điểm của việc sử dụng Opencv và thư viện của Python . Xây dựng ứng dụng
Trang 1 Trường Đại Học Công Nghiệp Hà Nội
Khoa Công Nghệ Thông Tin
Báo cáo thực tập tốt nghiệp
Đề tài:Xử lý ảnh với OpenCV và Python Sinh viên thực hiện : Đỗ Xuân Sơn
Lớp: KHMT2-K10 Giáo viên hướng dẫn :TS.Ngô Đức Vĩnh
Trang 2Mở Đầu I.Lý Do Chọn Đề Tài
Xã hội ngày càng phát triển thì công nghệ cũng càng ngày càng phát triển theo từ các cuộc cách mạng công nghiệp đầu tiên đến bây giờ là cuộc cách mạng công ngiệp 4.0 Là cuộc cách mạng mà cốt lõi là công nghệ thông tin với các thiết bị thông minh như robot hay xe tự lái để tăng năng suất lao động và phục vụ cho các nhu cầu đời sống con người nhưng vấn
đề gặp phải chung ở đây đối với các thiết bị này là chúng vẫn còn rất ngây ngô so để chúng có trở nên thực sự thông minh thì con người phải dạy cho chúng hiểu và phân được các sự vật trong thực tế nhằm đưa ra các bài toán
xử lý chính xác nhằm đạt được mục đích công việc từ đó đã phát triển nên khái niệm Image Processing Qua quá trình phát triển thì các lập trình viên
đã phát triển các thư viện hỗ trợ hay còn gọi là OpenCV cho quá trình xử lýảnh Nhờ đó mà khi xử lý ảnh chúng ta không cần phải xây dựng lại các hàm xử lý ảnh mà chỉ cần phát triển dựa trên những gì sẵn có Do vậy nhiều người chỉ biết đến xử lý ảnh với OpenCV Nhưng hiện tại Python cũng đã phát triển các thư viện dành riêng cho xử lý ảnh Thế nên trong đề tài này em muốn đưa ra sự được ưu điểm nhược điểm khi xử lý ảnh với Python so với thư viện OpenCV vốn đã rất quen thuộc với hầu hết các lập trình viên trong lĩnh vực xử lý ảnh
Trang 3II.Mục Tiêu Nghiên Cứu
Tìm ra được các ưu điểm và nhược khi xử lý ảnh với python và OpenCV để từ đó giúp người sử dụng khi nào nên xử dụng các thư viện của python để xử lý ảnh khi nào nên xử dụng OpenCV để xử lý ảnh nhằm đem lại hiệu quả tối đa cũng như sự khoa học trong công việc xử lý ảnh
III.Phương Pháp Nghiên Cứu
Tìm hiểu về một số kĩ thuật trong xử lý ảnh và một số modul thườngđược sử dụng để hiểu về các thuật toán và mô hình cho xử lý ảnh một cách tổng quát nhất
Tìm hiểu về OpenCV để trả lời cho những câu hỏi OpenCV là gì tại sao phải dùng OpenCV ,Ai dùng OpenCV, Các Cấu Trúc Tập Lệnh trong OpenCV , OpenCV
Hỗ trợ người dùng như thế nào trong xử lý ảnh
Tương tư với Python
Sau đó rút ra nhận xét về ưu nhược điểm khi xử lý ảnh với OpenCV và PyThon
IV Đối tượng nghiên cứu
Open CV và python
Trang 4
CHƯƠNG I: TỔNG QUAN VỀ XỬ LÝ ẢNH 1.1.Tổng Quan Về Lĩnh Vực Nghiên Cứu
Xử lý ảnh là một lĩnh vực mang tính khoa học và công nghệ Nó là một ngành khoa học mới mẻ so với nhiều ngành khoa học khác nhưng tốc độ phát triển của nó rất nhanh, kích thích các trung tâm nghiên cứu, ứng dụng, đặc biệt là máy tính chuyên dụng riêng cho nó
Xử lý ảnh được đưa vào giảng dạy ở bậc đại học ở nước ta khoảng chục năm nay Nó là môn học liên quan đến nhiều lĩnh vực và cần nhiều kiến thức cơ sở khác Đầu tiên phải kể đến Xử lý tín hiệu số là một môn học hết sức cơ bản cho xử lý tín hiệu chung, các khái niệm về tích chập, các biến đổi Fourier, biến đổi Laplace, các bộ lọc hữu hạn… Thứ hai, các công cụ toán như Đại số tuyến tính, Sác xuất, thống kê Một số kiến thứ cần thiết như Trí tuệ nhân tao, Mạng nơ ron nhân tạo cũng được đề cập trong quá trình phân tích và nhận dạng ảnh
Các phương pháp xử lý ảnh bắt đầu từ các ứng dụng chính: nâng caochất lượng ảnh và phân tích ảnh Ứng dụng đầu tiên được biết đến là nâng cao chất lượng ảnh báo được truyền qua cáp từ Luân đôn đến New York từ những năm 1920 Vấn đề nâng cao chất lượng ảnh có liên quan tới phân bố mức sáng và độ phân giải của ảnh Việc nâng cao chất lượng ảnh được pháttriển vào khoảng những năm 1955 Điều này có thể giải thích được vì sau thế chiến thứ hai, máy tính phát triển nhanh tạo điều kiện cho quá trình xử
lý ảnh sô thuận lợi Năm 1964, máy tính đã có khả năng xử lý và nâng cao chất lượng ảnh từ mặt trăng và vệ tinh Ranger 7 của Mỹ bao gồm: làm nổi đường biên, lưu ảnh Từ năm 1964 đến nay, các phương tiện xử lý, nâng cao chất lượng, nhận dạng ảnh phát triển không ngừng Các phương pháp tri thức nhân tạo như mạng nơ ron nhân tạo, các thuật toán xử lý hiện đại vàcải tiến, các công cụ nén ảnh ngày càng được áp dụng rộng rãi và thu nhiềukết quả khả quan
Để dễ tưởng tượng, xét các bước cần thiết trong xử lý ảnh Đầu tiên, ảnh tựnhiên từ thế giới ngoài được thu nhận qua các thiết bị thu (như Camera, máy chụp ảnh) Trước đây, ảnh thu qua Camera là các ảnh tương tự (loại Camera ống kiểu CCIR) Gần đây, với sự phát triển của công nghệ, ảnh màu hoặc đen trắng được lấy ra từ Camera, sau đó nó được chuyển trực tiếp thành ảnh số tạo thuận lợi cho xử lý tiếp theo (Máy ảnh số hiện nay là một thí dụ gần gũi) Mặt khác, ảnh cũng có thể tiếp nhận từ vệ tinh; có thể quét từ ảnh chụp bằng máy quét ảnh Hình 1.1 dưới đây mô tả các bước cơ bản trong xử lý
Trang 51.2.Một số phép xử lý ảnh
1.2.1.Biến đổi ảnh xám(Grayscale convert)
Biến đổi ảnh xám là quá trình chuyển từ ảnh màu vể ảnh xám
Trong xử lý ảnh, việc chuyển đổi ảnh màu sang ảnh xám là công việc vô cùng phổ biến
Ảnh màu thực chất chỉ là tập hợp của những ma trận số có cùng kích thước Khi muốn xử lý thông tin trên ảnh, sẽ dễ dàng hơn nếu ta chỉ xử lý
dữ liệu trên một ma trận số thay vì nhiều ma trận số Việc biến đổi ảnh màu
về ảnh số (Grayscale converting) xuất hiện vì mục đích trên - biến đổi thông tin ảnh về một ma trận số hai chiều duy nhất
Trang 6Giả sử, hình ảnh của bạn được lưu trữ dưới dạng RGB (Red-Green-Blue).Điều này có nghĩa bạn có ba ma trận xám tương ứng cho màu Red, Green,Blue Công việc của bạn là tìm cách tổng hợp ba ma trận này về thành một
ma trận duy nhất Một trong số các công thức phổ biến để thực hiện việc đólà
Nếu bạn chưa quen về việc thực hiện phép toán trên ma trận, hãy hình dung
Y, R, G, B là giá trị mức xám trên các ô có tọa độ giống nhau
1.2.2.Biến đổi ảnh đen trắng
Từ ảnh xám, bạn có thể biến đổi về thành ảnh chỉ có hai màu đen-trắng (black-and-white)
Ảnh đen trắng thường được ứng dụng trong bài toán phân vùng ảnh (Imagesegmentation) Giả sử trong hình ví dụ trên, bằng cách biến đổi ảnh về nhị phân, bạn có thể loại bỏ các thông khung cảnh xung quanh và chỉ giữ lại hai con cá heo trên hình
Trang 7Ảnh đen trắng, như tên gọi, chỉ có hai màu đen với giá trị là 0 và trắng với giá trị 255 Bài toán đặt ra là làm thế nào để biến đổi ảnh xám (hay nói cáchkhác là một ma trận 2 chiều với giá trị mỗi ô trong khoảng 0-255) về thành một ma trận 2 chiều với giá trị mỗi ô là 0 hoặc 255.
Cách giải quyết là chọn một ngưỡng (threshold) để xác định đâu là điểm ảnh đen và đâu là điểm ảnh trắng Nếu giá trị trên ảnh xám lớn hơn ngưỡngthreshold, đấy là điểm ảnh trắng và ngược lại
Gọi ảnh xám là Gray, ảnh đen trắng cần xác định là BW, tọa độ các pixel trên hình là (x,y), ta có
- BW(x,y) = 255 nếu Gray(x,y) > threshold
- BW(x,y) = 0 nếu Gray(x,y) <= threshold
1.2.3.Biểu đồ phân bố tần số (Histogram)
• Biểu đồ phân bố tần số (Biểu đồ phân bố mật độ, biểu đồ cột) dùng để đo tần số xuất hiện của một vấn đề nào đó, cho ta thấy rõ hình ảnh sự thay đổi,biến động của một tập dữ liệu Đây là một khái niệm rất phổ biến, được sử dụng rộng rãi từ lĩnh vực kỹ thuật tới kinh tế
Trang 8• Trong xử lý ảnh, biểu đồ Histogram của một ảnh là biểu đồ mô tả sự phân
bố của các giá trị mức xám của các điểm ảnh (Pixel) trong một bức ảnh hoặc một vùng ảnh(Region)
• Trong một ảnh, giá trị của một điểm ảnh (Pixel) thường là từ 0-255
Phân tích
• Trục tung (Oy) biểu diễn số lượng điểm ảnh (Pixel) của mức xám
• Trục hoành (Ox) biểu diễn mức xám
• Giá trị lớn nhất của trục hoành chính là số lượng điểm ảnh (Pixel) có trong một bức ảnh
• Với ảnh màu như RGB thì có tới 3 biểu đồ Histogram thể hiện từng kênh màu
• Một biều đồ tốt à biểu đồ có số lượng điểm ảnh nhiều nhất ở vùng giữa (Độ sáng trung bình) và ít dần ra 2 vùng sáng tối (Ngọn núi)
Tác dụng
• Dựa vào biều đồ Histogram mà bạn có thể biết được hình ảnh sáng tối như thế nào
• Áp dụng cho các xử lý ảnh cao cấp khác
Trang 91.2.4.Tăng tương phản
Ảnh số là tập hợp các điểm mỗi điểm có giá trị độ sáng khác nhau Ở đây
độ sáng để mắt người dễ cảm nhận ảnh song không phải quyết định Thực
tế chỉ ra rằng 2 đối tượng có cùng độ sáng nhưng đặt trên 2 nền khác nhau
sẽ cho cảm nhận khác nhau Như vậy độ tương phản biểu diễn sự thay đổi
độ sáng của đối tượng so với nền Nói 1 cách khác, độ tương phản là độ nổicủa điểm ảnh hay vùng ảnh so với nền Như vậy , nếu ảnh có độ tươngphản kém ta có thể tùy chỉnh theo ý muốn
Ảnh có độ tương phản kém là do điều kiện ánh sáng không đủ hay khôngđều hoặc do tính không tuyến tính hay biến động nhỏ của bộ cảm nhậnảnh , cần điều chỉnh lại biên độ trên toàn dải hay trên dải có giới hạn bằngcách đổi tuyến tính biên độ đầu vào (dùng hàm biến đổi tuyến tính ) hayphi tuyến (hàm mũ hay hàm logarit ).Khi dùng hàm tuyến tính các độ dốc
phải chọn lớn hơn 1 trong các miền cần co dãn.Các tham số a và b(các cận ) có thể chọn khi xem xét lược đồ xám của ảnh
Trang 10Dãn độ tương phản
1.2.5.Khử nhiễu
Tách nhiễu là trường hợp đặc biệt của dãn độ tương phản khi hệ số góc
Tách nhiễu được ứng dụng có hiệu quả để giảm nhiễu khi biết tín
hiệu vào trên khoảng [a,b]
Phân ngưỡng là trường hợp đặc biệt của tách nhiễu khi a=b=const.Trongtrường hợp này ảnh đầu vào ảnh nhị phân (có 2 mức ).Phân ngưỡngthường dùng trong kỹ thuật in ảnh 2 màu vì ảnh gần nhị phân không choảnh nhị phân khi quét ảnh do có nhiễu từ bộ cảm biến và biến đổi của nền
ví dụ trường hợp lọc nhiễu của ảnh vân tay
Trang 11Khử nhiễu
1.2.6.Co giãn ảnh
A,Giãn ảnh
Giãn ảnh nhằm mục đích loại bỏ điểm đen vây bởi các điểm trắng Trong
kỹ thuật này , một cửa sổ (N+1)x(N+1) được rê đi khắp ảnh và thực hiện đối sánh 1 pixel của ảnh với (N+1)2-1 điểm lân cận (không tính điểm ở tâm).Phép đối sánh được thực hiện bởi phép tuyển logic Thuật toán biến đổi được tóm tắt như sau:
B,Co ảnh
Co ảnh là thao tác đối ngẫu ảnh nhằm loại bỏ điểm trắng bị vây bởi các điểm đen Trong kỹ thuật này , một cửa sổ (N+1)2 được rê đi khắp ảnh và thực hiện so sánh pixel của ảnh (N+1)2-1 điểm lân cận Việc so sánh ở đâyđược thực hiện bởi phép hội logic
Kỹ thuật này thường được áp dụng cho ảnh nhị phân như vân tay ,chữ viết.Để không làm ảnh hưởng đến kích thước đối tượng trong ảnh ngưởì ta tiếnhành n lần dãn là n lần co
1.2.7.Xoay ảnh
Xoay ảnh là toán tử xoay vòng thực hiện phép biến đổi hình học để ánh xạ vị trí của một phần tử hình ảnh trong một hình ảnh đầu vào vào một vị trí trong một hình ảnh đầu ra bằng cách xoay nó qua góc
do người dùng chỉ định về nguồn gốc Trong hầu hết các triển khai, các
Trang 12vị trí đầu ra nằm ngoài ranh giới của hình ảnh sẽ bị bỏ qua Xoay được sử dụng phổ biến nhất để cải thiện hình ảnh trực quan của một hình ảnh, mặc dù nó có thể hữu ích như một bộ tiền xử lý trong các ứng dụng
mà các toán tử định hướng có liên quan Rotation là một trường hợp đặc biệt của sự biến đổi affine
Toán tử xoay vòng thực hiện phép biến đổi của biểu mẫu:
nơi là tọa độ của trung tâm luân chuyển (trong hình ảnh đầu vào)
và là góc quay với phép quay chiều kim đồng hồ có góc dương (Lưu ý ở đây rằng chúng ta đang làm việc trong tọa độ hình ảnh, do đó trục y đi xuống Công thức xoay tương tự có thể được định nghĩa khi trục y đi lên.) Thậm chí nhiều hơn toán tử dịch , thao tác xoay tạo ra các vị trí đầu
ra không phù hợp trong ranh giới của hình ảnh (được xác định bởi kích thước của hình ảnh đầu vào gốc) Trong những trường hợp như vậy, các phần tử đích đã được ánh xạ bên ngoài hình ảnh bị bỏ qua bởi hầu hết các triển khai Các vị trí pixel trong đó một hình ảnh đã được xoay thường được lấp đầy bằng các pixel đen
Thuật toán xoay, không giống như thuật toán được sử dụng bởi bản dịch ,
có thể tạo ra các tọa độ không phải là số nguyên Để tạo ra cường
độ của các điểm ảnh ở từng vị trí số nguyên, các phương pháp chẩn đoán
khác nhau (hoặc các kỹ thuật lấy mẫu lại ) có thể được sử dụng, ví dụ, hai
phương pháp phổ biến bao gồm:
• Cho phép mức độ cường độ tại mỗi vị trí pixel nguyên để giả định giá trị của hàng xóm không phải số nguyên gần nhất
• Tính mức độ cường độ tại mỗi vị trí pixel nguyên dựa trên mức trung bình
có trọng số của n giá trị không phải nguyên gần nhất Trọng số tỷ lệ thuận
với khoảng cách hoặc pixel chồng chéo của các phép chiếu gần đó
Phương pháp thứ hai tạo ra kết quả tốt hơn nhưng làm tăng thời gian tính toán của thuật toán
Trang 131.2.8.Dò Biên
Điểm biên Là 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) Ví dụ trong ảnh nhị phân ,điểm đen gọi là điểm biên nếu điểm lân cân nó có ít nhất một điểm trắng Đường biên (đường bao ): tập hợp các điểm biên liên tiếp tạo thành một đường biên hay đường bao
Ý nghĩa của đường biên trong xử lý ảnh :đường biên là một loại đặc trưngcục bộ tiêu biểu trong phân tích , nhận dạng ảnh Người ta sử dụng biên làm phân tách các vùng xám (màu) cách biệt Ngược lại người ta sử dụng các vùng ảnh để tìm đường phân cách
Các kỹ thuật phát hiện biên chia làm 2 loại :
a.Phương pháp phát hiện biên trực tiếp : phương pháp này chủ yếu dựa vào
sự biến thiên độ sáng của điểm ảnh để làm nổi biên bằng kỹ thuật đạo hàm + Nếu lấy đạo hàm bậc nhất của ảnh: ta có phương pháp Gradient
+Nếu lấy đạo hàm bậc hai: ta có phương pháp Laplace
2 phương pháp này gọi là dò biên cục bộ
Ngoài ra người ta còn sử dụng phương pháp “ đi theo đường bao ” dựa vào công cụ toán học là nguyên lý quy hoạch động và đường gọi là phương pháp dò biên tổng thể Phương pháp dò biên trực tiếp có hiệu quả và ít bị tác động của nhiễu
Trang 14b.Phương pháp phát hiện biên gián tiếp : Việc xác định biên của ảnh được thực hiện từ ảnh đã phân vùng Phương pháp dò biên gián tiếp khó cài đặt nhưng áp dụng tốt khi sự biến thiên độ sáng nhỏ
1.2.9.Tìm xương đối tượng trong ảnh (Skeletons).
Tìm khung xương cũng tương tự như làm mảnh, nhưng nó được
dùng để tìm ra các chi tiết cấu trúc của đối tượng Khung xương của
đối tượng là tập hợp các điểm ảnh cách đều biên của đối tượng Và
có thể biểu diễn bằng phép co nhị phân và phép mở ảnh
Xét A là một ảnh nhị phân bao gồm các điểm ảnh thuộc đối
tượng, được đặt nhãn là các số 1 Các điểm ảnh không thuộc đối
tượng được đặt nhãn là các số 0 B là phần tử cấu trúc 3x3 Khi đó,
nếu ký hiệu S(A) là khung xương của tập hợp A thì thuật toán tìm
khung xương được xác định qua công thức:
Công thức (1.1) và (1.2) khẳng định rằng khung xương S(A) có
thể nhận được từ hợp các bộ khung xương con Sk(A) Có thể chứng
Trang 15minh rằng A có thể xây dựng lại từ các tập con này bằng cách sửdụng công thức:
Trong đó ký hiệu k lần giãn nhị phân Sk(A), tức là:
Trang 16Mô hình Raster thuận lợi cho hiển thị và in ấn Ngày nay công nghệ phần cứng cung cấp những thiết bị thu nhận ảnh Raster phù hợp với tốc độ
nhanh và chất lượng cao cho cả đầu vào và đầu ra Một thuận lợi cho việc hiển thị trong môi trường Windows là Microsoft đưa ra khuôn dạng ảnh DIB (Device Independent Bitmap) làm trung gian Hình 1.4 thể hình quy trình chung để hiển thị ảnh Raster thông qua DIB
Một trong những hướng nghiên cứu cơ bản trên mô hình biểu diễn này là kỹ thuật nén ảnh các kỹ thuật nén ảnh lại chia ra theo 2 khuynh hướng là nén bảo toàn và không bảo toàn thông tin nén bảo toàn có khả năng phục hồi hoàn toàn dữ liệu ban đầu còn nếu không bảo toàn chỉ có khả năng phục hồi độ sai số cho phép nào đó Theo cách tiếp cận này người
ta đã đề ra nhiều quy cách khác nhau như BMP, TIF, GIF, PCX… Hiện nay trên thế giới có trên 50 khuôn dạng ảnh thông dụng bao gồm cả trong đó các kỹ thuật nén có khả năng phục hồi dữ liệu 100% và nén có khả năng phục hồi với độ sai số nhận được
Quá trình hiển thị và chỉnh sửa , lưu trữ ảnh thông qua DIB 1.3.2.Mô hình Vector
Biểu diễn ảnh ngoài mục đích tiết kiệm không gian lưu trữ dễ dàng cho hiển thị và in ấn còn đảm bảo dễ dàng trong lựa chọn sao chép di chuyển tìm kiếm… Theo những yêu cầu này kỹ thuật biểu diễn vector tỏ ra
ưu việt hơn
Trong mô hình vector người ta sử dụng hướng giữa các vector của điểm ảnh lân cận để mã hoá và tái tạo hình ảnh ban đầu ảnh vector được thu nhận trực tiếp từ các thiết bị số hoá như Digital hoặc được chuyển đổi
từ ảnh Raster thông qua các chương trình số hoá
Công nghệ phần cứng cung cấp những thiết bị xử lý với tốc độ nhanh
và chất lượng cho cả đầu vào và ra nhưng lại chỉ hỗ trợ cho ảnh Raster
Trang 17Do vậy, những nghiên cứu về biểu diễn vectơ đều tập trung từ
chuyển đổi từ ảnh Raster
Sự chuyển đổi giữa các mô hình biểu diễn ảnh
CHƯƠNG 2: Xử Lý Ảnh Với OpenCV
2.1.OpenCV
OpenCV là gì:
OpenCV [OpenCV] là open source (xem http://opensource.org)
computer vision library có sẵn ở
http://SourceForge.net/projects/opencvlibrary Thư viện này được viết
trong C và C++ và chạy dưới Linux, Windows và Mac OS X Có phát triển tích cực trên các giao diện cho Python, Ruby, Matlab, và các ngôn ngữ khác
OpenCV được thiết kế cho hiệu quả tính toán và với tập trung mạnh cho các ứng dụng thời gian thực OpenCV được viết trong optimized C và có thể có các thuận lợi của các multicore processor Nếu bạn quan tâm tối ưu
tự động xa hơn trên kiến trúc Intel [Intel], bạn có thể mua các thư viện Integrated Performance Primitives (IPP) [IPP] của Intel, mà gồm các hàm tối ưu mức thấp trong nhiều lĩnh vực thuật toán khác nhau OpenCV tự động dùng IPP library thích hợp lúc chạy nếu thư viện được cài
Một trong các mục đích của OpenCV là cung cấp một hạ tâng đơn giản đủ dùng về computer vision mà giúp mọi người dựng các ứng dụng vision phức tạp một cách nhanh chóng OpenCV
library chứa trên 500 hàm mà trải ra nhiều lĩnh vực trong vision, gồm factory product inspection, medical imaging, security, user interface,
camera calibration, stereo vision, và robotics Vì computer vision và
Trang 18machine learning thường đi chung, OpenCV cũng chứa Machine Learning Library (MLL) đa mục đích chung.
Thư viện phụ này dc giới hạn về nhận diện mẫu thống kê và clustering MLL là cực kỳ hữu ích cho các nhiệm vụ vision mà ở lõi của nhiệm vụ của OpenCV, nhưng nhìn chung nó được dùng cho bất kỳ vấn đề machine learning
Nguồn Gốc Của OpenCV( The Origin of OpenCV)
OpenCV phát triển từ một nghiên cứu Intel khởi xướng cho các ứng dụng tận dụng CPU cao cấp Hướng đến kết thúc này, Intel khai trương nhiều projects gồm real-time ray tracing và 3D display walls Một trong các tác giả làm việc cho Intel ở thời điểm đó đang thăm các trường đại học và thông báo rằng vài nhóm đại học đỉnh, chẳng hạn MIT Media Lab, có các
hạ tầng computer vision phát triển và mở nội bộ Thay vì khám phá lại các hàm cơ sở từ đầu, sinh viên mới có thể bắt đầu dựng ở đỉnh trên cơ sở những những cái đã có
Do đó, OpenCV được hiểu như một cách làm hạ tầng computer vision sẵn
có Với hỗ trợ của Intel’s Performance Library Team,* OpenCV bắt đầu vớilõi của các tiên chuẩn mã và thuật toán được thực hiện được gửi đến các thành viên của Intel’s Russian library team Đây là “nơi” của OpenCV: nó bắt đầu trong phòng thí nghiệm của Intel với công tác từ Soft ware
Performance Libraries group cùng nhau thực hiện và kinh nghiệm tối ưu ở Russia
Chủ chốt trong Russian team members là Vadim Pisarevsky, người quản lý,
mã, và tối ưu nhiều trong OpenCV và người vẫn ở trung tâm của nhiều trong nỗ lực OpenCV Cùng với anh, Victor Eruhimov hỗ trợ phát triển cấu trúc ban đầu, và Valery Kuriakin điều hành Russian lab và hỗ trợ lớn cho
nỗ lực này Có vài mục đích cho OpenCV ở lúc bắt đầu:
• Nghiên cứu vision cao cấp bởi cung cấp không chỉ mở mà còn mã tối ưu cho kiến trúc vision cơ bản
• Phổ biến kiến thức vision bởi cung cấp hạ tầng chung mà các developer
có thể dựng, sao cho code sẽ dễ đọc và khả chuyển nhiều hơn
Trang 19• Các ứng dụng thương mại dựa trên vision cao cấp bởi mã khả chuyển, thực hiện tối ưu sẵn có miễn phí—với một bản quyền mà không đòi hỏi cácứng dụng thương mại là mở hay miễn phí.
Nhưng mục tiêu này tạo thành “lý do” của OpenCV Cho phép các ứng dụng computer vision gia tăng nhu cầu cho các processor nhanh Dẫn đến nâng cấp các processor nhanh hơn mà tạo ra nhu cầu cho Intel mà bán các extra software Đó là lý do mã mở và miễn phí nảy lền từ một hardware vendor hơn là một công ty software
Ai dùng OpenCV
Hầu hết nhà khoa học và lập trình viên thực nghiệm computer biết về vài khía cạnh của vai trò mà computer vision đóng Nhưng vài mọi người biết tất cả các cách mà computer vision được dùng Ví dụ, hầu hết mọi người biết gì đó về việc dùng của nó trong surveillance, và nhiều cũng biết rằng
nó đang được dùng rộng rãi cho ảnh và video trên Web Một vài đã thấy dùng một ít của computer vision trong các giao diện game Nhưng ít người người nhận ra hầu hết ảnh aerial và street-map (chẳng hạn trong Google’s Street View) sử dụng nhiều kỹ thuật hiệu chỉnh camera và image stitching Vài nhận biết các ứng dụng niche trong giám sát an toàn, các phương tiện bay unmanned, hay hay phân tích biomedical Nhưng ít người biết cách pervasive machine vision đã ở trong sản xuất: hầu như mọi thứ mà sản xuấthàng loạt đã tự động kiểm tra ở mm điểm dùng computer vision
Bản quyền open source cho OpenCV đã được cấu trúc mà bạn có thể dựng một sản phẩm thương mại dùng tất cả hay một phần OpenCV Bạn không
có nghĩa vụ phải opensource sản phẩm của bản hay return các cải tiến vào public domain, mà ta hy vọng bạn sẽ In part vì of những cái này liberal licensing terms, có cộng đồng lớn người dùng mà bao gồm mọi người từ các công ty lớn (IBM, Microsoft , Intel, SONY, Siemens, và Google, nêu tên chỉ một vài) và các trung tâm nghiên cứu (chẳng hạn Stanford, MIT, CMU, Cambridge, và INRIA) Có một Yahoo groups forum nơi người dùng
có thể gửi các câu hỏi và thảo luận ở
http://groups.yahoo.com/group/OpenCV; nó có khoảng 20,000 thành viên
OpenCV là phổ biến trên toàn thế giới, với các cộng đồng người dùng lớn ởChina, Japan, Russia, Europe, và Israel
Cài đặt OpenCV trên môi trường C++
Trang 20Bước 1: Giải nén thư viện vào thư mục được định sẵn Giả sử đường dẫn của mã nguồn là C:\opencv
Bước 2: Tải và cài đặt CMake Thư mục build chứa những tập tin của phần
mã nguồn được biên dịch sẵn Phần sources được sử dụng cho cài đặt manual
Bước 3: Mở CMake Trong phần Where is the source code sẽ trỏ đến thư mục sources đã đề cập lúc trước Phần Where to build the binaries là nơi chứa phần thư viện được biên dịch Trong ví dụ này đường dẫn
là C:\opencv\source\build
Trang 21Bước tiếp theo nhấn Configure, sau đó chọn bộ generator cho project, trongphần này sẽ chọn tương ứng với IDE/Compiler mà mã nguồn mình sử dụng Đồng thời, nếu máy tính đang ở kiến trúc x86 thì chọn các phiên bản IDE với tùy chọn là x86 (Ví dụ Visual Studio 14 2015) Đối với các máy tính kiến trúc x64 thì chọn phiên bản có hậu tố là Win64 Nhấn Finish để kết thúc cấu hình.
Sau khi configure xong thì danh sách các tùy chọn khi biên dịch để hiện ra với rất nhiều tùy biến đi kèm Phần này trong tutorial này sẽ bỏ qua vì mục tiêu chỉ cần cài đặt bộ thư viện ở mức mặc định là thành công rồi Nếu không có gì thay đổi ta nhấn chọn Generate
Sau khi quá trình phát sinh mã nguồn hoàn tất, trong thư mục build sẽ xuất hiện các Project/Solution khác nhau
Bước 4: Dùng Visual Studio để mở solution có tên là OPENCV Lưu ý: khi bản VS này phải trùng với bản VS đã configure trong cmake
Trang 22Quá trình biên dịch cần thực hiện qua 2 bước: (1) biên dịch thư viện cho quá trình Debug và (2) biên dịch chương trình trong quá trình Release Để thực hiện các bước này đơn giản chỉ cần click chọn Target sẽ build rồi sau
đó nhấn F7 và ngồi đợi (Mất khoàng 10-15 phút cho quá trình biên dịch trên Debug/Release) Kết quả trong quá trình biên dịch sẽ có khoảng 50 projects biên dịch thành công, 17 cái bị skip và 2 cái bị fail Sau khi biên dịch, ta sẽ có 2 thư mục cần quan tâm nằm trong build Đó là thư mục lib chứa toàn bộ dữ liệu cần thiết cho quá trình lập trình; thư mục là dữ liệu cần thiết để chương trình sau khi build có thể chạy được
Cấu hình Opencv trên Visual Studio
Bước 1: Tạo một Project (Empty Project)
Trang 23Trước khi thực hiện tiếp các công việc cấu hình cho project Ta cần xác định rõ sẽ cần cấu hình những thông tin gì:
1. Nơi chứa header file của OpenCV Dĩ nhiên ta cần làm điều này để
include các đối tượng, hàm… của OpenCV
2. Cấu hình các file cần thiết khi lập trình
3. Cấu hình các file cần thiết cho quá trình thực thi Bởi trong Visual Studio
có 2 target khi run bao gồm Debug và Release, nên ta cần phải cấu hình riêng biệt cho mỗi target đó
Cấu hình header file
Click chuột phải vào tên project (InstallOpencv) chọn Properties (Hoặc nhấn Alt + F7)
Trang 24Phía bên phần Sidebar chọn C/C++, General, mục Additional Include Directories ta trỏ đến thư mục opencv\build\include (không
phải sources\build\include) Để đảm bảo ta có thể check bằng cách kiểm traxem thư mục include đó có các header file không Xong nhấn OK
Cấu hình thư viện cho quá trình lập trình
Nhấn Alt + F7 để vào phần Properties của Project Chọn Thẻ Linker, mục Additional Library Directories ta trỏ đến thư mục lib\Debug (trong ví dụ này là: C:\oepncv\sources\build\lib\Debug) Vì đang cấu hình cho target là Debug nên phần Configuration phải là Debug
Trang 25Chuyển đến thẻ Input, mục Additional Dependencies ta nhập các file sau:
opencv_calib3d300.lib
Trang 26Cấu hình thư viện cho quá trình thực thi
Khi thực hiện build 1 chương trình, VS sẽ tạo ra trong thư mục của
Solution một thư mục với cấu trúc như sau: \Debug và \Release Trong ví
dụ này là x64\Debug, x64\Release Ta chép toàn bộ file trong
build\bin\Debug vào x64\Debug, tương tự như vậy đối với
build\bin\Release và x64\Release
Mốt số phép xử lý ảnh trong OpenCV
1.Biến đổi ảnh xám(Grayscale convert)
Cách 1: Đọc trực tiếp ảnh
Trang 27Trong đoạn code trên, việc chuyển đổi ảnh sang dạng xám ngay từ lúc đọcảnh vào bằng cách truyền thêm tham
số CV_LOAD_IMAGE_GRAYSCALE trong hàm imread Tham
số CV_LOAD_IMAGE_GRAYSCALEthực chất là số 0 nên bạn có thực hiện lệnh imread("img_sample.png", 0) với chức năng tương tự
Nếu muốn giữ nguyên việc đọc ảnh đầu vào là ảnh màu, bạn có thể sử dụngmột trong các lệnh sau
Lệnh cvtColor(source, dest, mode) cho phép bạn chuyển đổi ảnh
màu source sang ảnh xám và lưu vào dest với độ chuyển đổi màu
là mode CV_BGR2GRAY là chế độ cho phép chuyển từ ảnh màu lưu ở format BGR sang ảnh xám
Kết quả thực thi chương trình:
Trang 282.Biến đổi ảnh đen trắng(Black and White convert)
Sử dụng hàm threshold
Lệnh threshold(src, img, thres, max_value, type) dùng để biến đổi ảnh xám src về thành ảnh đen trắng và lưu vào dst Ngưỡng để xác định đen và trắng được truyền qua tham số thres Ngoài ra, bạn có thể định nghĩa lại màu sáng nhất thông qua max_value (ngưỡng trắng) Hàm thresholdhộ trợ một số loại biến đổi như sau:
-type = 0 Threshold Binary Biến đổi đen trắng giống định nghĩa phía trên
-type = 1 Threshold Binary, Inverted Biến đổi đen trắng ngược với định
Trang 29-type = 4 Threshold to Zero, Inverted Ngược lại với type = 3
Tùy vào ngưỡng threshold, chúng ta sẽ có kết quả hình khác nhau
Sử dụng hàm adaptiveThreshold
Như ở ví dụ trên, chúng ta có thể thấy kết quả phụ thuộc rất nhiều vào ngưỡng threshold Trong thực tế, đối với các chương trình xử lý ảnh real-time, việc sử dụng một threshold cố định là điều không khả thi do cường độsáng thay đổi liên tục Để khắc phục tình trạng này, chúng ta có thể sử dụnghàm adaptiveThreshold do OpenCV hỗ trợ
Trang 30Hàm adaptiveThreshold(src, dst, maxValue, adaptiveMethod,
thresholdType, blockSize, C)giúp biến đổi ảnh xám src về ảnh đen
trắng dst với ngưỡng sáng tối đa maxValue adaptiveThreshold hỗ trợ 2 phương pháp tự động chọn ngưỡng threshold
là ADAPTIVE_THRESH_MEAN_C và ADAPTIVE_THRESH_GAUSSIAN_C; cùng với 2 chế
độ thresholdType là THRESH_BINARY và THRESH_BINARY_INV Cáctham số blockSize và C dùng để chọn số lượng điểm lân cận để tính
ngưỡng threshold tốt nhất
3.Biểu đồ phân bố tần số (Histogram)
Trang 31Một số phương thức cơ bản
• calcHist(): tính toán hình dạng của biểu đồ Histogram
• equalizeHist(): Bình thường hóa hình ảnh và độ tương phản
• compareHist(): So sánh hai biểu đồ Histograms
Trang 3218. float range[] = { 0, 255 };
19. const float* histogramRange = { range };
20.
21. calcHist(&imageSrc, 1, 0, Mat(), imageGrayscale, 1, &sizeHistogram,
&histogramRange, true, false);
29. for (int i = 0; i < 255; i++) {
30. line(dispHistogram,Point(bin*(i), height), Point(bin*(i), height - cvRound(imageGrayscale.at<float>(i))), Scalar(0, 0, 0), 2, 8, 0);
Trang 335. // Khởi tạo các biến lưu trữ 3 kênh màu
6. Mat imageRed, imageGreen, imageBlue;
7.
8. int width = 250, height = 250;
9. int sizeHistogram = 255;
10. float range[] = { 0, 255 };
Trang 3411. const float* histogramRange = { range };
12.
13. // Hàm này có tác dụng tách imageSrc thành 3 kênh màu
14. split(imageSrc, imageRGB);
15.
16. // Tính toán cho từng kênh màu và vẽ biểu đồ Histogram
17. calcHist(&imageRGB[0], 1,0,Mat(), imageRed, 1, &sizeHistogram,
&histogramRange, true, false);
18. calcHist(&imageRGB[1], 1,0,Mat(), imageGreen, 1, &sizeHistogram,
&histogramRange, true, false);
19. calcHist(&imageRGB[2], 1,0,Mat(), imageBlue, 1, &sizeHistogram,
&histogramRange, true, false);
20.
21. int bin = cvRound((double)width / sizeHistogram);
22.
23. Mat dispRed(width, height, CV_8UC3, Scalar(255, 255, 255));
24. Mat dispGreen = dispRed.clone();
25. Mat dispBlue = dispRed.clone();
Trang 3531. for (int i = 0; i < 255; i++) {
32. line(dispRed, Point(bin*(i), height), Point(bin*(i), height - cvRound(imageRed.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0);
33. line(dispGreen, Point(bin*(i), height), Point(bin*(i), height - cvRound(imageGreen.at<float>(i))), Scalar(0,255,0), 2,8,0);
34. line(dispBlue, Point(bin*(i), height), Point(bin*(i), height - cvRound(imageBlue.at<float>(i))), Scalar(255,0,0), 2,8,0);
35. }
36.
37. namedWindow("src", 0);
38. imshow("STDIO OpenCV Sample", imageSrc);
39. imshow("H blue", dispBlue);
40. imshow("H green", dispGreen);
41. imshow("H red", dispRed);
Trang 36Cân bằng Histograms
Cân bằng Histogram (Histogram equalization) là phương pháp làm cho biểu đồ Histogram của ảnh được phân bố một cách đồng đều Đây là một cách giúp nâng cao chất lượng hình ảnh Để cân bằng ta dùng phương thức equalizeHist()
Cân bằng histogram cho ảnh xám
1. Mat imageSrc = imread("carStdio.png", CV_LOAD_IMAGE_SCALE);
Trang 37Cân bằng histogram cho ảnh màu
Để cân bằng Histogram cho một tấm ảnh màu, trước hết cần phải chuyển ảnh màu ở dạng RGB sang HSV, sau đó cân bằng thành phần kênh màu V(Value mức độ sáng) và sau đó chuyển đổi ngược lại
1. Mat imageSrc = imread("carStdio.png", CV_LOAD_IMAGE_COLOR);
2. Mat imageHsv, imageDst;
Trang 39Đây là một cách khởi tạo đơn giản với kiểu dữ liệu cv::Mat Bản chất của cv::Mat là một ma trận.Ví dụ này giống như cấu trúc một ảnh có không gian màu RGB
• Hai tham số đầu tiên là kích thước của ma trận lần lượt là hàng (Rows) =
2 và cột (Colums) = 3 của Example
• CV_8UC3: Với mỗi điểm trên cv::Mat Example được lưu trữ dưới dạng: Loại usigned char (0-255) có 8 bit và có 3 kênh
1. CV_[Số bit cho mỗi kênh của điểm][Signed hoặc Unsigned][Kiểu dữ liệu]C[Số lượng kênh]
• Scalar(1, 2, 3): Với mỗi điểm trên Mat Example được khởi tạo các giá trị
1, 2 và 3 tương ứng với các kênh 1, kênh 2 và kênh 3
Để có thể truy cập giá trị điểm ảnh(Pixel) với những kênh màu, bạn sử dụng mẫu sau:
1. image.at<cv::Vec3b>(row, col)[channel]
• row: Là hàng thứ row trong image
• col: Là cột thứ col trong image
Trang 40• channel: Là kênh màu của image Ví dụ: với không gian màu R-G-B, channel có giá trị lần lượt là channel = 1, channel = 2=, channel = 3 Trong OpenCV kênh màu của không gian R-G-B được xếp theo thứ tự là B-G-R.
Để thay đổi độ sáng, độ tương phản của một tấm ảnh, bạn sử dụng công thức sau:
1. G(x,y) = A*F(x, y) + B
Phân tích
• F(x, y): là giá trị pixel trong ảnh chưa được xử lý ở vị trí (x, y)
• G(x, y): là giá trị pixel trong ảnh đã được xử lý ở vị trí (x, y)
• A: Là giá trị đặc trưng cho chênh lệch độ tương phản của G(x, y) và F(x, y) Hay nói một cách khác chính là: Ảnh G tương phản gấp A lần với ảnh F
• B: Với B#0, ảnh G có độ sáng thay đổi một lượng là B