Giáo trình Xử lý ảnh
MỤC LỤC
LỜI NÓI ĐẦU.2
MỤC LỤC.4
Chương 1: TỔNG QUAN VỀXỬLÝ ẢNH.7
1.1. XỬLÝ ẢNH, CÁC VẤN ĐỀCƠBẢN TRONG XỬLÝ ẢNH.7
1.1.1. Xửlý ảnh là gì?.7
1.1.2. Các vấn đềcơbản trong xửlý ảnh.7
1.1.2.1 Một sốkhái niệm cơbản.7
1.1.2.2 Nắn chỉnh biến dạng.8
1.1.2.3 Khửnhiễu.9
1.1.2.4 Chỉnh mức xám:.9
1.1.2.5 Trích chọn đặc điểm.9
1.1.2.6 Nhận dạng.10
1.1.2.7 Nén ảnh.11
1.2. THU NHẬN VÀ BIỂU DIỄN ẢNH.11
1.2.1. Thu nhận, các thiết bịthu nhận ảnh.11
1.2.2. Biểu diễn ảnh.12
1.2.2.1. Mô hình Raster.12
1.2.2.2. Mô hình Vector.13
Chương 2: CÁC KỸTHUẬT NÂNG CAO CHẤT LƯỢNG ẢNH.14
2.1. CÁC KỸTHUẬT KHÔNG PHỤTHUỘC KHÔNG GIAN.14
2.1.1. Giới thiệu.14
2.1.2. Tăng giảm độsáng.14
2.1.3. Tách ngưỡng.15
2.1.4. Bó cụm.15
2.1.5. Cân bằng histogram.16
2.1.6. Kỹthuật tách ngưỡng tự động.17
2.1.7. Biến đổi cấp xám tổng thể.18
2.2. CÁC KỸTHUẬT PHỤTHUỘC KHÔNG GIAN.20
2.2.1. Phép cuộn và mẫu.20
5
2.2.2. Một sốmẫu thông dụng.21
2.2.3. Lọc trung vị.22
2.2.4. Lọc trung bình.24
2.2.5. Lọc trung bình theo k giá trịgần nhất.25
2.3. CÁC PHÉP TOÁN HÌNH THÁI HỌC. 26
2.3.1. Các phép toán hình thái cơbản.26
2.3.2. Một sốtính chất của phép toán hình thái.27
Chương 3: BIÊN VÀ CÁC PHƯƠNG PHÁP PHÁT HIỆN BIÊN.32
3.1. GIỚI THIỆU.32
3.2. CÁC PHƯƠNG PHÁP PHÁT HIỆN BIÊN TRỰC TIẾP.32
3.2.1. Kỹthuật phát hiện biên Gradient.32
3.2.1.1. Kỹthuật Prewitt.34
3.2.1.2. Kỹthuật Sobel.35
3.2.1.3. Kỹthuật la bàn.35
3.2.2. Kỹthuật phát hiện biên Laplace.36
3.3. PHÁT HIỆN BIÊN GIÁN TIẾP.37
3.3.1 Một sốkhái niệm cơbản.37
3.3.2. Chu tuyến của một đối tượng ảnh.38
3.3.3. Thuật toán dò biên tổng quát.40
Chương 4: XƯƠNG VÀ CÁC KỸTHUẬT TÌM XƯƠNG.44
4.1. GIỚI THIỆU.44
4.2. TÌM XƯƠNG DỰA TRÊN LÀM MẢNH.44
4.2.1. Sơlược vềthuật toán làm mảnh.44
4.2.2. Một sốthuật toán làm mảnh.46
4.3. TÌM XƯƠNG KHÔNG DỰA TRÊN LÀM MẢNH.46
4.3.1. Khái quát vềlược đồVoronoi.47
4.3.2. Trục trung vịVoronoi rời rạc.47
4.3.3. Xương Voronoi rời rạc. 48
4.3.4. Thuật toán tìm xương. 49
Chương 5: CÁC KỸTHUẬT HẬU XỬLÝ.52
5.1. RÚT GỌN SỐLƯỢNG ĐIỂM BIỂU DIỄN.52
5.1.1. Giới thiệu.52
6
5.1.2. Thuật toán Douglas Peucker.52
5.1.2.1. Ý tưởng.52
5.1.2.2. Chương trình.53
5.1.3. Thuật toán Band width. 54
5.1.3.1. Ý tưởng.54
5.1.3.2. Chương trình.56
5.1.4. Thuật toán Angles.57
5.1.4.1. Ý tưởng.57
5.1.4.2. Chương trình.57
5.2. XẤP XỈ ĐA GIÁC BỞI CÁC HÌNH CƠSỞ.58
5.2.1 Xấp xỉ đa giác theo bất biến đồng dạng.59
5.2.2 Xấp xỉ đa giác theo bất biến aphin.62
5.3. BIẾN ĐỔI HOUGH.63
5.3.1. Biến đổi Hongh cho đường thẳng.63
5.3.2. Biến đổi Hough cho đường thẳng trong tọa độcực.64
5.3.2.1. Đường thẳng Hough trong tọa độcực.64
5.3.2.2. Áp dụng biến đổi Hough trong phát hiện góc nghiêng văn bản
. 65
PHỤLỤC.68
TÀI LIỆU THAM KHẢO.76
7
Chương 1:
0x80 Count. Byte thứ hai cho biết độ dài dãy các pixel không giống nhau không nén được. 69 • Loại 4: Dãy các Pixel giống nhau. Tuỳ theo các bít cao của byte đầu tiên được bật hay tắt. Nếu bít cao được bật (giá trị 1) thỡ đây là gói nén các byte chỉ gồm bít 0, số các byte được nén được tính bởi 7 bít thấp còn lại. Nếu bớt cao tắt (giỏ trị 0) thì đây là gói nén các byte gồm toán bít 1. Số các byte được nén được tính bởi 7 bít còn lại. Các gói tin của file IMG rất đa dạng do ảnh IMG là ảnh đen trắng, do vậy chỉ cần 1 bít cho 1 pixel thay vì 4 hoặc 8 như đã nói ở trên. Toàn bộ ảnh chỉ có những điểm sáng và tối tương ứng với giá trị 1 hoặc 0. Tỷ lệ nén của kiểu định dạng này là khá cao. 2. Định dạng ảnh PCX Định dạng ảnh PCX là một trong những định dạng ảnh cổ điển. Nó sử dụng phương pháp mó hoỏ loạt dài RLE (Run – Length – Encoded) để nén dữ liệu ảnh. Quá trỡnh nộn và giải nộn được thực hiện trên từng dũng ảnh. Thực tế, phương pháp giải nén PCX kém hiệu quả hơn so với kiểu IMG. Tệp PCX gồm 3 phần: đầu tệp (header), dữ liệu ảnh (Image data) và bảng màu mở rộng. Header của tệp PCX có kích thước cố định gồm 128 byte và được phân bố như sau: • 1 byte: chỉ ra kiểu định dạng.Nếu là PCX/PCC thì nó luôn có giá trị là 0Ah. • 1 byte: chỉ ra version sử dụng để nén ảnh, có thể có các giá trị sau: + 0: version 2.5. + 2: version 2.8 với bảng màu. + 3: version 2.8 hay 3.0 không có bảng màu. + 5: version 3.0 cố bảng màu. • 1 byte: chỉ ra phương pháp mã hoá. Nếu là 0 thì mã hoá theo phương pháp BYTE PACKED, ngược lại là phương pháp RLE. • 1 byte: Số bít cho một điểm ảnh plane. • 1 word: toạ độ góc trái của ảnh. Với kiểu PCX nó có giá trị là (0,0), cũn PCC thì khác (0,0). • 1 word: toạ độ góc phải dưới. • 1 word: kích thước bề rộng và bề cao của ảnh. 70 • 1 word: số điểm ảnh. • 1 word: độ phân giải màn hình. • 1 word. • 48 byte: chia nó thành 16 nhóm, mỗi nhóm 3 byte. Mỗi nhóm này chứa thông tin về một thanh ghi màu. Như vậy ta có 16 thanh ghi màu. • 1 byte: không dùng đến và luôn đặt là 0. • 1 byte: số bớt plane mà ảnh sử dụng. Với ảnh 16 màu, giá trị này là 4, với ảnh 256 mầu (1pixel/8bits) thì số bít plane lại là 1. • 1 byte: số bytes cho một dòng quét ảnh. • 1 word: kiểu bảng màu. • 58 byte: không dùng. Định dạng ảnh PCX thường được dùng để lưu trữ ảnh và thao tác đơn giản, cho phép nén và giải nén nhanh. Tuy nhiên, vì cấu trúc của nó cố định, nên trong một số trường hợp làm tăng kích thước lưu trữ. Cũng vì nhược điểm này mà một số ứng dụng sử dụng một kiểu định dạng khác mềm dẻo hơn: định dạng TIFF (Targed Image File Format) sẽ mô tả dưới đây. 3. Định dạng ảnh TIFF Kiểu định dạng TIFF được thiết kế để làm nhẹ bớt các vấn đề liên quan đến việc mở rộng tệp ảnh cố định. Về cấu trúc, nó cũng gồm 3 phần chính: • Phần Header(IFH): cú trong tất cả cỏc tệp TIFF và gồm 8 byte: + 1 word: chỉ ra kiểu tạo tệp trên máy tính PC hay máy Macintosh. Hai loại này khác nhau rất lớn ở thứ tự các byte lưu trữ trong các số dài 2 hay 4 byte. Nếu trường này có giá trị là 4D4Dh thì đó là ảnh cho máy Macintosh, nếu là 4949h là của máy PC. + 1 word: version. từ này luôn có giá trị là 42. đây là đặc trưng của file TIFF và không thay đổi. + 2 word: giá trị Offset theo byte tính từ đầu tới cấu trúc IFD là cấu trúc thứ hai của file. Thứ tự các byte này phụ thuộc vào dấu hiệu trường đầu tiên. 71 • Phần thứ 2(IFD): Không ở ngay sau cấu trúc IFH mà vị trí được xác định bởi trường Offset trong đầu tệp. Có thể có một hay nhiều IFD cùng tồn tại trong một file. Một IFD bao gồm: + 2 byte: chứa các DE ( Directory Entry). + 12 byte là các DE xếp liên tiếp, mỗi DE chiếm 12 byte. + 4 byte: chứa Offset trỏ tới IFD tiếp theo. Nếu đây là IFD cuối cùng thì trường này có giá trị 0. • Phần thứ 3: các DE: các DE có dộ dài cố định gồm 12 byte và chia làm 4 phần: + 2 byte: chỉ ra dấu hiệu mà tệp ảnh đó được xây dựng. + 2 byte: kiểu dữ liệu của tham số ảnh. Có 5 kiểu tham số cơ bản: 1: BYTE (1 byte) 2: ASCII (1 byte) 3: SHORT (2 byte). 4: LONG (4 byte) 5: RATIONAL (8 byte) + 4 byte: trường độ dài chưa số lượng chỉ mục của kiểu dữ liệu đó chỉ ra. Nó không phải là tổng số byte cần thiết để lưu trữ. Để có số liệu này ta cần nhân số chỉ mục với kiểu dữ liệu đã dùng. + 4 byte: đó là Offset tới điểm bắt đầu dữ liệu liên quan tới dấu hiệu, tức là liên quan với DE không phải lưu trữ vật lý cùng với nó nằm ở một vị trí nào đó trong file. Dữ liệu chứa trong tệp thường được tổ chức thành các nhóm dòng (cột) quét của dữ liệu ảnh. Cách tổ chức này làm giảm bộ nhớ cần thiết cho việc đọc tệp. Việc giải nén được thực hiện theo 4 kiểu khác nhau được lưu trữ trong byte dấu hiệu nén. 72 4. Định dạng file ảnh BITMAP Mỗi file BITMAP gồm đầu file chứa các thông tin chung về file, đầu thông tin chứa các thông tin về ảnh, một bảng màu và một mảng dữ liệu ảnh. Khuôn dạng được cho như sau: BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; RGBQUAD aColors[]; BYTE aBitmapBits[]; Trong đó, các cấu trúc được định nghĩa như sau: typedef struct tagBITMAPFILEHEADER { /* bmfh */ UINT bfType; DWORD bfSize; UINT bfReserved1; UINT bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER { /* bmih */ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER, *LPBITMAPINFOHEADER; với biSize kích thước của BITMAPINFOHEADER biWidth Chiều rộng của ảnh, tính bằng số điểm ảnh biHeight Chiều cao của ảnh, tính bằng số điểm ảnh 73 biPlanes Số plane của thiết bị, phải bằng 1 biBitCount Số bit cho một điểm ảnh biCompression Kiểu nén biSizeImage Kích thước của ảnh tính bằng byte biXPelsPerMeter độ phân giải ngang của thiết bị, tính bằng điểm ảnh trên met biYPelsPerMeter độ phân giải dọc của thiết bị, tính bằng điểm ảnh trên met biClrUsed Số lượng các màu thực sự được sử dụng biClrImportant Số lượng các màu cần thiết cho việc hiển thị, bằng 0 nếu tất cả các màu đều cần để hiển thị Nếu bmih.biBitCount > 8 thì mảng màu rgbq[] trống, ngược lại thì mảng màu có 2<< bmih.biBitCount phần tử. typedef struct tagRGBQUAD { /* rgbq */ BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; Ta cũng có: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO, *PBITMAPINFO; 74 Phụ lục 2: CÁC BƯỚC THAO TÁC VỚI FILE AVI AVI là chuẩn video thường được tích hợp trong các thư viện của các môi trường lập trình. Để xử lý video, cần có các thao tác cơ bản để chuyển về xử lý ảnh các khung hình (các frames). 1. Bước 1: Mở và đóng thư viện Trước mọi thao tác với file AVI, chúng ta phải mở thư viện: AVIFileInit( ) Hàm này không cần tham số, có nhiệm vụ khởi động thư viện cung cấp các hàm thao tác với file AVI. (Đó là thư viện vfw32.lib, được khai báo trong file vfw.h). Sau tất cả các thao tác bạn phải nhớ đóng thư viện đã mở lúc đầu, chỉ bằng lệnh: AVIFileExit( ) Nếu thiếu bất cứ hàm nào, dù là mở hay đóng thư viện thì trình biên dịch đều sẽ thông báo lỗi. 2. Bước 2: Mở và đóng file AVI để thao tác: Sau khi mở thư viện, bạn phải mở file AVI bạn định thao tác: AVIFileOpen(PAVIFILE* ppfile, LPCSTR fname, UINT mode, CLSID pclsidHandler) Thực chất, hàm này tạo ra một vùng đệm chứa con trỏ trỏ đến file có tên là fname cần mở. Và ppfile là con trỏ trỏ đến vùng bộ đệm đó. Tham số mode quy định kiểu mở file; chẳng hạn OF_CREATE để tạo mới, OF_READ để đọc, OF_WRITE để ghi …. Tham số cuối dùng là NULL. Trước khi đóng thư viện, bạn phải đóng file AVI đã mở, bằng cách dùng hàm: AVIFileRelease(PAVIFILE pfile) Trong đó, pfile là con trỏ trỏ đến file cần đóng. 75 3. Bước 3: Mở dòng dữ liệu hình ảnh hay âm thanh trong file AVI đã mở ra để thao tác: AVIFileGetStream(PAVIFILE pfile, PAVISTREAM * ppavi, DWORD fccType, LONG lParam) Trong đó, pfile là con trỏ đến file đã mở; ppavi trỏ đến dòng dữ liệu kết quả; fccType là loại dòng dữ liệu chọn để mở, là streamtypeAUDIO nếu là tiếng và streamtypeVIDEO nếu là hình,… lParam đếm số loại dòng được mở, là 0 nếu chỉ thao tác với một loại dòng dữ liệu. Sau các thao tác với dòng dữ liệu này, bạn nhớ phải đóng nó lại: AVIStreamRelease(PAVITREAM pavi). 4. Bước 4: Trường hợp thao tác với dữ liệu hình của phim Chuẩn bị cho thao tác với khung hình (frames): AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted) Trong đó pavi trỏ đến dòng dữ liệu đã mở, lpbiWanted là con trỏ trỏ đến cấu trúc mong muốn của hình ảnh, ta dùng NULL để sử dụng cấu trúc mặc định. Hàm này trả về đối tượng có kiểu PGETFRAME để dùng cho bước 5. Sau khi thao tác với các frame rồi, phải gọi hàm : AVIStreamGetFrameClose(PGETFRAME pget) 5. Bước 5: Thao tác với frame Dùng hàm AVIStreamGetFrame(PGETFRAME pget, LONG lpos) Hàm này trả về con trỏ trỏ đến dữ liệu của frame thứ lpos. Dữ liệu đó có kiểu là DIB đã định khối. Thực hiện các thao tác mong muốn. 76 TÀI LIỆU THAM KHẢO [1]. Lương Mạnh Bá, Nguyễn Thanh Thủy (2002), Nhập Môn Xử lý ảnh số, Nxb Khoa học và Kỹ thuật, 2002. [2]. Anil K.Jain (1989), Fundamental of Digital Image Processing. Prentice Hall, Engwood cliffs. [3]. J.R.Paker (1997), Algorithms for Image processing and Computer Vision. John Wiley & Sons, Inc. [4]. Randy Crane (1997), A simplified approach to image processing, Prentice-Hall, Inc. [5]. John C.Russ (1995), The Image Procesing Handbook. CRC Press, Inc. [6]. Adrian Low (1991), Introductory Computer Vision and Image Processing, Copyright (c) 1991 by McGrow Hill Book Company (UK) Limited. [7]. T. Pavlidis (1982), Algorithms for Graphics and Image Processing, Computer Science Press.
File đính kèm:
- Giáo trình Xử lý ảnh.pdf