Top Ad unit 728 × 90

Latest news

recent

Offset, Padding của image hay video frame trong bộ nhớ

Ảnh (Image) hay khung hình đơn (Video frame) trong video có thể được lưu trữ dưới dạng file hay tạm thời trong bộ nhớ. Ở dạng tập tin thì dữ liệu tùy thuộc vào kiểu của tập tin (.jpg, .png, ...), dạng ảnh (đen trắng (binary), đa mức xám (greyscale), màu (Color) ...), không gian màu (YUV, RGB, ...) mà lưu trữ theo một cấu trúc nhất định. Cấu trúc đó thông thường gồm phần mô tả thông tin chung (Header), và phần nội dung ảnh (giá trị pixels). Tùy theo những đặc tính kể trên mà số lượng bytes, vị trí các phần, cách tổ chức không giống nhau. Chính vì lẽ đó mà khi muốn đọc dữ liệu ảnh từ tập tin lên hay ghi nội dung xuống người ta cần nghiên cứu để hiểu cấu trúc và hiểu cách để đọc/ghi các bytes trong tập tin như thế nào để có chính xác 2 lọai thông tin trên.
Một điều may mắn là ngày nay hầu như tất cả các định dạng chuẩn đều có các bộ thư viện (các hàm được làm sẵn) tương ứng hỗ trợ việc đọc ghi ảnh dễ dàng. Chính vì lẽ đó mà khi làm xử lý ảnh, hay ứng dụng các thuật toán trên ảnh, video người ta cũng ít khi phải quan tâm tới việc làm thế nào để có dữ liệu. Công đoạn đọc dữ liệu ảnh từ tập tin, hay stream từ các nguồn video hầu như đã sẵn sàng. Vấn đề cần kíp hơn là hiểu dữ liệu ảnh được tổ chức như thế nào trong bộ nhớ sau khi tải về, nắm vững ý tưởng cơ bản thì dù làm việc trên môi trường nào, thì chúng ta cũng có thể dễ dàng thao tác, duyệt điểm ảnh mà áp dụng giải thuật của mình.Thông thường các thư viện sau khi có được dữ liệu ảnh đưa vào bộ nhớ thì tổ chức thành dạng cấu trúc như sau:
Ví dụ trong trường hợp của OpenCV thì đó là cấu trúc IPLImage, trong GDI thì là Bitmap hay đại loại như vậy. Muốn xử lý ảnh, người ta phải dựa vào các thông tin trong phần mô tả của cấu trúc này để truy xuất vào giá trị từng điểm ảnh trong phần dữ liệu ảnh. Phần dữ liệu ảnh thường là một dãy liên tục các pixel trong bộ nhớ, xét một cách trực quan nó là ma trận nhiều chiều tuy nhiên xét trên phương diện bộ nhớ nó là một dãy 1 chiều.

Nhìn vào hình vẽ mọi người sẽ dễ dàng thấy một điều đặc biệt là khi dữ liệu ảnh được lưu vào bộ nhớ, vùng đệm có thể chứa thêm nhiều bytes trống (padding) phía sau mỗi dòng (row) của ảnh. vùng padding này chỉ tác động vào cách ảnh được lưu trong bộ nhớ chứ không ảnh hưởng tới sự hiển thị của ảnh. Khi đó sẽ phát sinh thêm một thông số mới đó là stride (hay wide step), số lượng bytes tính từ đầu một dòng tới đầu dòng kế tiếp của ảnh Stride = Image width * (bytes per Pixel) + Offset. Hai vùng đệm chứa hai ảnh cùng chiều (cùng độ width) có thể có Stride khác nhau. Các bytes padding không có ý nghĩa, theo một số tài liệu thì sở dĩ có việc padding này là do hệ điều hành quản lý bộ nhớ theo từ nhớ do đó để tránh việc phân mảnh bộ nhớ, dể dàng quản lý bộ nhớ hơn, giúp chương trình ổn định hơn nên thông thường Stride = 2^n và là giá trị gần nhất của Image width * (bytes per pixel). Trong hình kể trên pScanLine0 là vị trí khởi đầu của bộ đệm lưu dữ liệu ảnh. Hiển nhiên là khi ảnh được lưu vào bộ nhớ các thư viện chỉ cung cấp giá trị này là đủ để chúng ta duyệt ảnh.

Có hai cách để dữ liệu ảnh được sắp xếp trong bộ nhớ, một là Top-Down, dòng đầu của ảnh được lưu đầu tiên trong bộ đệm. Hai là Bottom-Up, dòng điểm ảnh cuối cùng được lưu trữ trong vùng nhớ trước. Hình dưới minh họa cho hai tình huống này:
Thông thường các hình ảnh YUV, Direct3D khi được đọc vào bộ nhớ có sắp xếp Top-down còn hình RGB thì có thứ tự Bottom-up. Tùy thuốc vào vị trí ban đầu của pScanLine0 mà chúng ta có cách để truy xuất đúng các pixel thích hợp. Hình dưới đây minh họa cho quá trình duyệt điểm ảnh tương ứng giữa bộ nhớ và cấu trúc logic của nó.

Bài viết này cố gắng đưa ra những kiến thức tổng quan nhất về ảnh và cách sử dụng dữ liệu ảnh trong bộ nhớ. Việc hiểu theo hướng mở sẽ giúp ích hơn là áp đặt nó vào khuôn khổ một thư viện cụ thể.


Binh Nguyen - Bioz
Offset, Padding của image hay video frame trong bộ nhớ Reviewed by Bioz Nguyen on 11:36:00 AM Rating: 5
All Rights Reserved by IEEV © 2009 - 2016
Powered By Blogger, Designed by Sweetheme

Contact Form

Name

Email *

Message *

Powered by Blogger.