2013-03-07 48 views
5

Tôi đang xem xét vấn đề giảm dung lượng lưu trữ khi lưu trữ nhiều ảnh JPEG với nhau thành một ảnh lớn hơn. Trực giác cơ bản là hình ảnh có xu hướng có một số điểm tương đồng (giống như những hình ảnh được chụp tại cùng một vị trí hoặc xung quanh cùng một thời điểm) và chúng ta có thể khai thác sự giống nhau này để tiết kiệm không gian?Nén ảnh JPEG

Dòng tổng thể là: Input JPG Images -> Mỗi hình ảnh chuyển đổi thành RGB gạch Image -> Tổ chức lại tương tự RGB gạch với nhau -> Một lần nữa chuyển đổi sang định dạng JPG. Đương nhiên, khi truy xuất hình ảnh, chúng tôi sẽ cần phải đảo ngược quy trình.

Sử dụng hệ số DC của thành phần Y làm thước đo tương tự để sắp xếp lại, tôi nhận được ~ 8% tiết kiệm không gian cho 10 hình ảnh. Khi tôi làm điều này cho 100 hình ảnh, các khoản tiết kiệm được giảm xuống còn ~ 3%.

  • Làm cách nào để nhận được khoản tiết kiệm sau khi sắp xếp lại gạch - tức là phần nào của quá trình mã hóa JPEG tận dụng lợi thế của việc tổ chức lại hình ảnh này?

  • Thay vì hệ số DC Y thành phần của, đang có một số số liệu khác mà bạn có thể nghĩ rằng sẽ được khai thác tốt hơn bằng cách mã hóa JPEG


Revised:

Có một số khác Định dạng hình ảnh bên cạnh JPG có thể khai thác loại tương tự này tốt hơn khi tổng hợp nhiều hình ảnh? Chẳng hạn như PNG chẳng hạn?

Trả lời

5

Có thể bạn đang sử dụng JFIF để mã hóa.

Tôi không chắc chắn cách bạn mong đợi phương pháp này hoạt động. Nếu tôi hiểu chính xác, bạn đang chia nhỏ hình ảnh thành các ô, tổng hợp chúng thành một hình ảnh lớn, với các ô "tương tự" được sắp xếp gần nhau.

AFAIK, việc triển khai JPEG thực hiện DCT riêng cho mỗi ô 8x8 riêng lẻ trong hình ảnh, được gọi là macroblock. Nói cách khác, JPEG không thể tận dụng sự kết hợp giữa các macroblocks lân cận (dường như là giả định cơ bản cho kỹ thuật nén của bạn).

Nếu gạch của riêng bạn lớn hơn macroblocks, bạn sẽ không thấy bất kỳ cải tiến nào ngoài khoản tiết kiệm trong không gian tiêu đề hình ảnh.

Ví dụ: 10 tiêu đề hình ảnh JPG được thay thế bằng 1 sẽ tiết kiệm không gian 90% cho bạn, nhưng chỉ trong tiêu đề. Khi bạn nhìn vào tập tin tổng thể, tiêu đề là một phần nhỏ của toàn bộ tập tin, do đó tiết kiệm không gian của bạn là ít ỏi. Khi thay thế 100 tiêu đề hình ảnh bằng 1, bạn tiết kiệm 99%, nhưng lại chỉ trên tiêu đề. Trong cả hai trường hợp, tất cả các macroblocks vẫn đang được mã hóa và lưu trữ chính xác như trước đây.

+0

Cảm ơn, điều đó có ý nghĩa rất nhiều! Tôi sử dụng libjpeg để làm mã hóa và giải mã. Khi JPEG thực hiện DCT trong các macroblocks 8x8, sự tương đồng giữa các khối (lớn hơn các macroblocks) có lẽ không giúp được gì nhiều. Nhưng, tôi nghĩ rằng hệ số DCT của macroblocks lân cận được mã hóa tương đối, và điều này có thể được cải thiện bằng cách tổ chức lại gạch này ở một mức độ nào đó. Tôi đã sửa đổi câu hỏi của mình - hãy xem. – user655617

+0

Vui vì tôi có thể giúp làm rõ mọi thứ. Có, libjpeg là tham chiếu JFIF của IJG về chuẩn JPEG. Tôi không nhớ các hệ số DCT sử dụng mã hóa delta (trong số các macroblocks lân cận). AFAIR, mỗi macroblock trở thành một ma trận 8x8 của các hệ số, sau đó được decimated (chia để giảm số bit cần thiết để lưu trữ chúng - và đây là nơi "mất" trong nén mất), và đọc ra trong zig - thời trang. Thứ tự này tạo ra các lần chạy dài 0, được nén hiệu quả thông qua mã hóa độ dài chạy (thay vì lưu trữ 17 số không, chúng tôi lưu trữ 17, 0). –

2

Có hai khu vực nơi bạn sẽ thấy lợi ích:

Thứ nhất, khi bạn đặt vùng tương tự bên cạnh nhau (đặc biệt là nếu các cạnh của hình ảnh phù hợp hoàn hảo với không gián đoạn - mặc dù điều này sẽ rất hiếm), phần DCT (tần số không gian) của thuật toán jpeg hoạt động bằng cách xấp xỉ các vùng lớn-lớn (không chắc chắn kích thước lớn nhất là gì), sau đó nhìn vào lỗi giữa xấp xỉ của vùng lớn và nhiều vùng nhỏ hơn, và sản xuất hiệu chỉnh nội địa hóa hơn.

Tôi nghi ngờ rằng hiệu ứng này là nhỏ, trừ khi hình ảnh của bạn là rất tương tự hoặc rất nhỏ (để cạnh của chúng dài theo tỷ lệ với diện tích của chúng).

Thứ hai, Huffman coding một phần của nén jpeg sẽ thấy một lợi ích vì cùng một mẫu bit sẽ xuất hiện trong nhiều hình ảnh phụ và được nén bằng cùng một mã (ngắn)).

Khía cạnh này sẽ không phụ thuộc vào sự sắp xếp bạn nén hình ảnh của bạn trong - miễn là chúng nằm trong cùng một hình ảnh.

+0

Cảm ơn bạn đã trả lời! Tôi không chắc chắn về phần đầu tiên của bạn. Nhưng, tôi nghĩ rằng huffman mã hóa có thể khai thác này để _some_ mức _if_ Tôi chia đầu ra cuối cùng thành nhiều hình ảnh, mỗi một với gạch tương tự. Nhưng, tôi không nghĩ rằng giải thích về tiết kiệm không gian tôi nhận được. Tôi đã lặp lại câu hỏi của tôi - xin hãy xem. – user655617