Tổng quan về dữ liệu ảnh
Xem bai viet bang font ABC

    Việc tạo ra hình ảnh trong lịch sử loài người khởi đầu bằng việc khắc các hình trên đá, sau đó là vẽ trên giấy, lụa, sơn mài, sử dụng máy chụp hình.... Khi máy tính và kỹ thuật số ra đời cùng với những thiết bị đồ họa chuyên dụng khác, con người có thêm một công cụ mới để tạo lập, lưu trữ và xử lý dữ liệu ảnh.

    ảnh thực chất là một tập hợp các điểm màu liên tiếp xếp liền nhau, hoặc một tập hợp các đường hình học nhằm miêu tả một phogn cảnh, sự vật hay một chủ đề nào đó. Trên máy tính, ảnh được lưu trên các file nhị phân, theo các định dạng do nhà sản xuất quy định. Hiện tại có hơn 50 định dạng ảnh khác nhau, được chia làm hai loại cơ bản là ảnh bitmap và ảnh vector.

    ảnh bitmap là loại ảnh được lưu trữ theo dạng từng điểm màu được xếp liền nhau theo một thứ tự nhất định do người định dạng ảnh quy định và có thể được nén bằng một vài thuật toán nén dữ liệu do người định dạnh ảnh chọn. Đây là loại ảnh có chất lượng lưu trữ tốt, hình ảnh và màu sắc trung thực, nhưng lại tốn không gian lưu trữ, tốc độ hiển thị chậm và tương đối phức tạp trong việc xử lý. Một vài ví dụ về các loại ảnh bitmap phổ biến là GIF, PCX, BMP, TIF, RLE, ICO, GEM Image...

    ảnh vector là loại ảnh được lưu trữ theo cách mô tả đường biên của các đối tượng trong ảnh như là các hình và các đường hình học, ví dụ như elíp (ellipse), đa giác (polygon), hình cung (arc), đường thẳng (line), chữ nhật (rectangle)... Việc lưu trữ ảnh vector thực chất là lưu trữ lại các lệnh dùng để vẽ lại ảnh đó. Aảnh vector được lưu trữ dưới dạng hình học nên chất lượng lưu trữ không tốt lắm, nhưng bù vào đó, kích thước file ảnh tương đối nhỏ và việc xử lý ảnh rất đơn giản, thông qua các hàm toán học. Các file ảnh vector phổ biến hiện nay là WMF, CGM, CDR, GEM Metafile...

    Đi sâu vào chi tiết lưu trữ, một file ảnh bao giờ cũng có ba phần cơ bản là phần đầu (header), bảng màu (palette) và dữ liệu (data). Một vài ảnh được sử dụng trong Windows hay XWindows để tạo giao diện như Icon, Cursor... thì có thêm phần nhận dạng resource (resource id).

    Phần header cho biết các thông tin về bản thân ảnh như chiều dài, chiều rộng, vị trí bắt đầu hiện trên thiết bị (màn hình, máy in, máy vẽ...), số màu..., và cho biết về cấu trúc file ảnh như kiểu nén dữ liệu, vùng bắt đầu dữ liệu, vị trí bảng màu...

    Phần bảng màu dùng để lưu trữ mô tả theo dạng Red - Green - Blue cho tập hợp các màu dùng trong ảnh. Sở dĩ cần có bảng màu cho mỗi ảnh vì số màu thể hiện được trên thiết bị hiện nay còn hạn chế, cụ thể là trên màn hình VGA và Super VGA chỉ có 256 màu (màn hình 16 triệu màu còn chưa phổ biến). Trong khi đó các ảnh tự nhiên màu sắc lại rất phong phú và khi được đưa vào máy tính dưới dạng ảnh màu thì mỗi ảnh lại sử dụng một tập hợp màu khác nhau. Vì vậy, để có thể lưu trữ, hiển thị và xử lý trên các ảnh, người ta quyết định việc lưu trữ và hiển thị mỗi màu dưới dạng một chỉ số X nào đó, mà cách thể hiện của màu mang chỉ số X này được quyết định bởi giá trị của thành phần thứ X trong palette màu.

    Ví dụ một điểm màu được lưu trữ với mã số là 5, đối với ảnh có palette màu P mà thành phần P[5] = (R:0, G:0, B:0) thì sẽ được hiện ra màu đen, đối với ảng có palette màu thành phần P[5] = R:0, G:0, B:255) sẽ hiện ra màu xanh dương rất sáng, còn nếu palette màu của ảnh có P[5] = R:255, G:255, B:255) thì sẽ hiện ra màu trắng. Bằng cách này tại mỗi thời điểm người ta có thể hiện trên thiết bị từng ảnh khác nhau có các tập hợp màu hoàn toàn khác nhau, hoặc đối với các ảnh mà palette màu không khác nhau nhiều lắm, người ta có thể thực hiện việc ghép hai palette theo thuật toán nào đó để cùng hiện một lúc mà không làm thay đổi nhiều về độ trung thực của ảnh.

    Phần dữ liệu ảnh, đối với ảnh bitmap là dãy các điểm màu xếp theo thứ tự, có nén hoặc không nén, còn đối với ảnh vector thì là các lệnh vẽ metafile hoặc GDI (Graphics Device Interface) nhằm vẽ ra các đối tượng trong ảnh.

    Đối với ảnh bitmap, nếu lưu trữ mỗi điểm màu như là một byte chỉ mã số màu thì kích thước ảnh sẽ rất lớn, tốn không gian lưu trữ trên thiết bị. Do đó các ảnh khi lưu trữ phải được nén lại theo một thuật nào đó.

    Dưới đây tôi xin trình bày về một số giải thuật nén ảnh thường dùng.

    Đơn giản nhất là cơ chế đóng gói theo bit. Đối với các ảnh có số màu nhỏ hơn 256, nhiều điểm ảnh được chứa vào trong một byte (8 bit). Cụ thể là ảnh 16 màu có các giá trị màu từ 0 đến 15, biểu diễn bằng 4 bit nên một byte chứa 2 điểm, ảnh 2 màu chỉ có 2 giá trị 0 và 1, một byte chứa được 8 điểm. Đây thực ra không hẳn là giải thuật nén dữ liệu. Đa số các ảnh BMP nói chung sử dụng lối lưu trữ này.

    Cách nén thứ hai là nén theo đường chạy (run-length). Cách nén này dựa trên việc đếm số các byte liên tiếp có cùng giá trị sau đó lưu trữ trong hai byte, byte thứ nhất chỉ ra số lượng các byte có cùng giá trị, byte thứ hai là giá trị trùng đó.

Ví dụ dãy các byte:

được nén thành:

    Tất nhiên thực tế không hẳn đơn giản như thế bởi vì trong một dãy các byte xếp liền nhau thì biết đâu là byte lặp, đâu là byte giá trị. Mỗi người sử dụng giải thuật run-length phải tự đề ra cách giải quyết khác nhau để khắc phục tình trạng này. Ví dụ như giải thuật SunRaster run-length sử dụng một byte mang một giá trị đặc biệt là 128 để báo hiệu sự hiện diện của đường chạy. ZSoft Corporation lại đưa ra cách nhận dạng byte lặp bằng cách kiểm tra 2 bit cao của mỗi byte trong phần dữ liệu. Nếu 2 bit cao bằng 1 thì đó là byte lặp. Với quy định như vậy, chiều dài của một đường chạy không thể dài hơn 63, và đối với các byte giá trị có 2 bit cao bằng 1 thì luôn luôn phải có byte lặp đi trước, mặc dù có thể chỉ có 1 byte giá trị đó trong đường chạy. Các ảnh PCX, SunRaster, RLE, một vài loại ảnh BMP... sử dụng giải thuật nén này và mỗi loại ảnh có cách nhận dạng byte lặp khác nhau.

    Phát triển tư tưởng nói trên, người ta nhận thấy có các chuổi dữ liệu không bằng nhau được lặp đi lặp lại nhiều lần trong dòng dữ liệu thì có thể được sử dụng một cách rất tốt để nén dữ liệu. Một mã duy nhất có thể được gán cho một chuổi tuần tự và được lưu trữ vào trong file dữ liệu.

Ví dụ dãy các byte:

được nén thành

từ 14 byte nén thành 6 byte, C1 và C2 biểu diễn cho mã được gán cho chuổi dữ liệu.

    Như vậy, bảng đối chiếu các mã và chuổi tương ứng với nó phải được lưu trữ lại và được gọi là "Code Book". Nếu "Code Book" khá lớn thì cũng tốn không gian lưu trữ và làm giảm đáng kể hiệu quả của thuật toán nén dữ liệu. Thuật toán nén được phát triển bởi Lempel -Ziv và Welch, thường được biết tới với tên gọi là thuật toán LZW, đã có một cách xử lý rất thông minh để khỏi phải lưu trữ "Code Book". Thuật toán LZW dựa trên một ý tưởng rất đơn giản là người mã hóa và người giải mã cùng xây dựng "Code Book" khi mà dòng dữ liệu được xử lý tuần tự.

    Người mã hóa đưa ra một mẫu code khi nó được tìm thấy nhiều hơn một lần. Lần đầu tiên chuổi dữ liệu được xử lý, nó được đưa vào trong "Code Book" và chuổi được đưa thẳng ra file không bị mã hóa. Người giải mã có thể nhận ra chuổi này và đưa nó vào "Code Book" khi xây dựng "Code Book" cũ. Người mã hóa khi gặp lại mẫu này sẽ đưa ra file mã của chuổi trong "Code Book". Người giải mã có thể nhận ra chuổi đã mã hóa bởi vì nó đã có trong "Code Book" được xây dựng từ chuổi trước đó. Thuật toán này làm việc rất tốt trên nhiều loại dữ liệu. Unix Compress Utility của hệ điều hành UNIX và chương trình nén ARC trên PC cũng dựa trên cơ sở LZW. Bạn đọc quan tâm tới chi tiết thuật toán này có thể liên hệ trực tiếp với Welch Licensing Department, Law Department, M/SC2SW1, Pensylvania, 19424-0001.

    Trong việc lưu trữ dữ liệu ảnh, ảnh GIF do CompuServe Incorporated đưa ra sử dụng nén LZW theo độ dài bit biến động từ 2 đến 12 bit, ảnh PostScript do Adobe Systems Incoporated đưa ra sử dụng nén LZW theo độ dài 8 bit, ảnh TIFF của Aldus Corporation đưa ra sử dụng nén LZW theo độ dài 8 bit. Nhân tiện xin nói thêm là ảnh GIF là định dạng ảnh được nén nhỏ nhất hiện nay trên thế giới.

    Ngoài ra còn một số thuật toán khác không phổ biến lắm như Fractals, DCT, Huffman...

    Còn đối với ảnh vector, phần dữ liệu thực chất chỉ là dãy các lệnh vẽ, không có gì đáng nói. Trên mỗi hệ thống như PC, Mac, Unix, Windows, OS/2... tập các lệnh vẽ có thể khác nhau tùy theo định dạng ảnh đó được xây dựng trên hệ thống nào. Tuy nhiên, đây chỉ là các lệnh Graphics nên việc hiện ảnh vector của một hệ thống này trên một hệ thống khác đơn thuần chỉ là việc chuyển đổi lệnh vẽ.

    Trên máy tính, dữ liệu ảnh giữ một vai trò quan trọng và phạm vi ứng dụng của nó rất phong phú.

    Trong việc quản lý cơ sở dữ liệu, dữ liệu ảnh giúp cho cơ sở dữ liệu thêm phần trực quan. Ví dụ như quản lý nhân sự có sử dụng dữ liệu ảnh giúp người lãnh đạo nhận biết tốt hơn về nhân viên của mình. Trong công tác thiết kế máy móc và xây dựng, dữ liệu ảnh cho phép cán bộ chuyên môn có thể thiết kế các mẫu chế tạo trên máy tính, giảm thời gian và giá thành thực hiện công trình. Trong công tác khoa học, việc mô phỏng ảnh của các hiện tượng trên máy tính có thể hổ trợ đắc lực cho công tác nghiên cứu. Trong lĩnh vực trò chơi, việc sử dụng dữ liệu ảnh là điều tất nhiên. Sử dụng ảnh trong các phần mềm giáo dục và hướng dẫn du lịch làm cho các phần mềm này thêm sinh động và gây hứng thú cho người sử dụng. Dữ liệu ảnh còn được sử dụng trong công tác quản lý bản đồ và tài nguyên môi trường. Trong lĩnh vực thiết kế giao diện và phát triển phần mềm, tất cả các phần mềm GUIs (Graphical User Interface) đều sử dụng dữ liệu ảnh. Trong quá trình xử lý ảnh và làm phim video trên máy tính, dữ liệu được sử dụng chủ yếu là dữ liệu ảnh. Ngoài ra, dữ liệu ảnh trên máy tính còn phục vụ cho nhiều ngành khoa học khác như khoa học hình sự, trang trí mỹ thuật, thiên văn học, khảo cổ học, y học...

    Hy vọng rằng qua bài viết, bạn đọc sẽ có được một ý niệm tổng quát về việc tổ chức và sử dụng dữ liệu ảnh trên máy tính, và sẽ tìm được một vài thông tin nào đó cho quá trình làm việc của mình.

Châu Hồng Lĩnh
93/5A Quang Trung, P11,
Gò Vấp, TP HCM. ĐT: 941334


PcLeHoan 1996 - 2002
Mirror : http://www.pclehoan.com
Mirror : http://www.lehoanpc.net

Mirror : http://www.ktlehoan.com