b. Biến đổi Wavelet rời rạc 2-D
2.2.3 So sánh JPEG và JPEG2000
– JPEG2000 đưa ra cả hai kỹ thuật nén có tổn thất và không tổn thất theo cùng một cơ chế mã hoá:
JPEG2000 thực hiện tất cả các dạng thức của JPEG chỉ bằng một cơ chế mã hoá duy nhất. Có thể thấy rằng JPEG2000 có tính mềm dẻo hơn JPEG. Hơn thế, chúng ta đã thấy rằng tất cả các phương pháp thiết kế cho chuẩn JPEG2000 đều ưu việt và có nhiều tính năng hơn so với JPEG; ngoài ra những thống kê và thực tế cho thấy với cùng một tỷ lệ nén và một loại ảnh thì ảnh được nén bởi JPEG2000 hầu như luôn có chất lượng tốt hơn so với JPEG. Chúng ta xem xét hai ảnh trên hình 2.12 để thấy rõ điều này.
Hình 2.12 So sánh JPEG, JPEG2000
– Trong dạng thức nén có tổn thất thông tin, JPEG2000 có thể đưa ra tỷ lệ nén cao hơn nhiều so với JPEG. Các phần mềm nén ảnh JPEG hiện tại (kể cả photoshop) cũng chỉ thiết kế để có thể nén ảnh được với tỷ lệ 40:1 nhưng với JPEG2000 thì tỷ lệ nén có thể lên tới 200:1. Theo công thức tính PSNR trong đơn vị dB, ta có b là số bít dùng biểu diễn một pixel trên ảnh gốc.
PSNR(dB) = – 20 log[RMSE/2b – 1] (2.7)
Với hai ảnh ở hình 2.12, so sánh về tham số PSNR cho trên bảng 2.1. Để có thể so sánh dễ dàng hơn, ta xét ảnh được nén với các tỷ lệ khác nhau (đo lường bởi hệ số bit/pixel hay bpp). Tất cả các số liệu trên bảng đều cho thấy JPEG2000 nén ảnh tốt
hơn là JPEG; hơn thế hệ số PSNR mà chúng ta xét trong bảng được đo trong hệ đơn vị logarit.
Bảng 2.1 Số bit mỗi pixel
Bit per pixel 0,125 0,50 2,00
Ảnh 1 theo Jpeg 24,12 31,17 35,15
Ảnh 1 theo Jpeg2000 28,12 32,95 37,35
Ảnh 2 theo Jpeg 22,6 28,92 35,99
Ảnh 2 theo Jpeg2000 24,85 31,13 38,80
Hình 2.13 Tỉ lệ nén của JPEG2000 và JPEG
– Chuẩn nén ảnh JPEG2000 có thể hiển thị được các ảnh với độ phân giải và kích thước khác nhau từ cùng một ảnh nén. Với JPEG thì điều này là không thể thực hiện được. Sở dĩ có điều này là do JPEG2000 sử dụng kỹ thuật phân giải ảnh và mã hoá đính kèm.
Tính năng này là một lợi thế đặc biệt quan trọng của JPEG2000, trong khi JPEG cũng như các chuẩn nén ảnh tĩnh trước đây phải nén nhiều lần để thu được chất lượng với từng lần nén khác nhau thì với JPEG2000 ta chỉ cần nén một lần còn chất lượng ảnh thì sẽ được quyết định tuỳ theo người sử dụng trong quá trình giải nén ảnh theo
JPEG2000. Một tính năng ưu việt nữa của JPEG2000 là tính năng mã hoá ảnh quan trọng theo vùng (ROI). Chất lượng của toàn bộ ảnh có thể được thấy rõ trong hình.
Hình 2.14 Minh hoạ tính năng ROI
Như chúng ta thấy trên hình 2.14, chất lượng của vùng ảnh được lựa chọn tăng cao hơn khi vùng đó được áp dụng phương pháp ROI.
– JPEG2000 còn có một khả năng đặc biệt ưu việt hơn so với JPEG, đó chính là khả năng vượt trội trong khôi phục lỗi. Đó là khi một ảnh được truyền trên mạng viễn thông thì thông tin có thể bị nhiễu, với các chuẩn nén ảnh như JPEG thì nhiễu này sẽ được thu vào và hiển thị, tuy nhiên với JPEG2000, do đặc trưng của phép mã hoá có thể chống lỗi, JPEG2000 có thể giảm thiểu các lỗi này tới mức hầu như không có.
2.3 Kết luận chương 2
Chương này đã giới thiệu cho ta một số vấn đề liên quan đến kĩ thuật nén ảnh và giới thiệu và so sánh hai chuẩn nén ảnh phổ biến hiện nay JPEG và JPEG 2000. Tận dụng các ưu điểm của hai kĩ thuật nén ảnh này, người ta đã sử dụng chúng rất nhiều trong các ứng dụng không dây. Ngoài hai chuẩn này ra, nếu quan tâm ta có thể tìm hiểu về một số kĩ thuật nén ảnh khác mới xuất hiện gần đây như định dạng Windows Media Photo (HD Photo), chương trình My Photo Zip dùng cho nén ảnh đồ họa.
CHƯƠNG 3
CHƯƠNG TRÌNH MÔ PHỎNG
Trong hai chương trên, ta đã đề cập đến các kĩ thuật nâng cao chất lượng ảnh và nén ảnh và đã nhận thấy được tầm quan trọng của vấn đề này. Ngày nay, khi mà khoa học kĩ thuật và công nghệ ngày càng phát triển thì người ta càng nghĩ đến chuyện làm thế nào để đưa các vấn đề trên ứng dụng vào thực tiễn. Vì vậy, cần thiết phải xây dựng được chương trình mô phỏng cho các vấn đề này. Đồ án này xây dựng chương trình mô phỏng bằng ngôn ngữ Matlab.
3.1 Ngôn ngữ Matlab
Hiện nay, có rất nhiều ngôn ngữ lập trình đang được quan tâm và ứng dụng. Các ngôn ngữ lập trình như Basic, Pascal, C, Java... được sử dụng rộng rãi trong nhiều lĩnh vực. Trong số đó, Matlab là một ngôn ngữ rất mạnh được sử dụng rộng rãi trong nhiều lĩnh vực. Nó dễ dàng sử dụng hơn các ngôn ngữ khác. Matlab cho phép tính toán số với ma trận, vẽ đồ thị hàm số hay biểu đồ thông tin, thực hiện thuật toán, tạo các giao tiếp người dùng và liên kết với những chương trình máy tính viết trên nhiều ngôn ngữ lập trình khác. Phần mềm MATLAB còn được trang bị thêm thư viện cho các lĩnh vực ứng dụng rất đa dạng như xử lí tín hiệu, nhận dạng hệ thống, xử lí ảnh, mạng nơ ron, logic mờ, tài chính, tối ưu hóa, phương trình đạo hàm riêng, sinh tin học, ... Đây là các tập hợp mã nguồn viết bằng chính MATLAB dựa theo các thuật toán mới, hữu hiệu mà người dùng có thể chỉnh sửa hoặc bổ sung thêm các hàm mới. Với thư viện Toolbox, Matlab cho phép mô phỏng tính toán, thực nghiệm nhiều mô hình trong thực tế và kỹ thuật. Chính vì các ưu điểm đó mà trong đồ án này, em quyết định chọn ngôn ngữ lập trình Matlab để mô phỏng các kĩ thuật nâng cao chất lượng và nén ảnh.
3.1.1 Sơ lược lịch sử Matlab
Matlab là từ viết tắt của "MATrix LABoratory", được phát minh vào cuối thập niên 1970 bới Cleve Moler.
Ban đầu, MATLAB được viết bởi ngôn ngữ Fortran. Cho đến 1980, nó vẫn chỉ là một bộ phận được dùng nội bộ của Đại Học Standford.
Năm 1983, Jack Little đã viết lại MATLAB bằng ngôn ngữ C và nó được xây dựng thêm các thư viện phục vụ cho thiết kế hệ thống điều khiển, hệ thống Hộp Công Cụ (Tool box), mô phỏng ... Jack xây dựng MATLAB trở thành mô hình ngôn ngữ lập trình cơ sở ma trận (matrix-based programming language). Steve Bangert là người đã thực hiện trình thông dịch cho MATLAB. Công trình này tốn gần một năm rưỡi. Sau này, Jack Little kết hợp với Moler và Steve Bangert quyết định đưa Matlab thành dự án thương mại - công ty The MathWorks ra đời thời gian này - năm 1984.
Phiên bản đầu tiên MATLAB 1.0 ra đời năm 1984 viết bằng C cho MS-DOS PC được phát hành đầu tiên tại IEEE Conference on Design and Control (hội nghị IEEE về thiết kế và Điều khiển) tại Las Vegas, bang Nevada Hoa Kì.
Năm 1986, MATLAB 2 ra đời trong đó hỗ trợ UNIX. Năm 1987, MATLAB 3 phát hành.
Năm 1990 Simulink 1.0 được phát hành chung với MATLAB
Năm 1992 MATLAB 4 thêm vào hỗ trợ 2-D và 3-D đồ họa màu và các ma trận truy tìm. Năm này cũng cho phát hành phiên bản MATLAB Student Edition (MATLAB ấn bản cho học sinh)
Năm 1993 MATLAB cho MS Windows ra đời. Đồng thời công ty này có WEB site là mathwork.com.
Năm 1995 MATLAB cho LINUX ra đời. Trình dịch MATLAB có khả năng chuyển dịch từ ngôn ngữ MATLAB sang ngôn ngữ C cũng được phát hành trong dịp này.
Năm 1996 MATLAB 5 bao gồm thêm các kiểu dữ liệu, phát triển hình ảnh hoá, bộ truy sửa lỗi (debugger), và giao diện đồ họa GUI.
Năm 2002 MATLAB 6.5 phát hành, sử dụng phương pháp dịch JIT (Just in Time) và tái hỗ trợ MAC.
Năm 2004 MATLAB 7 phát hành, có khả năng chính xác đơn và kiểu nguyên, hỗ trợ hàm lồng nhau, công cụ vẽ điểm, và phát triển thuật toán tương tác.
Hiện nay, đã là phiên bản 14 với SP3 cải thiện Simulink cùng với hơn 75 sản phẩm khác.
Matlab được dùng rộng rãi trong giáo dục, phổ biến nhất trong lĩnh vực đại số tuyến tính và giải tích.
3.1.2 Đặc điểm của Matlab và các ứng dụng
MATLAB – phần mềm nổi tiếng của công ty MathWorks, là một ngôn ngữ hiệu năng cao cho tính toán kỹ thuật như được viết trong logo của phần mềm này. Nó tích hợp tính toán, hiển thị và lập trình trong một môi trường dễ sử dụng. Các ứng dụng tiêu biểu của MATLAB bao gồm:
Hỗ trợ toán học và tính toán.
Phát triển thuật toán.
Mô hình, mô phỏng.
Phân tích, khảo sát và hiển thị số liệu.
Đồ họa khoa học và kỹ thuật
Phát triển ứng dụng với các giao diện đồ họa.
Tên của phần mềm MATLAB bắt nguồn từ thuật ngữ “Matrix Laboratory”. Đầu tiên nó được viết bằng FORTRAN để cung cấp truy nhập dễ dàng tới phần mềm ma trận được phát triển bởi các dự án LINPACK và EISPACK. Sau đó nó được viết bằng ngôn ngữ C trên cơ sở các thư viện nêu trên và phát triển thêm nhiều lĩnh vực của tính toán khoa học và các ứng dụng kỹ thuật.
Matlab là một môi trường tính toán số và lập trình. Matlab cho phép tính toán số với ma trận, vẽ đồ thị hàm số hay biểu đồ thông tin, thực hiện thuật toán, tạo các giao tiếp người dùng và liên kết với những chương trình máy tính viết trên nhiều ngôn ngữ lập trình khác. Vì vậy, Matlab là một ngôn ngữ rất mạnh được sử dụng rộng rãi trong nhiều lĩnh vực. Nó dễ dàng sử dụng hơn các ngôn ngữ khác như Basic, Pascal, C...
Phần mềm MATLAB còn được trang bị thêm các ToolBox – các gói chương trình (thư viện) cho các lĩnh vực ứng dụng rất đa dạng như xử lí tín hiệu, nhận dạng hệ thống, xử lí ảnh, mạng nơ ron, logic mờ, tài chính, tối ưu hóa, phương trình đạo hàm riêng, sinh tin học, ... Đây là các tập hợp mã nguồn viết bằng chính MATLAB dựa theo các thuật toán mới, hữu hiệu mà người dùng có thể chỉnh sửa hoặc bổ sung thêm các hàm mới. Với thư viện Toolbox, Matlab cho phép mô phỏng tính toán, thực nghiệm nhiều mô hình trong thực tế và kỹ thuật.
MATLAB được thiết kế để giải các bài toán bằng số chứ không nhằm mục đích chính là tính toán ký hiệu như MATHEMATICA và MAPLE. Tuy nhiên, trong MATLAB cũng có thể tính toán ký hiệu được nhờ các hàm trong Symbolic Math ToolBox.
3.2 Chương trình mô phỏng sử dụng Matlab3.2.1 Giao diện chương trình mô phỏng3.2.1 Giao diện chương trình mô phỏng3.2.1 Giao diện chương trình mô phỏng 3.2.1 Giao diện chương trình mô phỏng
Matlab cung cấp thư viện guide để người sử dụng có thể tự tạo giao diện cho riêng mình. Trong guide, thanh công cụ hỗ trợ rất nhiều cho người sử dụng.
Các công cụ trong thanh công cụ của GUIs:
- Static Text: Ta có thể nhập các đoạn text vào đây. Các đoạn text này dùng để chú thích và không thể thay đổi.
- Edit Text: Ta có thể nhập các đoạn text vào đây. Tuy nhiên, khi chạy chương trình, các đoạn text này có thể thay đổi được. Ví dụ, ta có thể sử dụng edit text để nhập và thay đổi các tham số của chương trình.
- Push Button: Nút chạy chương trình. Khi ấn nút, chương trình mà ta đã lựa chọn sẽ chạy. Ví dụ, các nút xử lí (chạy đoạn chương trình mô phỏng), nút đóng (đóng cửa sổ chương trình hiện thời lại), nút quay lại (quay lại cửa sổ chương trình trước đó), nút thông tin (xem thêm một số thông tin về chương trình đang chạy) ...
- Axes: Các axes được sử dụng để hiển thị các ảnh hoặc đồ thị của chương trình.
- Radio Button và Check Box: Ta có thể tích vào nút này để lựa chọn hoặc không lựa chọn một trong chương trình để chạy mô phỏng.
- Pop-up Menu và Listbox: Ta có thể lựa chọn một trong các chương trình trong Pop-up Menu và Listbox, các chương trình này người sử dụng tự nhập vào và không thể thay đổi được.
- Toggle Button và Panel: Được sử dụng để gom các nút trong chương trình cho gọn, hoặc là để ngăn cách giữa các nhóm chương trình để giao diện đẹp hơn và đỡ rối.
Ngoài ra, thanh công cụ còn có Button Group, Slider nhưng trong đồ án này ta không sử dụng tới.
Ví dụ, giao diện chương trình mô phỏng nâng cao chất lượng và nén ảnh dưới đây đã sử dụng hai công cụ Static Text và Push Button. Người sử dụng còn có thể dễ dàng lựa chọn màu sắc, font chữ, kích thước và màu sắc chữ cho chương trình.
Hình 3.1 Giao diện chương trình nâng cao chất lượng và nén ảnh
Sau đây là các chương trình mô phỏng trong đồ án.
3.2.2 Nâng cao chất lượng ảnh
3.2.2.1 Biến đổi mức xám
Hình 3.2 minh họa giao diện chương trình mô phỏng các phương pháp biến đổi ảnh xám. Phần lí thuyết về các phương pháp biến đổi ảnh xám đã được trình bày kĩ trong chương 1.
Chương trình mô phỏng trong hình 3.2 đã sử dụng các công cụ: Edit Text, Static Text, Axes, Pop-up Menu, Push Button và Toggle Button trong thanh công cụ của GUIs.
Hình 3.2 Giao diện chương trình biến đổi ảnh xám
a. Biến đổi mức xám sử dụng hàm imadjust
Để sử dụng chương trình mô phỏng các phương pháp biến đổi ảnh xám, ta chỉ cần nhập ảnh vào bằng cách ấn nút “Mở file ảnh”, ta có thể lựa chọn bất kì file ảnh nào có sẵn trong file matlab đang chạy chương trình. Sau đó, ảnh vừa chọn sẽ được nhập vào axes, ta chọn “Biến đổi mức xám nhờ hàm imadjust” trong “Lựa chọn phương pháp biến đổi:” và nhập các giá trị tham số: dải mức xám đầu vào, đầu ra (nằm trong khoảng từ 0 đến 1) và gamma. Rồi cuối cùng ta ấn nút “Xử lí”. Với dải mức xám đầu vào từ 0 đến 0.5, đầu ra từ 0.2 đến 1 và tham số gamma = 0.3, ta có ảnh biến đổi mức xám sử dụng hàm imadjust như hình 3.2. Nếu muốn biết thêm thông tin về phương pháp biến đổi mức xám sử dụng hàm imadjust cũng như các phương pháp khác trong biến đổi ảnh xám, ta có thể lựa chọn xem trong phần “Thông tin”.
Cách sử dụng của các chương trình mô phỏng trong đồ án đều tương tự như vậy. Hàm imadjust được sử dụng trong mô phỏng này là công cụ xử lí ảnh IPT (Image Processing Toolbox) cơ bản cho các biến đổi mức xám của các ảnh xám. Nó có cú pháp:
g = imadjust(f, [low_in high_in], [low_out high_out], gamma)
Hàm này ánh xạ các giá trị mức xám trong ảnh f đến giá trị mới g, (các giá trị giữa low_in và high_in ánh xạ đến giá trị low_out và high_out).
Hình 3.3 Đồ thị của các giá trị trong hàm imadjust
Các giá trị dưới low_in và trên high_in đều bị cắt đi, các giá trị dưới low_in ánh xạ tới low_out và các giá trị trên high_in ánh xạ tới high_out. Ảnh vào và ảnh ra có thể là của lớp uint8, uint16 hoặc double. Tất cả ảnh vào dù là thuộc lớp nào thì khi xử lí bằng hàm imadjust đều được xác định giá trị từ 0 đến 1. Nếu f thuộc lớp uint8 thì các giá trị thực tế sử dụng là các giá trị đã cho cho nhân với 255; nếu f thuộc lớp uint16 thì các giá trị đã cho nhân với 65535. Nếu [low_in high_in] hoặc [low_out high_out] là ma trận rỗng ([ ]), ta có các giá trị mặc định [0 1]. Nếu high_out nhỏ hơn low_out thì mức xám đầu ra đảo ngược lại.
Tham số gamma xác định dạng đường cong để ánh xạ các giá trị mức xám của f để tạo g. Nói dễ hiểu hơn, gamma xác định độ tương phản của ảnh ra. Nếu gamma nhỏ hơn 1 thì ánh xạ có trọng số hướng về các giá trị ra cao hơn (ảnh ra có độ tương phản thấp hơn). Nếu gamma lớn hơn 1 thì ánh xạ có trọng số hướng về các giá trị ra thấp hơn (ảnh ra có độ tương phản cao hơn). Nếu hàm là g = imadjust(f, [low_in high_in], [low_out high_out]) thì gamma mặc định là 1.
b. Biến đổi âm bản
Ảnh âm bản có thể thu được nhờ hàm imadjust: g = imadjust(f, [0 1], [1 0]);
Hình 3.4 (a) Ảnh gốc – (b) Ảnh âm bản