怎樣快速為10億張1024*1024的圖片整體生成一張1024*1024的縮略圖?

有10億張1024*1024的png圖片,現在需要生成它們整體的一張1024*1024的縮略圖,也就是說,需要在邏輯上將它們拼接起來再生成一張縮略圖,有什麼高效的好方法嗎?嘗試了一下ImageMagick,100張圖片就耗時很久,有沒有什麼快速的好方法?

使用ImageMagick的命令是:montage *.png -tile 10x10 thumb.png


先明確一下你想要生成什麼樣的「縮略圖」?

十億張圖片生成一張1024×1024的縮略圖,每張圖片只對應大約千分之一個像素,那你的縮略圖中的每個像素是怎麼確定的?

把你現在處理「100張圖片就耗時很久」的代碼貼出來。


我覺得陳碩分析的沒錯,你這解析度,我隨機每個像素色值搞個1024*1024的圖出來就可以說這是你要的縮略圖了,沒毛病,反正看不出來


像素點是最小單位,所以不應該把照片拼成大照片再壓縮,可以直接找到 1024*1024的點所對應的值,比如取整個圖的平均值,非圖形學相關,給個思路


1024*1024=一百萬左右,10億除以一百萬是一千,也就是說,一千張圖片生成一個像素點。話說你知道自己想要什麼么


也就是說每一千張圖產生新圖的一個像素。

圖片是隨機沒規律的么?若是,直接隨機抽幾千張圖算下均值,直接用均值產生新圖片,大不了加點雜訊。反正不可考。

若是圖片有分類有順序,那就是每一千張算個均值而已。嫌cpu慢,就用gpu,opencv可以使用gpu的。


其實搞一張1024*1024的隨機點就行了,一億張圖,也沒個順序要求,和隨機數也沒啥區別了


先說結論,很快,主流智能手機(沒錯,是手機)在毫秒級可完成。

首先你得先給這10億照片隨機建一個樣本,樣本容量不可超過總像素數,即1024*1024,然後分析樣本圖片的特徵,比如這些照片全都是灰度、單色、等等這些情況,當然如果就是普通的隨機照片就沒必要這麼做了,剩下的就是分散式並行處理了,每張圖片獲取其主色作為一個縮略圖中的像素結果,這麼做兩點需要說明:

1 如果不用樣本先排除無效照片,當你想藉助網路上分散式計算資源的時候總體耗費時間主要取決於你的網速和你的硬碟速度,直白點就是你得先把10億張照片從硬碟讀出來上傳到網路,我想你可能想先嘗試本地多線程跑一跑(幫你算了一下按照四個線程,每個線程100ms處理一張照片,你需要289.35天)

2 你的處理順序決定了最終生成的圖片,假設樣本個體完全不相關,每個得到的像素結果可以認為是獨立的,每個樣本個體內部里的像素也基本滿足統計規律(否則按照單色灰度等處理),也就是說,你先別著急處理,我們先大概來猜一猜最後的結果,想像一下老舊電視上的雪花點,換成彩色,嗯大概就是這樣。所以你看,這種情況下根本不需要去10億張照片的信息,我們用概率統計的工具加上一點點前提,把10億張照片的內容信息用數學工具壓縮為1個隨機像素,可以做到隨機生成一張圖片,最後結果差不太多。何必動用超級計算機和分散式資源呢?


本質上是壓縮問題,將數據壓縮到這個比例,這張「縮略圖」有什麼意義呢?它最多就是一個1024*1024*3數值從0到255的矩陣,無論如何都表示不了那麼大數據的多少特徵。


可以畫成任意畫了吧。。。。


其實對於怎麼處理十億張圖片,我更關注你從哪弄這麼多圖片的(゜o゜;


縮略圖的實際應用場景在於人類 user 可根據縮略圖進行逆向局部動態還原,向圖像細節申請放大,對人類提供圖像信息索引的功能,是面向人類這種視覺動物的設計,人類與信息交互的動態方式

高維數據……處理如果僅憑提供好的 montage *.png -tile 10x10 thumb.png 這樣一條命令,不足以處理實際應用場景的需求,那如果是我,我可能要想想 ImageMagick 是否適合用來處理這樣量級的數據,是否應該特殊類型特殊量級特殊處理,一次處理還是多次處理,分類處理還是統一處理,預處理還是即時處理,還原演算法採用哪種思路……

回到交互本身上來

顏色,男性據說大概分辨1300000種,女性大概分辨1800000種,取中間值1500000(:P)

在忽略顯示器質量和人類個體差異的情況下,採用rgb色域16777216

信息極限信噪比為0.089406967

計算1024*1024=1048576,這張圖片的顯示顏色最多是1048576種

一億張圖片採用單像素表示,共1000000000種

單個像素信噪比0.001048576

0.001048576/0.089406967=0.01172...

遠小於人類肉眼極限信噪比

這個就是這個演算法的應用場景沒有人類交互價值的原因

不過這也只是樓上諸位的另一種說法而已,其實說的是一個意思(:P)

如果要使其具有人類交互價值,必須對圖片進行預處理人工干預,從定量分析轉變為定性分析的思路

而且事實上應用到這個類似東西的地方也是使用定性分析的思路人工干預到了 UI 可用的程度才能出結果的

沒有人類應用場景的應用對人類而言沒有太大價值

只對機器有意義


1024×1024不過一百萬像素,你十億張圖片,相當於一千張圖片作為成一個像素點,這個只要求平均就可以。

而你用100張圖去做實驗,其中的邏輯反而更複雜了,慢可能反而是正常的,這當然取決去具體演算法。


我覺得首先問下自己意義與目的是什麼,確定了目的,一切都好辦本多

比如檢索各圖內容,突出出現頻率最高的幾張圖,類似鳳凰網那個「2016十大熱點辭彙」那個排版格式,總之要丟掉很多東西

至於其他,感覺,十億基數太大,壓縮太厲害,平均主義意義不大

小白,匿了


用c++的,一般有需求就解決,沒有需求就製造需求解決。十億比特的數據壓縮成一比特,如果你能實現的話,未來百年的圖靈獎你可以直接預支。


推薦閱讀:

兩張尺寸、像素、解析度都相同的PNG圖片,圖片內容也相同,為什麼文件體積不一樣大?是越大越清晰嗎?
下面這張圖通過PS是如何做到的?
如何拍出蘋果風格的照片?
怎麼做出這樣的黑白效果?
如何利用ImageMagick去除圖片上的水印?

TAG:圖像處理 | C編程語言 | 圖形圖像 | 圖片處理 | CC |