[Đồ án] Ung dung xu ly anh trong thuc te voi thu vien OpenCV - TG.Nguyễn Văn Long

UN
Uni24h
0 次下载
103
0

资料内容

第 1 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Ứng dụng xử lý ảnh trong thực thế với thư viện OpenCV C/C++ Nguyễn Văn Long long.06clc@gmail.com Nguyễn Văn Long Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 1

第 2 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Mở đầu Xử lý ảnh và thị giác máy là lĩnh vực mà ngày nay được phát triển và ứng dụng rất rộng rãi trong nhiều lĩnh vực khác nhau nhờ vào sự phát triển ngày càng mạnh mẽ của các hệ thống máy tính, các thuật toán và công trình nghiên cứu khác nhau của nhiều nhà khoa học trên thế giới. Ở Việt Nam, các ứng dụng về xử ảnh đã bước đầu được triển khai trên một số lĩnh vực như lắp đặt hệ thống nhận dạng biển biển số xe ở các bãi đổ xe, hệ thống nhận dạng vân tay chấm công ở các công sở … môn học xử lý ảnh ở các trường đại học được xem là môn học bắt buộc ở một số ngành như công nghệ thông tin, điện tử viễn thông …Tuy nhiên nhìn một cách khách quan thì số lượng các ứng dụng được triển khai trên thực tế là quá ít ỏi, lĩnh vực này sẽ còn phát triển mạnh mẽ trong tương lai nếu như được quan tâm một cách nghiêm túc. Xuất phát từ thực tế rằng môn học xử lý ảnh ở các trường đại học là một môn học mang nặng tính học thuật, khô khan, các vấn đề được mô tả dưới dạng toán học, sinh viên nắm bắt môn học một cách chung chung mà không đi vào bản chất vấn đề, ứng dụng thực tiễn của môn học, thêm vào đó số lượng tài liệu về chuyên ngành này bằng tiếng Việt là không nhiều, bằng quá trình nghiên cứu nghiêm túc, kinh nghiệm thực tế tác giả đã cố gắng cho ra đời cuốn sách Ứng dụng xử lý ảnh trong thưc tế với thư viện OpenCV. Cuốn đề cập tới một số phần của lĩnh vực xử lý ảnh và thị giác máy, thông qua sự diễn giải trực quan, không xa vào những công thức toán học trừu tượng, phức tạp nhưng vẫn làm nổi bật nên được vấn đề, giúp người đọc có được cái nhìn tổng quát, hiểu được khái niệm và hơn nữa biết được những vấn đề đó ứng dụng vào thực tế như thế nào. Các chủ đề trong cuôn sách này đều đi kèm với một chương trình mô phỏng được viết bằng ngôn ngữ C++ với sự giúp đỡ của thư viện OpenCV, một thư viện mã nguông mở được đánh giá là mạnh mẽ về tốc độ xử lý đáp ứng được các ứng dụng trong thời gian thực. Cuốn sách được chia thành bốn phần, phần đầu giới thiệu về thư viện OpenCV, phần thứ hai nói về một số vấn đề chọn lọc thường gặp trong xử lý ảnh như không gian màu, các bộ lọc, cách phát hiện đường thẳng đường tròn trong ảnh …, phần thứ ba nói về một số thủ thuật để lập trình với thư viện MFC và phần cuối cùng nói về một số ứng dụng thực tế như bài toán nhận dạng biển số xe … Cuốn sách không chỉ là tài liệu tham khảo bổ ích trong quá trình học tập của các bạn sinh viên, quá trình làm luNguyễn Văn Longận văn, đồ án … mà còn là công cụ tốt hỗ trợ cho việc triển khai các ứng dụng thương mại của các kĩ sư, doanh nghiệp và những người quan tâm tới lĩnh vực. Cuối cùng dù đã dành nhiều tâm huyết để hoàn thành cuốn sách nhưng chắc chắn cuốn sách vẫn còn nhiều sai xót, tác giả mong được sự góp ý của bạn đọc. Xin gửi lời chúc tốt tốt đẹp và lời cảm ơn sâu sắc tới độc giả Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 2

第 3 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Hướng dẫn sử dụng sách Cuốn sách được viết dựa trên những nghiên cứu và quá trình làm việc thực tế của tác giả, với mỗi vấn đề nêu trong sách bạn đọc có thể đọc qua để nắm bắt được ý tưởng chính, sau đó có thể tìm thêm tài liệu để nâng cao hơn vấn đề và có thể thực hành dựa vào mẫu chương trình, source code đi kèm. Thư viện OpenCV được viết trong sách là bản OpenCV 2.4.3, đối với các bản OpenCV khác thì bạn đọc có thể tùy chỉnh lại một chút tuy nhiên về bản chất của vấn đề là tương đối giống nhau. Ngôn ngữ lập trình cho các ví dụ là C/C++, IDE sử dụng là Visual Studio 2010. Tuy nhiên đa số chương trình trong cuốn sách này đều được tách biệt phần xử lý chính ra vào một file *.cpp nào đó nên ta có thể lấy nó để áp dụng vào các trình dịch khác. Có 10 chủ đề chính bao quát một số khía cạnh của lĩnh vực xử lý ảnh được viết khá chi tiết và giải thích đầy đủ, 3 project được tác giả mô tả chung chung hơn. Do đó bạn đọc nếu chưa thực sự quen với thư viện OpenCV nên đọc theo thứ tự từ đầu tới cuối Trong cuốn sách có nhiều vấn đề liên quan tới kĩ thuật lập trình nhưng do phạm vi giới hạn, tác giả chỉ có thể nói qua được một số khía cạnh, trên thực tế có nhiều cách khác nhau để giải quyết cùng một công việc, với những vấn đề lập trình bạn đọc chưa rõ có thể tham khảo thêm tài ở các nguồn khác nhau hoặc giải quyết theo hướng mà bạn đọc cảm thấy là thỏa đáng nhất Nguyễn Văn Long Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 3

第 4 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Mục Lục Chương I. Làm quen với thư viện OpenCV 1. Giới thiệu về thư viện OpenCV 5 2. Phiên bản OpenCV 1 hay OpenCV 2 5 3. Hướng dẫn sử dụng OpenCV trên Window 6 Chương II. Các phép xử lý đơn giản trong OpenCV 1. Chương trình đầu tiên 12 2. Không gian màu, chuyển đổi không gian màu 13 3. Điều chỉnh độ sang, độ tương phản 17 4. Ảnh nhị phân, nhị phân hóa với ngưỡng động 19 5. Histogram, cân bằng histogram 23 6. Phóng to, thu nhỏ, xoay ảnh 27 7. Lọc số trong ảnh 30 8. Các phép toán hình thái học trong ảnh 37 9. Tìm biên ảnh với bộ lọc Canny 43 10.Chuyển đổi Hough, Phát hiện đường thẳng, đường tròn trong ảnh 46 Chương III. Lập trình xử lý ảnh với giao diện MFC 1. Giới thiệu về MFC 51 2. Khởi tạo project MFC 51 3. Làm việc với các điều khiển (Control) 54 4. Chuyển đổi các kiểu dữ liệu trong MFC 59 5. Chương trình tải ảnh và hiển thị ảnh lên giao diện MFC 61 Chương IV. Một số ứng dụng trong thực tế 1. My Photo Editor, phần mềm chỉnh sửa ảnh đơn giản 64 2. Nhận dạng biển số xe 73 3. MyCam, một số hiệu ứng ảnh trong video 90 Nguyễn Văn Long Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 4

第 5 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Chương I. Làm quen với thư viện OpenCV 1. Giới thiệu về thư viện OpenCV OpenCV (Open Source Computer Vision) là một thư viện mã nguồn mở về thị giác máy với hơn 500 hàm và hơn 2500 các thuật toán đã được tối ưu về xử lý ảnh, 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 dòng 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-patform), 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 do đó bạn có thể sử dụng thư viện này một cách miễn phí cho cả mục đích phi thương mại lẫn 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ở 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. 2. Phiên bản OpenCV 1 hay OpenCV 2? 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 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). Sau đây ta sẽ chỉ ra một số điểm khác biệt cơ bản giữa hai phiên bản này. - 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 khi thư OpenCV 2.x dựa trên giao diện C++, cấu trúc của ảnh số, ma trận dựa trên cấu trúc của cv::Mat. Nguyễn Văn Long- Trong OpenCV 1.xtưphóng nó khi không còn snhtrởợớng, nghnên dnếu không chú ý đễ dàng hơn nhĩa là khi m, ngưềộờu này), trong khit đờcác hàm hửi sối tưdửụng ndợụng mng phữủa (trong nhiy các các lớải đưthư vii hoàn toàn quợc tệớn OpenCV 2.x viềạp đu trưo ra, ta phối tường hảợn lý bng trong OpenCV 2.x đợảp có thi luôn chú ý độệnhc quểớsảcẽn lý bủba các đị tràn bểộ nhgiốảớộãii thực hiện điều này khi một đối tượng không còn được sử dụng nữa. Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 5

第 6 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV - 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 1.x thực hiện như sau: // Phát hiện đường tròn trong ảnh OpenCV 1.x IplImage* src = cvLoadImage(“image.jpg”); IplImage* gray = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); cvCvtColor(src, gray, CV_BGR2GRAY); cvCanny(gray, gray, 10, 30, 3); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, 50, 100, 50); Trong khi đó, OpenCV 2.x thực hiện như sau: // Phát hiện đường tròn trong ảnh OpenCV 1.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); Ta thấy rằng đố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 1.x tuy chứa một lượng lớn hàm xử lý và thuật toán, tuy nhiên nó vẫn ở dạng sơ khai. Thư viện OpenCV 2.x đã được bổ xung khá nhiều hàm, thuật toán 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). Hơn thế nữa, tuy có giao diện là C++ nhưng OpenCV 2.x vẫn dữ một phần giao diện C để tương thích với các phiên bản của OpenCV 1.x … Từ một số đặc điểm trên ta có thể thấy rằng thư viện OpenCV phiên bản 2.x là có nhiều đithcòn giá trcho OpenCV phiên bNguyễn Văn Longểốm nng nhúng khổi trị. Trong cuội hơn so vi mà trình dốản 2.x trên nn sách này, các nới phiên bịch chảỉền 1.x, Tuy nhiên trong mn tđơn thuảng hội dung cài đầện chđiều hành Window.ấp nhặật, thun ngôn ngộật st toán,ốữtrưC thì phiứờng dng hụợng … chp nhưển bản 1.x vở các hỉ dànhẫnệ 3. Hướng dẫn sử dụng thư viện OpenCV trên Window Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 6

第 7 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Trước hết ta cần download thư viện OpenCV về máy tính, tốt hơn là luôn download bản mới nhất tại địa chỉ http://sourceforge.net/projects/opencvlibrary/ . Chọn bản đã build sẵn phù hợp với hệ điều hành đang dùng, bản OpenCV được sử dụng trong cuốn sách này là bản 2.4.3 với lần update cuối cùng là vào ngày 25 tháng 12 năm 2012. Sau khi download về máy, tiến hành cài đặt bình thường, ta để mặc định thư mục cài đặt là C:\ thư mục cài đặt xong sẽ có dạng C:\opencv. Tiếp theo ta sẽ tiến hành tùy chỉnh để có thể làm việc với OpenCV qua hai IDE thông dụng là Microsoft Visual Studio và Eclipse CDT Trên Microsoft Visual Studio Phiên bản Visual studio sử dụng ở đây là phiên bản Visual Studio 2010, các phiên bản trước ta hoàn toàn có thể cấu hình một cách tương tự. Tạo một project mới: New > Project, trong cửa sổ New Project chọn Visual C++, Win32 console application. Đặt tên project là opencv Chọn OK, sau đó nhấn Next, hộp thoại tiếp theo xuất hiện, ở hộp thoại này ta chọn Application type là Console application và Additional option là Empty project, nhấn Finish để kết thúc quá trình khởi tạo Nguyễn Văn Long Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 7

第 8 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Project mới được tạo ra là project hoàn toàn trống, ta phải thêm vào đó ít nhất một file nguồn để chương trình có thể chạy được, trong Solution Explorer ta click chuột phải vào Source Files, chọn Add -> New Item… Hộp thoại Add New Item hiện ra, ta chọn kiểu cần thêm vào là C++ File(.cpp) đồng thời trong ô Name ta đặt tên cho file thêm vào, giả sử là FirstApp.cpp. Bây giở trong file này ta có thể thêm vào các #include và gọi hàm main() để chạy chương trình. Để chương trình có thể chạy được với thư viện OpenCV ta cần tùy chỉnh lại một sô thuộc tính của project như sau Vào Project -> Properties (hoặc nhấn tổ hợp phím Alt + F7) để mở hộp thoại Properties. Hộp thoại opencv Property Pages hiện ra, trong mục Configuration Properties chọn VC++ DirectorNguyễn Văn Longies, tương ứng bên phải, ta tìm mục Include Directories và Library Directories. Ta sẽ chỉ đường dẫn hai thư mục này đến các phần tương ứng của thư viện OpenCV. Mục Include Directories, ta tùy chỉnh ở ô bên phải tới C:\opencv\build\include Mục Library Directories trỏ đến thư mục C:\opencv\build\x86\vc10\lib nếu như ta sử dụng hệ điều hành 32bit hoặc C:\opencv\build\x64\vc10\lib cho hệ điều hành 64bit. Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 8

第 9 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Tiếp theo, trong hộp thoại opencv Property Pages -> Configuration Properties -> Linker chọn Input, tương ứng ở ô bên phải, thêm vào các giá trị cho mục Additional Dependencies là opencv_core243d.lib, opencv_imgproc243d.lib, opencv_highgui243d.lib. Chú ý là các lib thêm vào sẽ tương ứng với các header ta khai báo trong chương trình, và tùy thuộc vào mục đích sử dụng mà ta có thể thêm vào các lib các nhau, giả sử ta cần sử dụng tới các hàm về video, khi đó ta thêm header #include <opencv2/video/video.hpp> thì trong phần Additional Dependencies ta phải khai báo thêm opencv_video243d.lib. Chữ d đứng cuối các file trên thể hiện ta đang hoạt động ở chế độ debug, ta có thể thêm các lib không có chữ “d” ở cuối như opencv_core243.lib … trong chế độ release. Tuy nhiên khi đang còn học tập và cần nhiều chỉnh sửa ta nên để ở chế độ debug. Cuối cùng, khi dịch xong một chương trình, để nó có thể chạy được ta cần chú ý tới các file *.dll. Cách đơn giản nhất là ta copy các file *.dll tương ứng (như opencv_core243d.dll, opencv_imgproc243d.dll) vào thư mục chứa file chạy của chương trình (file *.exe). Các file *.dll này nằm trong mục C:\opencv\build\x86\bin với win 32 bit hoặc C:\opencv\build\x64\bin với win 64 bit. Với các phiên bản OpenCV cũ hơn, ta cần copy luôn file tbb_debug.dll (trong chế độ debug) hoặc tbb.dll (trong chế độ release) vào thư mục chứa file *.exe. tbb.dll (Thread building block) là file khá quan trọng, thiếu nó chương trình sẽ báo lỗi. Sau khi đã hoàn tất việc chỉ dẫn thư mục chứa header, library và link tới các library tương ứng, ta có thể include các header của opencv vào chương trình và có thể gọi các hàm làm việc của OpenCV. #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace std; using namespace cv; void{}Nguyễn Văn Longmain()... Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 9

第 10 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Với Eclipse CDT Khởi động Eclipse, Từ cửa sổ Eclipse chọn New -> C++ Project , hộp thoại C++ Project xuất hiện, trong hộp thoại ta chọn Project name là opencv, Project type là Hello World C++ Project (Có thể chọn là Empty Project), Toolchains là MinGW GCC, Chọn Finish và ta có một Project mới. Bây giờ tùy chỉnh cho project này hoạt động được với OpenCV. Trong cửa sổ của Eclipse chọn Project - >Properties, cửa sổ Properties hiện ra. Tron cửa sổ Properties chọn C/C++ Build->Settings. Trong tab Tool Settings. Ở phần GCC C++ Compiller chọn Include rồi dẫn đường dẫn tới mục Include của OpenCV là C:\opencv\build\include. Trong phần MinGW C++ Linker chọn Library và chọn các mục như sau: click vào dấu cộng ở Library search path (-L) và dẫn tới thư mục lib: C:\opencv\build\x86\mingw\lib đối với Windows 32 bit hoặc C:\opencv\build\x64\mingw\lib đối với Windows 64 bit. Tiếp đó click vào dấu "cộng" để thêm Library(-I) vào, các library cần thêm lần lượt là: opencv_core243, opencv_highgui243, opencv_imgproc243 ... nói chung là tùy vào nhu cầu sử dụng có thể thêm một hoặc nhiều lib vào. Nguyễn Văn Long Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 10

第 11 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Ta cũng cần phải copy các *.dll tương ứng vào thư mục chứa file chạy *.execủa chương trình để chương trình có thể chạy thành công. Nguyễn Văn Long Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 11

第 12 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Chương II. Các phép xử lý ảnh và ứng dụng cơ bản 1. Chương trình đầu tiên Trong bài này ta sẽ tìm hiểu một ví dụ đầu tiên như một chương trình Hello world để load và hiển thị một ảnh. Chương trình như sau: #include "stdafx.h" #include <iostream> #include <opencv2\highgui\highgui.hpp> #include <opencv2\core\core.hpp> using namespace std; using namespace cv; int main() { cout<<"Chuong trinh dau tien"<<endl; Mat img = imread("vietnam.jpg", CV_LOAD_IMAGE_COLOR); namedWindow("Viet Nam", CV_WINDOW_AUTOSIZE); imshow("Viet Nam", 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) 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… 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(const std::string &winname, int flags) sẽ tạo ra cửa sổ với tiêu đề cửa sổ là một chuỗi string winname. 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 …Nguyễn Văn Long Cuối cùng, hàm imshow(const std::string &winname, cv::InputArray Mat) sẽ hiển thị ảnh ra cửa sổ đã được tạo ra trước đó. 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 Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 12

第 13 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV trong một khoảng thời gian bằng tham số delay (tính theo đơn vị millisecond). Nếu muốn dừng màn hình lại mãi mãi ta đặt tham số delay bằng 0. Và sau đây là kết quả chương trình chay: 2. Không gian màu, chuyển đổi giữa các không gian màu Khôn gian màu là một mô hình toán học dùng để mô tả các màu sắc trong thực tế được biểu diễn dưới dạng số học. Trên thực tế có rất nhiều không gian màu khác nhau được mô hình để sử dụng vào những mục đích khác nhau. Trong bài này ta sẽ tìm hiểu qua về ba không gian màu cơ bản hay được nhắc tới và ứng dụng nhiều, đó là hệ không gian màu RGB, HSV và CMYK. Không gian màu RGB RGB là không gian màu rất phổ biến được dùng trong đồ họa máy tính và nhiều thiết bị kĩ thuật số khác. Ý tưởng chính của không gian màu này là sự kết hợp của 3 màu sắc cơ bản : màu đNguyễn Văn Longỏ (R, Red), xanh lục (G, Green) và xanh lơ (B, Blue) để mô tả tất cả các màu sắc khác. Nếu như một ảnh số được mã hóa bằng 24bit, nghĩa là 8bit cho kênh R, 8bit cho kênh G, 8bit cho kênh B, thì mỗ kênh này màu này sẽ nhận giá trị từ 0-255. Với mỗi giá trị khác nhau của các kênh màu kết hợp với nhau ta sẽ được một màu khác nhau, như vậy ta sẽ có tổng cộng 255x255x255 = 1.66 triệu màu sắc. Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 13

第 14 页

ỨỨỨng dng dng dụụụng xng xng xửửử lýlýlý ảảảnh trong thnh trong thnh trong thựựực tc tc tếếế vvvớớới thư vii thư vii thư việệện OpenCVn OpenCVn OpenCV Ví dVí dVí dụụụ: màu đen là s: màu đen là s: màu đen là sựựự kkkếếết ht ht hợợợp cp cp củủủa các kênh màu (R, G, B)a các kênh màu (R, G, B)a các kênh màu (R, G, B) vvvớớới giá tri giá tri giá trịịị tươngtươngtương ứứứng (0, 0, 0) màu trng (0, 0, 0) màu trng (0, 0, 0) màu trắắắng có giá trng có giá trng có giá trịịị (255,(255,(255, 255, 255), màu vàng có giá tr255, 255), màu vàng có giá tr255, 255), màu vàng có giá trịịị (255, 255, 0), màu tím đ(255, 255, 0), màu tím đ(255, 255, 0), màu tím đậậậmmm có giá trcó giá trcó giá trịịị (64, 0, 128) ...N(64, 0, 128) ...N(64, 0, 128) ...Nếếếu ta dùng 16bit đu ta dùng 16bit đu ta dùng 16bit đểểể mã hóa mmã hóa mmã hóa mộộộttt kênh màu (48bit cho toàn bkênh màu (48bit cho toàn bkênh màu (48bit cho toàn bộộộ 3 kênh màu) thì dã3 kênh màu) thì dã3 kênh màu) thì dãi màu si màu si màu sẽẽẽ trãi rtrãi rtrãi rộộộng lên tng lên tng lên tớớới 3*2^16 = ... Mi 3*2^16 = ... Mi 3*2^16 = ... Mộộột con st con st con sốốố rrrấấất lt lt lớớớn.n.n. Không gian màu CMYK.Không gian màu CMYK.Không gian màu CMYK. CMYK là không gian màu đưCMYK là không gian màu đưCMYK là không gian màu đượợợc sc sc sửửử dddụụụng phng phng phổổổ bibibiếếến trongn trongn trong ngành công nghingành công nghingành công nghiệệệp inp inp in ấấấn.Ý tn.Ý tn.Ý tưưưởởởng cơ bng cơ bng cơ bảảản cn cn củủủa ha ha hệệệ khôngkhôngkhông gian này là dùng 4 màu sgian này là dùng 4 màu sgian này là dùng 4 màu sắắắc cơ bc cơ bc cơ bảảản đn đn đểểể phphphụụục vc vc vụụụ cho vicho vicho việệệc pha trc pha trc pha trộộộn mn mn mựựực in.c in.c in. Trên thTrên thTrên thựựực tc tc tếếế,,, ngưngưngườờời ta dùng 3 màu là C=Cyan: xanh lơ, M=Magenta: hi ta dùng 3 màu là C=Cyan: xanh lơ, M=Magenta: hi ta dùng 3 màu là C=Cyan: xanh lơ, M=Magenta: hồồồng xng xng xẫẫẫm, và Y=Yellow: vàng đm, và Y=Yellow: vàng đm, và Y=Yellow: vàng đểểể bibibiểểểu diu diu diễễễn các màu sn các màu sn các màu sắắắc khác nhau. Nc khác nhau. Nc khác nhau. Nếếếu lu lu lấấấy màu hy màu hy màu hồồồng xng xng xẫẫẫm cm cm cộộộng vng vng vớớới vàng si vàng si vàng sẽẽẽ ra màu đra màu đra màu đỏỏỏ,,, màu xmàu xmàu xẫẫẫm km km kếếết ht ht hợợợp vp vp vớớới xanh lơ si xanh lơ si xanh lơ sẽẽẽ cho xanh lam ... Scho xanh lam ... Scho xanh lam ... Sựựự kkkếếết ht ht hợợợp cp cp củủủa 3 màu trên sa 3 màu trên sa 3 màu trên sẽẽẽ cccho ra màuho ra màuho ra màu đen, tuy nhiên màu đenđen, tuy nhiên màu đenđen, tuy nhiên màu đen ởởở đây khôn phđây khôn phđây khôn phảảải là đen tuyi là đen tuyi là đen tuyệệệt đt đt đốốối và thưi và thưi và thườờờng có đng có đng có độộộ tương phtương phtương phảảản ln ln lớớớn,n,n, nên trong ngành in, đnên trong ngành in, đnên trong ngành in, đểểể tititiếếết kit kit kiệệệm mm mm mựựực in ngưc in ngưc in ngườờời ta thêm vào màu đen đi ta thêm vào màu đen đi ta thêm vào màu đen đểểể in nhin nhin nhữữững chi ting chi ting chi tiếếếttt có màu đen thay vcó màu đen thay vcó màu đen thay vì phì phì phảảải ki ki kếếết ht ht hợợợp 3 màu sp 3 màu sp 3 màu sắắắc trên. Và như vc trên. Và như vc trên. Và như vậậậy ta có hy ta có hy ta có hệệệ màumàumàu CMYK. chCMYK. chCMYK. chữữữ KKK ởởở đây là đđây là đđây là đểểể kí hikí hikí hiệệệu màu đen (Black), có nhu màu đen (Black), có nhu màu đen (Black), có nhẽẽẽ chchchữữữ B đB đB đããã đưđưđượợợc dùng đc dùng đc dùng đểểể bibibiểểểu diu diu diễễễn màu Bluen màu Bluen màu Blue nên ngưnên ngưnên ngườờời ta li ta li ta lấấấyyy chchchữữữ cái cucái cucái cuốốối K đi K đi K đểểể bibibiểểểu diu diu diễễễn màu đen?n màu đen?n màu đen? Nguyên lý làm viNguyên lý làm viNguyên lý làm việệệc cc cc củủủa ha ha hệệệ màu này như sau : Trên mmàu này như sau : Trên mmàu này như sau : Trên mộộộttt nnnềềền gin gin giấấấy try try trắắắng, khi mng, khi mng, khi mỗỗỗi màu này đưi màu này đưi màu này đượợợc in lên sc in lên sc in lên sẽẽẽ lololoạạại bi bi bỏỏỏ dddầầầnnn đi thành phđi thành phđi thành phầầần màu trn màu trn màu trắắắng. 3 màu C, M, Y khác nhau in theong. 3 màu C, M, Y khác nhau in theong. 3 màu C, M, Y khác nhau in theo nhnhnhữữững tng tng tỉỉỉ lllệệệ khác nhau skhác nhau skhác nhau sẽẽẽ lololoạạại bi bi bỏỏỏ đi thành phđi thành phđi thành phầầần đó mn đó mn đó mộộột cácht cácht cách khác nhau và cukhác nhau và cukhác nhau và cuốốối cùng cho ta màu si cùng cho ta màu si cùng cho ta màu sắắắc cc cc cầầần in. Khi cn in. Khi cn in. Khi cầầần inn inn in màu đen, thay vmàu đen, thay vmàu đen, thay vì phì phì phảảải in ci in ci in cảảả 3 màu ngư3 màu ngư3 màu ngườờời ta dùng màu đeni ta dùng màu đeni ta dùng màu đen đđđểểể in lên. Nguyênin lên. Nguyênin lên. Nguyên lý này khác vlý này khác vlý này khác vớớới nguyên lý làm vii nguyên lý làm vii nguyên lý làm việệệc cc cc củủủaaa hhhệệệ RGBRGBRGB ởởở chchchỗỗỗ hhhệệệ RGB là sRGB là sRGB là sựựự kkkếếết ht ht hợợợp cp cp củủủa các thành pha các thành pha các thành phầầầnnn màu, còn hmàu, còn hmàu, còn hệệệ CMYK là sCMYK là sCMYK là sựựự lololoạạại bi bi bỏỏỏ lllẫẫẫn nhau cn nhau cn nhau củủủa các thànha các thànha các thành phphphầầần màu.n màu.n màu. Không gian màu HSV.Không gian màu HSV.Không gian màu HSV. HSV và cHSV và cHSV và cũng gần tũng gần tũng gần tương tương tương tự nhự nhự như HSL là không gian màu đưư HSL là không gian màu đưư HSL là không gian màu được dợc dợc dùng nhiùng nhiùng nhiều trong việc chều trong việc chều trong việc ch ỉnhỉnhỉnh sssữa ảnh, phân tích ảnh vữa ảnh, phân tích ảnh vữa ảnh, phân tích ảnh vNguyễn Văn Longà mà mà một phần của lĩnh vực thị giác máy tính. Hệ không gian nột phần của lĩnh vực thị giác máy tính. Hệ không gian nột phần của lĩnh vực thị giác máy tính. Hệ không gian này dày dày dựaựaựa vàovàovào 333 thôngthôngthông sssốốố sausausau đểđểđể mômômô tảtảtả mmmàuàuàu sssắcắcắc H = Hue: màu sH = Hue: màu sH = Hue: màu sắc, S = Saturation: độ đậm đặc, sự bảo hắc, S = Saturation: độ đậm đặc, sự bảo hắc, S = Saturation: độ đậm đặc, sự bảo hòa, V = value: giá tròa, V = value: giá tròa, V = value: giá trị cị cị cưưường độờng độờng độ sáng.sáng.sáng. Không gian màu này thưKhông gian màu này thưKhông gian màu này thường đờng đờng đưưược biểuợc biểuợc biểu dididiễn dễn dễn dưưưới dạng hới dạng hới dạng hình trình trình trụ hoặc hụ hoặc hụ hoặc hình nónình nónình nón... Theo đó,Theo đó,Theo đó, Tác giTác giTác giảảả: Nguy: Nguy: Nguyễễễn Văn Longn Văn Longn Văn Long ––– long.06clc@gmail.comlong.06clc@gmail.comlong.06clc@gmail.com PagePagePage 141414

第 15 页

ỨỨỨng dng dng dụụụng xng xng xửửử lýlýlý ảảảnh trong thnh trong thnh trong thựựực tc tc tếếế vvvớớới thư vii thư vii thư việệện OpenCVn OpenCVn OpenCV đi theo vđi theo vđi theo vòng tròn tòng tròn tòng tròn từừừ 000 ---360 đ360 đ360 độộộ là trưlà trưlà trườờờng bing bing biểểểu diu diu diễễễn màu sn màu sn màu sắắắc(Hue). Trưc(Hue). Trưc(Hue). Trườờờng này bng này bng này bắắắt đt đt đầầầu tu tu từừừ màu đmàu đmàu đỏỏỏ đđđầầầu tiên (red primary) tu tiên (red primary) tu tiên (red primary) tớớới màu xanh li màu xanh li màu xanh lụụục đc đc đầầầu tiên (green primary) nu tiên (green primary) nu tiên (green primary) nằằằm trongm trongm trong khokhokhoảảảng 0ng 0ng 0---120 đ120 đ120 độộộ, t, t, từừừ 120120120 --- 240 đ240 đ240 độộộ là màlà màlà màu xanh lu xanh lu xanh lụụục tc tc tớớới xanh lơ (green primaryi xanh lơ (green primaryi xanh lơ (green primary --- blueblueblue primary).primary).primary). TTTừừừ 240240240 --- 360 là t360 là t360 là từừừ màu đen tmàu đen tmàu đen tớớới li li lạạại màu đi màu đi màu đỏỏỏ... Không gian màu HSVKhông gian màu HSVKhông gian màu HSV Hình tròn biHình tròn biHình tròn biểu diễn mểu diễn mểu diễn màu sàu sàu sắc (HUE)ắc (HUE)ắc (HUE) ChuyChuyChuyển đổi giữa các không gian mển đổi giữa các không gian mển đổi giữa các không gian màu.àu.àu. ChuyChuyChuyểnểnển đđđổi RGB sang CMYK vổi RGB sang CMYK vổi RGB sang CMYK và ngưà ngưà ngược lại.ợc lại.ợc lại. Như đNhư đNhư đã nóiã nóiã nói ở trở trở trên, thành phên, thành phên, thành phần K lần K lần K là thành phà thành phà thành phần phụ dần phụ dần phụ dùng đùng đùng để in cho những điểm mể in cho những điểm mể in cho những điểm màu cóàu cóàu có màu đen trong hmàu đen trong hmàu đen trong hệ CYMK, do vậy để chuyển không gian mệ CYMK, do vậy để chuyển không gian mệ CYMK, do vậy để chuyển không gian màu tàu tàu từ RGB sang CMYK trừ RGB sang CMYK trừ RGB sang CMYK trưưướcớcớc hhhết ta chuyển RGB sang CMY sau đó tết ta chuyển RGB sang CMY sau đó tết ta chuyển RGB sang CMY sau đó tìm thành phìm thành phìm thành phần K cần K cần K còn lòn lòn lại. Côại. Côại. Cô ng thng thng thức chuyển từức chuyển từức chuyển từ RGB sang CMY:RGB sang CMY:RGB sang CMY: (C', M', Y') = ((255(C', M', Y') = ((255(C', M', Y') = ((255 --- R), (255R), (255R), (255 --- G), (255G), (255G), (255 --- B)).B)).B)). ViViViệc tính giá trị của K lại lệc tính giá trị của K lại lệc tính giá trị của K lại là mà mà một vấn đề khác vột vấn đề khác vột vấn đề khác vì nó liên quan tì nó liên quan tì nó liên quan tới nhới nhới nhà sà sà sản xuất công nghệản xuất công nghệản xuất công nghệ in, tuy nhiên vin, tuy nhiên vin, tuy nhiên về mặt lý thuyết có thể chấp nhận rằng K = min {C'/2,55, M'/2,55,ề mặt lý thuyết có thể chấp nhận rằng K = min {C'/2,55, M'/2,55,ề mặt lý thuyết có thể chấp nhận rằng K = min {C'/2,55, M'/2,55, Y'/2,55} ,Y'/2,55} ,Y'/2,55} , như vnhư vnhư vậy 0<= K <=100.ậy 0<= K <=100.ậy 0<= K <=100. NNNếu K = 100, thếu K = 100, thếu K = 100, thì C = M = Y =0 (trì C = M = Y =0 (trì C = M = Y =0 (trương hương hương hợp in mợp in mợp in màu đen)àu đen)àu đen) NNNếu 0< K < 100: C = (C'/2.55ếu 0< K < 100: C = (C'/2.55ếu 0< K < 100: C = (C'/2.55 --- K) * 100 /(100K) * 100 /(100K) * 100 /(100 --- K), M = (M'/2.55K), M = (M'/2.55K), M = (M'/2.55 --- K) * 100 /(100K) * 100 /(100K) * 100 /(100 --- K),K),K), Y = (Y'/2.55Y = (Y'/2.55Y = (Y'/2.55 --- K) *100 /(100K) *100 /(100K) *100 /(100 --- K) và K = K. Trong đó, C, M, Y, K đưK) và K = K. Trong đó, C, M, Y, K đưK) và K = K. Trong đó, C, M, Y, K được lợc lợc làm tròn tàm tròn tàm tròn tớiớiới đđđểểể lllấy chỉ số nguyấy chỉ số nguyấy chỉ số nguyên.ên.ên. ChuyChuyChuyển đổi RGB sang HSV vển đổi RGB sang HSV vển đổi RGB sang HSV và ngưà ngưà ngược lạiợc lạiợc lại GiGiGiả sử ta có một điểm mả sử ta có một điểm mả sử ta có một điểm màu có giá tràu có giá tràu có giá trị trong hệ RGB lị trong hệ RGB lị trong hệ RGB là (R, G, B). ta chuyà (R, G, B). ta chuyà (R, G, B). ta chuyển sang khôngển sang khôngển sang không gian HSV như sau:gian HSV như sau:gian HSV như sau:Nguyễn Văn Long ĐĐĐặt M = Max(R, G, B), m = Min(R, G, B) vặt M = Max(R, G, B), m = Min(R, G, B) vặt M = Max(R, G, B), m = Min(R, G, B) và C = Mà C = Mà C = M --- m.m.m. NNNếu M = R, H' = (Gếu M = R, H' = (Gếu M = R, H' = (G --- B)/C mod 6. NB)/C mod 6. NB)/C mod 6. Nếu M =ếu M =ếu M = G, H' = (BG, H' = (BG, H' = (B --- R)/C + 2. NR)/C + 2. NR)/C + 2. Nếu M = B, H' = (Rếu M = B, H' = (Rếu M = B, H' = (R --- G)/C + 4. Và H = H'x60. TG)/C + 4. Và H = H'x60. TG)/C + 4. Và H = H'x60. Trong trưrong trưrong trường hợp C = 0, H = 0ờng hợp C = 0, H = 0ờng hợp C = 0, H = 0000 V = M.V = M.V = M. Tác giTác giTác giảảả: Nguy: Nguy: Nguyễễễn Văn Longn Văn Longn Văn Long ––– long.06clc@gmail.comlong.06clc@gmail.comlong.06clc@gmail.com PagePagePage 151515

第 16 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV S = C/V. Trong trường hợp V hoặc C bằng 0, S = 0. Để chuyển từ HSV sang RGB ta làm như sau: Giả sử ta có không gian màu HSV với H = [0, 360], S = [0, 1], V = [0, 1]. Khi đó, ta tính C = VxS. H' = H/60. X = C(1 - |H' mod2 -1|). Ta biểu diễn hệ (R1, G1, B1) như sau: (0,0,0) ế ℎư đượ á đị ℎ ⎧ ( , ,0) ế 0 ≤ < 1 ⎪ ⎪ ( , ,0) ế 1 ≤ < 2 ( 1, 1, 1) = (0, , ) ế 2 ≤ < 3 ⎨ (0, , ) ế 3 ≤ < 4 ⎪ ( ,0, ) ế 4 ≤ < 5 ⎪ ⎩ ,0, ) ế 5 ≤ < 6 Chương trình chuyển đổi các không gian màu Trong OpenCV, các không gian màu được được chuyển đổi qua lại nhờ hàm cvtColor (convert color), nguyên mẫu hàm này như sau: cv::cvtColor(cv::InputArray src, cv::OutputArray dst, int code) Trong đó, src, dst là ảnh gốc và ảnh thu được sau khi chuyển đổi không gian màu. code mà mã chuyển đổi không gian màu. OpenCV định nghĩa khá nhiều chuyển đổi giữa các không gian màu chẳng hạn như code = CV_BGR2GRAY sẽ chuyển ảnh ở không gian màu RGB sang ảnh xám, code = CV_HSV2BGR sẽ chuyển ảnh ở không gian màu HSV sang không gian màu RGB … #include "stdafx.h" #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; void main() { Mat src = imread("LucBinh.jpg", CV_LOAD_IMAGE_COLOR); Mat gray, hsv, ycrcb; cvtColor(src, gray, CV_BGR2GRAY); Nguyễn Văn LongcvtColor(src, hsv, CV_BGR2HSV);cvtColor(src, ycrcb, CV_BGR2YCrCb);imshow(imshow(imshow("src""gray""hsv", src);, hsv);, gray); imshow("ycrcb", ycrcb); waitKey(0); Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 16

第 17 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV } Sau đây là hình ảnh khi chuyển đổi các không gian màu trên 3. Điều chỉnh độ sang và độ tương phản trong ảnh Trong bài này ta sẽ tìm hiểu về cấu trúc của một bức ảnh, cách tiếp cận và điều chỉnh tới từng điểm ả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). 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 phNguyễn Văn Longầ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: Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 17

第 18 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Cột 0 Cột 1 Cột m Hàng 0 0, 0 0, 0 0, 0 0, 1 0, 1 0, 1 0, m 0, m 0, m Hàng 1 1, 0 1, 0 1, 0 1, 1 1, 1 1, 1 1, m 1, m 1, m Hàng 2 2, 0 2, 0 2, 0 2, 1 2, 1 2, 1 2, m 2, m 2, m Hàng n n, 0 n, 0 n, 0 N, 1 n, 1 n, 1 n, m n, m n, m 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, dung để 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. Sau đây ta sẽ áp dụng kiến thức trên để làm tăng, giảm độ sang 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 ta dung một kênh duy nhất để biểu diễn ảnh xám. 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 g(x,y) = αf(x,y) + β. 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 β ≠ 0ta 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: #include "stdafx.h" #include <iostream> #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; int main() { cout<<"Chuong trinh dieu chinh do sang va tuong phan"<<endl; Mat src = imread("hoa_huong_duong.jpg", 1); Nguyễn Văn LongMat dst = src.clone(); double alpha = 2.0; int beta = 30; for(int i = 0; i < src.rows; i++) for(int j = 0; j < src.cols; j++) for(int k = 0; k < 3; k++) Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 18

第 19 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV dst.at<Vec3b>(i,j)[k] = saturate_cast<uchar>( alpha*(src.at<Vec3b>(i,j)[k] ) + beta); imshow("anh goc", src); imshow("anh co sau khi chinh do tuong phan va do sang", dst); 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ư ảnd 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 Sau đây là kết quả chương trình với giá trị α = 2.0 và β = 30 4. Ảnh nhị phân, nhị phân hóa với ngưỡng động Ảnh nhị phân là ảnh mà giá trị của các điểm ảnh chỉ được biểu diễn bằng hai giá trị 0 hoặc 255 tương ứng với hai màu đen hoặc trắng. Nhị phân hóa một ảnh là quá trình biến một ảnh xám thành ảnh nhị phân. Gọi f(x,y) là giá trị cường độ sáng của một điểm ảnh ở vị trí (x,y), T là ngưỡng nhị nhị phân. Khi đó, ảnh xám f sẽ được chuyển thành ảnh nhị phân dHình sau mô tNguyễn Văn Longựa vào công thả một ảnh nhức f(x,y) = 0ị phân vnớếi ngưu f(x,y)ỡng nh≤ T ịvàphân T = 100f(x,y) = 255 nếu f(x,y) > T Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 19

第 20 页

Ứng dụng xử lý ảnh trong thực tế với thư viện OpenCV Ảnh xám Ảnh nhị phân Hàm để chuyển nhị phân hóa ảnh trong OpenCV là hàm threshold(). Nguyên mẫu hàm như sau: threshold(cv::InputArray src, cv::OutputArray dst, double thresh, int maxval, int type) Trong đó, src là ảnh đầu vào một kênh màu (ảnh xám …), dst là ảnh sau khi được nhị phân hóa, thresh là ngưỡng nhị phân, maxval là giá trị lớn nhất trong ảnh (maxval = 255 đối với ảnh xám), type là kiểu nhị phân có thể là CV_THRESH_BINARY, CV_THRESH_BINARY_INV, CV_THRESH_OTSU… lần lượt là nhị phân hóa thông thường, nhị phân hóa ngược và nhị phân hóa theo thuật toán Otsu … Kết quả của việc nhị phân hóa một ảnh phụ thuộc vào ngưỡng T, có nghĩa là với mỗi ngưỡng T khác nhau thì ta có những ảnh nhị phân khác nhau. Hình sau mô tả 3 ảnh nhị phân tương ứng với ngưỡng T = 50, T = 100 và T = 150. Nguyễn Văn LongT = 50 T = 100 T = 150 Để thu được một ảnh nhị phân tốt mà không cần phải quan tâm tới các điều kiện ánh sáng khác nhau (không cần quan tâm tới ngưỡng T), người ta dùng một kĩ thuật sao cho với mọi ngưỡng xám khác nhau ta luôn thu được một ảnh nhi phân tốt. Kĩ thuật đó gọi là kĩ Tác giả: Nguyễn Văn Long – long.06clc@gmail.com Page 20

显示前 20 页。下载资料查看完整内容。

评论 (0)

登录 以加入讨论

暂无评论。快来抢沙发吧!