Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 79 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
79
Dung lượng
1,8 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC DÂN LẬP HẢI PHÒNG - ISO 9001:2015 ĐỒ ÁN TỐT NGHIỆP NGÀNH: CÔNG NGHỆ THÔNG TIN Sinh viên : Nguyễn Đình Phúc Giảng viên hướng dẫn: TS Ngơ Trường Giang HẢI PHỊNG - 2018 Phânđoạnảnhdựathuậttoánnởvùng BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC DÂN LẬP HẢI PHÒNG - PHÂNĐOẠNẢNHĐỰATRÊNTHUẬTTOÁNNỞVÙNG ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY NGÀNH: CƠNG NGHỆ THƠNG TIN Sinh viên : Nguyễn Đình Phúc Giảng viên hướng dẫn : TS Ngơ Trường Giang HẢI PHỊNG - 2018 Nguyễn Đình Phúc _ CT1701 Phânđoạnảnhdựathuậttoánnởvùng BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC DÂN LẬP HẢI PHÒNG NHIỆM VỤ ĐỀ TÀI TỐT NGHIỆP Sinh viên: Nguyễn Đình Phúc Lớp: CT1701 Mã SV: 1112401048 Ngành: Công nghệ thông tin Tên đề tài: Phânđoạnảnhdựathuậttoánnởvùng Nguyễn Đình Phúc _ CT1701 Phânđoạnảnhdựathuậttoánnởvùng LỜI CẢM ƠN Trước hết em xin cảm ơn thầy cô giáo khoa Công nghệ thông tin – Trường đại học Dân Lập Hải Phòng tạo điều kiện thuận lợi cho em trình học tập trường Đặc biệt, em xin chân thành cảm ơn hướng dẫn tận tình TS Ngơ Trường Giang – giảng viên khoa Công nghệ thông tin trường Đại học Dân Lập Hải Phòng tạo điều kiện giúp đỡ em hoàn thành đồ án Mặc dù cố gắng tận tâm thầy giáo hướng dẫn xong trình độ hạn chế, nội dung đề tài mẻ với em nên khó tránh khỏi sai sót q trình tiếp nhận kiến thức Em mong dẫn thầy cô góp ý bạn bè để em hồn thiện đồ án em Cuối em xin gửi lời cảm ơn đặc biệt tới gia đình, bố, mẹ, người động viên, khích lệ để giúp em hoàn thành đồ án Em mong nhận góp ý thầy giáo bạn sinh viên để đề tài em hoàn thiện Em xin chân thành cảm ơn! Hải Phòng, ngày 26 tháng năm 2018 Người thực Nguyễn Đình Phúc Nguyễn Đình Phúc _ CT1701 Phânđoạnảnhdựathuậttoánnởvùng MỤC LỤC LỜI CẢM ƠN MỤC LỤC DANH MỤC HÌNH ẢNH CHƯƠNG 1: MỘT SỐ VẤN ĐỀ CƠ BẢN TRONG XỬ LÝ ẢNH 1.1 Một số khái niệm 1.1.1 Khái niệm ảnh số 1.1.2 Tổng quan hệ thống xử lý ảnh 10 1.2 Kỹ thuật lọc nhiễu xử lý ảnh 11 1.2.1 Nhân chập 11 1.2.2 Lọc số gì? 13 1.2.3 Một số kỹ thuật lọc nhiễu 14 1.3 Kỹ thuật tìm biên xử lý ảnh 17 1.3.1 Một số khái niệm 17 1.3.2 Các phương pháp phát biên 17 1.4 Biến đổi khoảng cách 20 1.4.1 Giới thiệu 20 1.4.2 Thuậttoán biến đổi khoảng cách đơn giản 20 1.5 Phânđoạnảnh 21 1.5.1 Giới thiệu 21 1.5.2 Một số hướng tiếp cận phânđoạnảnh 22 1.5.3 Phânđoạndựa ngưỡng 26 CHƯƠNG 2: PHÂNĐOẠNẢNH VỚI THUẬTTOÁNNỞVÙNG 29 2.1 Thuậttoánnởvùng 29 2.2 Một số thuậttoánnởvùng 29 2.2.1 Thuậttoánnởvùng 29 2.2.2 Thuậttoánnởvùng thống kê 30 2.2.3 Thuậttoánnởvùng theo lưu vực 30 2.3 Phânđoạnảnh theo biến đổi Watershed 31 Nguyễn Đình Phúc _ CT1701 Phânđoạnảnhdựathuậttoánnởvùng 2.3.1 Giới thiệu: 31 2.3.2 Thuậttoán watershed dựa thành phần liên thông 35 CHƯƠNG 3: THỰC NGHIỆM 47 3.1 Phát biểu toán ứng dụng .47 3.2 Khái quát thư viện OpenCV 48 3.3 Các bước thực 48 3.3.1 Bước 1: Tiền xử lý 49 3.3.2 Bước 2: Tách đối tượng 54 3.3.3 Xác định ranh giới đối tượng 56 KẾT LUẬN 59 MỘT SỐ TÀI LIỆU THAM KHẢO 60 Nguyễn Đình Phúc _ CT1701 Phânđoạnảnhdựathuậttoánnởvùng DANH MỤC HÌNH ẢNH Hì Hì nh nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Hì nh Nguyễn Đình Phúc _ CT1701 Phânđoạnảnhdựathuật tốn nởvùng Hình 3-10 Số lượng đồng xu đếm Nguyễn Đình Phúc _ CT1701 58 Phânđoạnảnhdựathuậttoánnởvùng CHƯƠNG 1: MỘT SỐ VẤN ĐỀ CƠ BẢN TRONG XỬ LÝ ẢNH 1.1 Một số khái niệm 1.1.1 Khái niệm ảnh số Ảnh số tập hợp hữu hạn điểm ảnh với mức xám phù hợp dùng để mô tả gần với ảnh thật Số điểm ảnh xác định độ phân giải ảnh, độ phân giải cao thể rõ nét đặc điểm hình, làm cho ảnh trở nên thực sắc nét Điểm ảnhphần tử ảnh số tọa độ (x, y) với độ xám màu định Kích thước khoảng cách điểm ảnh chọn thích hợp cho mắt người cảm nhận liên tục không gian mức xám (hoặc màu) ảnh số gần ảnh thật Mỗi phần tử ma trận gọi phần tử ảnh Mức xám kết biến đổi tương ứng giá trị độ sáng điểm ảnh với giá trị ngun dương Thơng thường xác định khoảng từ đến 255 tùy thuộc vào giá trị mà điểm ảnh biểu diễn Độ phân giải ảnh mật độ điểm ảnh ấn định ảnh số hiển thị Như trình bày trên, khoảng cách điểm ảnh phải chọn cho mắt người thấy liên tục ảnh Việc lựa chọn khoảng cách thích hợp tạo nên mật độ phân bổ, độ phân giải phân bố theo trục x y không gian hai chiều Ảnh đen trắng ảnh bao gồm màu: màu đen màu trắng Người ta phân mức đen trắng thành L mức Nếu sử dụng số bit B để mã hóa mức Nguyễn Đình Phúc _ CT1701 Phânđoạnảnhdựathuậttoánnởvùng B đen trắng (hay mức xám) L xác định: L Nếu B=1, có mức: mức mức 1, gọi ảnh nhị phân Mức ứng với màu sáng, mức ứng với màu tối Nói cách khác, với ảnh nhị phân điểm ảnh mã hóa bit Nếu L lớn ta có ảnh đa cấp xám Nếu dùng bit để biểu diễn mức xám, số mức xám biểu diễn 256 Mỗi mức xám biểu diễn dạng số nguyên nằm khoảng từ đến Nguyễn Đình Phúc _ CT1701 10 giới đối tượng đồng xu đè chồng lên cách sử dụng hàm biến đổi khoảng cách Distance transform thuật tốn Watershed Hình 3-2 Giao diện chương trình cài đặt 3.3.1 Bước 1: Tiền xử lý Bước gồm có thao tác cần thực hiện: Lọc nhiễu phân ngưỡng Đọc ảnh (Input Image) : Ta có ảnh đầu vào đọc hàm Imread có sẵn thư viện OpenCV Hàm Imread hàm dùng để đọc hình ảnh từ file với đối số truyền vào input đầu vào chứa tên file, đối số thứ hai biến định cách mà OpenCV load hình Cấu trúc hàm imread thư viện OpenCV trình bày sau: Mat image; Image=imread (INPUT, CV_LOAD_IMAGE_COLOR) ; Trong đó: INPUT file ảnh đầu vào cần đọc CV_LOAD_IMAGE_COLOR: Hình ảnh load lên định dạng kênh màu RBG (Red, Green, Blue) CV_LOAD_IMAGE_GRAYSCALE: Hình ảnh load lên dạnh hình ảnh xám CV_LOAD_IMAGE_UNCHANGED: Hình ảnh load lên giữ nguyên cấu trúc Mat cấu trúc dùng để lưu giữ data hình ảnh sử dụng OpenCV Sau load ảnh hàm Imread ta có hình ảnh 3-4: Hình 3-3 Hình ảnh đầu vào Lọc nhiễu: Sau có ảnh đầu vào, thao tác cần thực bước tiền xử lý lọc nhiễu cho ảnh đầu vào Mục đích thao tác lọc nhiễu để loại bỏ số loại nhiễu không cần thiết ảnh hưởng đến q trình tìm kiếm đối tượng sau Để thực thao tác lọc nhiễu, ta cần chuyển hình ảnh đầu vào từ ảnh màu qua ảnh xám để áp dụng số kỹ thuật lọc: Trong OpenCV sử dụng hàm CvtColor để thực chuyển ảnh đầu vào từ ảnh màu qua ảnh xám Cấu trúc hàm CvtColor OpenCV trình bày sau: Mat bw; CvtColor (src, bw, CV_BGR2GRAY) ; Trong đó: src đối số đầu vào bw đối số đầu CV_BGR2GRAY code quy định chuyển đổi từ mã màu sang mã màu Ở ta thực việc chuyển đổi từ mã ảnh màu sang ảnh xám Sau chuyển đổi hệ màu ảnh gốc sang ảnh xám hàm CvtColor OpenCV ta có hình ảnh 3-4: Hình 3-4 Ảnh xám sau chuyển đổi Thao tác cần thực lọc nhiễu cho ảnh Để lọc nhiễu cho ảnh này, đồ án sử dụng lọc làm mờ Blur Là phép lọc làm cho trơn ảnh khử nhiễu hạt lọc trung bình Trong OpenCV hàm Blur trình bày sau: blur (src, dst, Size ksize, (-1, -1) , 4) Trong đó: src ảnh đầu vào dst ảnh sau thực phép lọc ksize kích thước ma trận lọc (-1, -1) giá trị mặc định ma trận lọc giá trị giá trị mặc định dùng để ước lượng chỉnh điểm ảnh phép lọc chúng vượt khỏi giới hạn ảnh Sau thực lọc ảnh hàm Blur OpenCV ta kết ảnh làm mờ: Hình 3-5 Kết bước làm mờ ảnhPhân ngưỡng Tiếp theo thao tác chuyển qua ảnh nhị phân, hay gọi phân ngưỡng, ảnh sau lọc hàm Blur thao tác loại bỏ nhiễu thao tác việc chọn mức ngưỡng phù hợp Mục đích thao tác phân ngưỡng ảnh dùng để phục vụ cho việc tách đối tượng thuậttoán Để thực việc phân ngưỡng OpenCV ta sử dụng hàm threshold, OpenCV hàm threshold trình bày sau: Threshold (src, dst, 40, 255, CV_THRESH_BINARY) Trong đó: src ảnh xám đầu vào dst ảnh đầu 40 giá trị ngưỡng 255 giá trị gán pixel giá trị lớn giá trị ngưỡng CV_THRESH_BINARY loại phân ngưỡng Tùy theo loại phân ngưỡng mà pixel gán giá trị khác nhau: THRESH_BINARY: Nếu giá trị pixel lớn ngưỡng gán maxval Ngược lại gán THRESH_BINARY_INV: Nếu giá trị pixel lớn ngưỡng gán Ngược lại gán maxval THRESH_TRUNC: Nếu giá trị pixel lớn ngưỡng gán giá trị ngưỡng Ngược lại giữ nguyên giá trị Sau thực phân ngưỡng hàm threshold OpenCV ta kết ảnhphân ngưỡng sau: Hình 3-6 Kết trình phân ngưỡng 3.3.2 Bước 2: Tách đối tượng Hình ảnh sử dụng hình ảnh đồng xu chồng lấp phần lên nhau, tìm biên đếm số biên từ hình ảnh nhị phân kết khơng xác trường hợp Để đếm xác số tượng đồng xu ảnh ta phải tách đối tượng hình ảnh thành đối tượng không trùng lặp Để thực việc tách đối tượng ảnh thành vùng không trùng lặp, đồ án sử dụng thuậttoán biến đổi khoảng cách (Distance transform) Trong trường hợp này, với điểm ảnh đối tượng thay khoảng cách tới điểm ảnh gần Nghĩa sau sử dụng thuật toán, điểm ảnh gần tâm đối tượng có giá trị cao hơn, điểm ảnh gần biên có giá trị nhỏ Trong OpenCV hàm biến đổi khoảng cách trình bày sau: distanceTransform (bw, dist, CV_DIST_L2, 3) ; Sau thực thuậttoán biến đổi khoảng cách thực chuẩn hóa kết khoảng [0, 1], tức điểm sau thực biến đổi khoảng cách có thơng số giá trị, điểm xa biên có giá trị lớn, điểm gần biên có giá trị nhỏ, giá trị nằm khoảng [0, 1] Hình ảnh kết sau biến đổi khoảng cách chuẩn hóa: Hình 3-7 Hình ảnh sau sử dụng hàm biến đổi khoảng cách Để hoàn thành việc tách đối tượng thành vùng rời rạc ta thực phân ngưỡng lần ảnh thực phép biến đổi khoảng cách: Hình 3-8 Các đối tượng tách Sau đối tượng tách thành vùng rời rạc, việc cần làm tìm biên chúng Để thực việc tìm biên đối tượng sử dụng hàm findContours Trong OpenCV hàm tìm biên trình bày sau: findContours (dist_8u, contours, CV_RET_EXTRNAL, CV_CHAIN_APPROX_SIMPLE) ; Trong đó: dist_8u hình ảnh cần tìm biên Contours biến lưu trữ đường biên tìm được, đường biên lưu trữ dạng vecto điểm CV_RET_EXTRNAL sử dụng hàm hàm lấy đường biên bên ngoài, đường biên bên đối tượng bị loại bỏ CV_CHAIN_APPROX_SIMPLE hàm có tác dụng nén đường viền trước lưu trữ, nén phânđoạn theo chiều ngang, chiều dọc chéo Sau đếm số biên hàm findContours có số lượng biên tương ứng với số đối tượng Để biết có đường biên tương ứng với đối tượng tìm ta sử dụng câu lệnh sau OpenCv: int ncomp = contours size () ; 3.3.3 Xác định ranh giới đối tượng Ở bước áp dụng thuật tốn watershed để tìm ranh giới đối tượng riêng biệt Để thực thuậttoán watershed việc phải làm tạo ảnh marker Ảnh marker ảnh cho thuậttoán watershed đối tượng xét đâu đối tượng Trong OpenCV, thuậttoán tạo ảnh marker trình bày sau: Mat markers = Mat zeros (dist size () , CV_32SC1) ; For (int i=0; i< ncomp; i++) drawContours (marker, coutour, i, cv::Scalar::all (i+1) , -1) ; Trong thuậttoán tạo ảnh marker phía có sử dụng vòng lặp for nhằm mục đích truy cập đến đường biên đối tượng tìm thuật tốn findCoutours để vẽ đường viền hàm drawContours cho Các đường viền dùng để nhận biết đối tượng mảnh marker Ngoài cần phải vẽ marker để thuậttoán watershed phân biệt Giả sử đối tượng định ảnh cần vẽ marker gần cạnh ảnhThuật tốn vẽ marker trình bày sau OpenCV: Circle (markers, Point (5, 5) , 3, CV_RGB (255, 255, 255) , -1) Sau tạo ảnh marker ta thực thuậttoán watershed: watershed (src, markers) ; Bước cần thực tạo màu ngẫu nhiên cho đối tượng: Tạo màu ngẫu nhiên cho đối tượng OpenCV: vector colors; for (int i = 0; i < ncomp; i++) { int b = theRNG () uniform (0, 255) ; int g = theRNG () uniform (0, 255) ; int r = heRNG () uniform (0, 255) ; colors push_back (Vec3b ( (uchar) b, (uchar) g, (uchar) r) ) ; } Tạo ảnh kết quả: Mat dst = cv::Mat::zeros (markers size () , CV_8UC3) ; Điền đối tượng gán nhãn với màu sắc ngẫu nhiên for (int i = 0; i < markers rows; i++) { for (int j = 0; j < markers cols; j++) { int index = markers at (i, j) ; if (index > && index