2010-04-13 26 views
5

Tôi có một ứng dụng được nhúng nơi máy quét hình ảnh gửi đi một luồng các pixel 16 bit sau đó được ghép thành hình ảnh thang độ xám. Vì tôi cần lưu cả dữ liệu này cục bộ và chuyển tiếp nó sang giao diện mạng, tôi muốn nén luồng dữ liệu để giảm dung lượng lưu trữ cần thiết và băng thông mạng.Nén hình ảnh không bị mất khi đang bay

Có một thuật toán đơn giản mà tôi có thể sử dụng để nén dữ liệu pixel không bị mất không?

Lần đầu tiên tôi nghĩ về tính toán sự khác biệt giữa hai pixel liên tiếp và sau đó mã hóa sự khác biệt này bằng mã Huffman. Thật không may, các điểm ảnh là số lượng 16-unsigned unsigned vì vậy sự khác biệt có thể là bất cứ nơi nào trong phạm vi -65535 .. +65535 dẫn đến độ dài từ mã tiềm năng khổng lồ. Nếu một vài từ mã thực sự dài xuất hiện trong một hàng, tôi sẽ chạy vào các vấn đề tràn bộ đệm.

Cập nhật: nền tảng của tôi là một FPGA

+0

Tôi có cùng một vấn đề, không phải trên FPGA nhưng sử dụng một ARM và dữ liệu của tôi là 12 bit. Bạn đã sử dụng cái gì? – user4749

Trả lời

8

PNG cung cấp nén hình ảnh miễn phí, mã nguồn mở, không mất dữ liệu ở định dạng chuẩn sử dụng các công cụ chuẩn. PNG sử dụng zlib như một phần của quá trình nén. Ngoài ra còn có libpng. Trừ khi nền tảng của bạn là rất khác thường, không khó để chuyển mã này sang nền tảng đó.

+0

sẽ không JPG phù hợp hơn với quét quy mô xám không? –

+2

@Matthew, tiêu đề nói "lossless". Có một chế độ lossless không chuẩn cho JPEG, nhưng tôi nghĩ lựa chọn tốt hơn sẽ là PNG. –

+0

Ngoài ra, hãy sử dụng bộ lọc PNG thích hợp, vì LZ/Huffman không khai thác nén dự đoán 2 chiều. http://www.w3.org/TR/PNG-Filters.html Ngoài ra, cho phép người dùng cuối thiết bị chọn số bit giảm cho mỗi mẫu, vì các bit ít quan trọng nhất không thực sự nén và sẽ tăng dữ liệu kích thước đáng kể. Ở cấp độ phần cứng/giao thức, chỉ cần xóa các bit không cần thiết ở nguồn sẽ cải thiện khả năng nén. – rwong

3

Bạn có sẵn bao nhiêu tài nguyên trên nền tảng nhúng của mình?

Bạn có thể cổng zlib và nén gzip không? Ngay cả với các tài nguyên giới hạn, bạn sẽ có thể chuyển một số thứ như LZ77 or LZ88.

+0

Cảm ơn các đề xuất của bạn. Các phương pháp dựa trên từ điển như các phương pháp bạn đề xuất có vẻ phù hợp hơn với công việc hơn là mã hóa huffman. Về tài nguyên, tôi muốn thực hiện điều này trên một FPGA. Tôi không có bộ xử lý. – geschema

3

Có sẵn nhiều thư viện nén hình ảnh khác nhau. Ví dụ: this page không liệt kê gì ngoài thư viện/bộ công cụ cho hình ảnh PNG. Định dạng/thư viện nào hoạt động tốt nhất cho bạn rất có thể sẽ phụ thuộc vào các ràng buộc tài nguyên cụ thể mà bạn đang làm việc (đặc biệt, hệ thống nhúng của bạn có thể làm số học dấu phẩy động) hay không.

2

Mục tiêu với nén không mất dữ liệu là có thể dự đoán pixel tiếp theo dựa trên pixel trước đó và sau đó mã hóa sự khác biệt giữa dự đoán của bạn và giá trị thực của pixel. Đây là những gì bạn nghĩ ban đầu, nhưng bạn chỉ sử dụng một pixel trước đó và đưa ra dự đoán rằng pixel tiếp theo sẽ giống nhau.

Hãy nhớ rằng nếu bạn có tất cả các pixel trước đó, bạn có nhiều thông tin liên quan hơn chỉ là pixel trước đó. Nghĩa là, nếu bạn đang cố gắng để dự đoán giá trị của X, bạn nên sử dụng O pixel:

..OOO ...
..OX

Ngoài ra, bạn sẽ không muốn sử dụng trước pixel, B, trong dòng để dự đoán X trong tình huống sau đây:

OO ... B < - Hết hàng
X < - Bắt đầu hàng tiếp theo

Thay vào đó bạn sẽ làm cho cơ sở dự đoán của bạn trên Os.

1

Làm thế nào 'mất mát' bạn cần?
Nếu đây là máy quét thực thì có giới hạn về độ rộng/độ phân giải, vì vậy ngay cả khi nó có thể gửi các giá trị +/- 64K, nó có thể không có giá trị đối với các pixel lân cận có chênh lệch lớn hơn 8 bit.

Trong trường hợp đó, bạn có thể thực hiện giá trị pixel bắt đầu cho mỗi hàng và sau đó thực hiện các khác biệt giữa mỗi pixel.

Điều này sẽ bôi nhọ các đỉnh nhưng có thể là bất kỳ đỉnh nào lớn hơn 'N'bits là nhiễu.

+0

Đó là một quan sát thú vị, nhưng tiếc là tôi biết quá ít về vật lý tạo hình ảnh (điều này là dành cho kính hiển vi điện tử) để đưa ra các giả định về sự khác biệt giữa các điểm ảnh lân cận. – geschema

1

LZ77/RLE lai tốt với chuông và wwhistles có thể có được nén tuyệt vời mà là khá nhanh chóng để giải nén. Họ cũng sẽ lớn hơn, máy nén badder trên các tệp nhỏ hơn do thiếu chi phí thư viện. Đối với một tốt, nhưng GPLd implentation này, hãy kiểm tra PUCrunch

+0

PUCrunch thuộc LGPL. –

Các vấn đề liên quan