怎樣快速為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的隨機點就行了,一億張圖,也沒個順序要求,和隨機數也沒啥區別了
先說結論,很快,主流智能手機(沒錯,是手機)在毫秒級可完成。
本質上是壓縮問題,將數據壓縮到這個比例,這張「縮略圖」有什麼意義呢?它最多就是一個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.0010485760.001048576/0.089406967=0.01172...遠小於人類肉眼極限信噪比這個就是這個演算法的應用場景沒有人類交互價值的原因不過這也只是樓上諸位的另一種說法而已,其實說的是一個意思(:P)
如果要使其具有人類交互價值,必須對圖片進行預處理人工干預,從定量分析轉變為定性分析的思路
而且事實上應用到這個類似東西的地方也是使用定性分析的思路人工干預到了 UI 可用的程度才能出結果的
沒有人類應用場景的應用對人類而言沒有太大價值
只對機器有意義1024×1024不過一百萬像素,你十億張圖片,相當於一千張圖片作為成一個像素點,這個只要求平均就可以。而你用100張圖去做實驗,其中的邏輯反而更複雜了,慢可能反而是正常的,這當然取決去具體演算法。
我覺得首先問下自己意義與目的是什麼,確定了目的,一切都好辦本多
比如檢索各圖內容,突出出現頻率最高的幾張圖,類似鳳凰網那個「2016十大熱點辭彙」那個排版格式,總之要丟掉很多東西
至於其他,感覺,十億基數太大,壓縮太厲害,平均主義意義不大
用c++的,一般有需求就解決,沒有需求就製造需求解決。十億比特的數據壓縮成一比特,如果你能實現的話,未來百年的圖靈獎你可以直接預支。
推薦閱讀:
※兩張尺寸、像素、解析度都相同的PNG圖片,圖片內容也相同,為什麼文件體積不一樣大?是越大越清晰嗎?
※下面這張圖通過PS是如何做到的?
※如何拍出蘋果風格的照片?
※怎麼做出這樣的黑白效果?
※如何利用ImageMagick去除圖片上的水印?