2010-03-31 109 views
1

我有一系列的圖像。每一個通常(但不總是)與前一個相似,更新3個或4個小矩形區域。我需要使用最少的磁盤空間來記錄這些更改。簡單而有效的方式來存儲圖像的一系列小變化?

源圖像沒有壓縮,但我想要壓縮deltas。

我需要能夠重新創建圖像完全按照輸入

我的線沿線的思維的東西(所以有損視頻編解碼器是不恰當的。):

  • 複合新具有負的舊形象
  • 保存在任何通用格式的合成圖像可以使用RLE壓縮(可能是PNG)
  • 的圖像通過增量合成之前的圖像重新創建第二圖像。

雖然圖像有一個alpha通道,我可以忽略它的目的是爲了這個功能。

是否有一個易於實現的算法或免費Java庫的這種能力?

+0

因此,磁盤空間是主要的考慮因素,而不是構建增量的時間? – 2010-03-31 03:02:10

+0

@MaxGuernseyIII,是的,但那是因爲我假設其他任務將主導CPU負載。我可能是錯的。 – finnw 2010-03-31 03:07:49

回答

1

在僅包含更改(您可以使用PNG透明背景或某種統一顏色)的圖像上,對現有無損壓縮器(PNG,無損JPEG等)稍做試驗。這些算法在壓縮大多數常量的圖像時非常有效,如果您不是專家,則無法擊敗它們。

0

如果更改要保持矩形,您可以分別保存這些部分,即原始圖像加上更改及其位置。

+0

是的,這是一種方法。你知道一個算法來計算改變矩形的最小集合嗎? – finnw 2010-03-31 03:09:20

+0

我認爲你知道這些變化發生在哪裏。如果不是這樣,它可能不是正確的道路。 – paprika 2010-03-31 03:23:43

+1

你可能想看看ImageMagick的比較工具: http://www.imagemagick.org/script/compare.php 我猜他們的實施並不是最糟糕的,也許看看代碼或詢問郵件列表。 – paprika 2010-03-31 03:30:02

1

如果矩形的數量通常很小,和矩形本身小,可以使出來行和列的差異,用它來拿出矩形可能是不同的...

想象用下面的像素值圖片...

0 0 0 1 1 1 2 2 3 3 
0 0 1 1 0 0 1 1 2 2 
0 0 1 1 0 0 0 1 1 2 
0 0 1 1 0 0 0 1 1 2 
0 1 1 0 0 3 0 0 1 1 
0 1 1 0 0 3 0 0 1 1 
0 0 1 1 0 0 0 1 1 2 
0 0 1 1 0 0 0 1 1 2 
0 0 0 1 1 1 1 1 0 2 
2 2 2 2 2 1 1 2 2 2 

......還有......

0 0 0 1 1 1 2 2 3 3 
0 1 1 1 0 0 1 1 2 2 
0 1 2 4 0 0 0 1 1 2 
0 1 2 3 0 0 0 1 1 2 
0 1 1 0 0 3 0 0 1 1 
0 1 1 0 0 3 0 0 1 1 
0 0 1 1 0 3 3 2 1 2 
0 0 1 1 0 3 3 2 1 2 
0 0 0 1 1 2 2 2 0 2 
2 2 2 2 2 1 1 2 2 2 

首先你會拿出其中的像素行,行的面具,列產生了分歧......

0 1 1 1 0 1 1 1 0 0 

0 0 0 0 0 0 0 0 0 0 0 
1 0 1 0 0 0 0 0 0 0 0 
1 0 1 1 1 0 0 0 0 0 0 
1 0 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 1 1 1 0 0 
1 0 0 0 0 0 1 1 1 0 0 
1 0 0 0 0 0 1 1 1 0 0 
0 0 0 0 0 0 0 0 0 0 0 

行和列的數據給我們指導,那裏可能是長方形......

0 1 1 1 0 1 1 1 0 0 

0 0 0 0 0 0 0 0 0 0 0 
1 0 ? ? ? 0 ? ? ? 0 0 
1 0 ? ? ? 0 ? ? ? 0 0 
1 0 ? ? ? 0 ? ? ? 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
1 0 ? ? ? 0 ? ? ? 0 0 
1 0 ? ? ? 0 ? ? ? 0 0 
1 0 ? ? ? 0 ? ? ? 0 0 
0 0 0 0 0 0 0 0 0 0 0 

遍歷每個可能的矩形,並決定是否有是否更改,然後對它們進行編碼。如果您需要...您可以添加其他散列軸而不是行和列,就像您可以將圖片細分爲區域並散列區域是否有任何更改一樣,然後使用散列來決定區域是否需要被編碼。您可以執行任意次數的操作,並且具有合理快速的算法,也可以生成小文件。

無論如何,我認爲您最好的選擇是建立一個已更改內容的地圖,並使用總量來告訴您是否更改了區塊以指導您的決策。如果你收集了足夠多的這些數據,你甚至可以創建一些不同的算法,在不同的情況下做好工作,然後將它們放入一個責任鏈中,根據地圖的特徵和你構建的哈希來決定使用哪種算法。

相關問題