存在不失真圖片放大演算法嗎?

在網上找到一款工具:photozoom pro ,但試了下效果不理想。


不是不可能,但取決於圖像的性質。例如,如果圖像的空間域或頻域信號可以完美量化成離散樣本(例如純色的圖、整數周期正弦波疊加的圖),那麼可以「不失真放大」。


如果只有圖像本身作為信息源,那麼資訊理論的理論就直接給你的這種想法判了死刑。

但是如果我們還有圖像之外的知識,那就可以通過演算法一定程度的補償原有圖像的信息,比如專門針對動畫的放大演算法、盡量保證圖像中色彩變化劇烈的部分(也就是一般所說的「邊緣」)損失較少的保邊放大/過濾演算法、甚至可以是由圖像資料庫 + 補償演算法構成的猜測演算法 —— 就如同公安部門的人像復原人員根據口述復原人像一樣。


適用於任意圖片不失真的演算法不存在,輸入信息量就那麼多

不過適用於特定種類圖片的演算法是寫得出來的,比如去年大火的放大漫畫的演算法,就利用了漫畫圖片的特點(線和填充)進行放大。


反對 @Michael282694 所說的「此方向命不久矣」。

其給出的兩篇paper已經相對較老了。

比較新的有

  • 多幀

Huang, Yan, Wei Wang, and Liang Wang. "Bidirectional Recurrent Convolutional Networks for Multi-Frame Super-Resolution." In Advances in Neural Information Processing Systems, pp. 235-243. 2015.

  • 單幀

Dong, Chao, Chen Change Loy, Kaiming He, and Xiaoou Tang. "Learning a deep convolutional network for image super-resolution." In Computer Vision–ECCV 2014, pp. 184-199. Springer International Publishing, 2014.

以上兩篇paper都使用了CNN,超解析時無需做複雜的迭代優化,只需進行簡單的feed-forward計算,正如下圖所示,其在性能(PSNR)-計算量(Running time)上已經離實際應用很接近了。

再加上GPU並行實現CNN上的計算優勢,4K解析度的超解析已經不遠了。超解析命還長著。


舉個栗子。現在有一副畫,畫上面遠方有一座房子,由於太遠房子的窗戶看起來就是一個小黑點,在屏幕上就是幾個黑黑的像素。

現在我把這幅圖放大五十倍,你希望放大後的窗戶是什麼樣? 如果你所有的信息就是一張原圖,窗子放大後也只能是兩百個黑色的像素點,不能放大為一扇正常的窗戶。

像攝像頭拉進焦距一樣放大圖片需要的是【原圖不存在的細節(數據)】,因此理論上不可能。

放大一張證件照,也是一樣的道理。本來只有兩千像素,你要放大到一萬像素,計算機怎麼辦,只能猜,算差值,至於是兩個像素算還是八個像素算,去平均值還是怎麼算,就看演算法了。

那麼問題來了,回到窗子的問題,【反正世界上那麼多窗子的圖片,能不能根據原圖的色調,結構,風格等等,尋找一張最適合的窗子貼進放大後的圖呢】

當然可以,這就是機器學習做的事情了。

無損嗎,當然有損。這將是基於原圖的結構生成了一張新的,大尺寸高像素的,且在人們看來很合理的合理的放大圖。


這叫Super-resolution。。。

會點MATLAB的話可以試試這個?雖然我沒跑過

Learning a Deep Convolutional Network for Image Super-Resolution


嚴格來說目前常用的圖像放大演算法都毫無失真啊。你輸入圖像的信息就那麼多,放大過程完全不會導致信息的丟失來著。

不過想必題主問的是放大時會補充圖像描繪內容的信息。這一點要做到的話有兩個方法:

1)記錄的時候記錄足夠多的信息;

2)猜。

我個人估計,題主問的是有哪些精通猜的演算法能夠在放大圖像的過程中儘可能還原圖像描述內容的信息。那麼你說的Photozoom Pro已經是很好的工具了。如果是二次元圖像可以嘗試Waifu2x。如果有錢,請嘗試畫家。

其他答案說到的矢量圖形之類的屬於第一個方法。


理論上不會有。

放大圖像那個不叫失真,因為本來就沒有你要的那個「真」。光柵圖的像素本就沒有包含你放大後多出來的那些信息。

那些「無失真」放大圖片的,大多是通過某種方式「推測」不存在的那些信息。

推薦一下waifu2x,用來放大畫作的效果很好。照片就不行了雖然。

(waifu2x這玩意兒其實也是機器學習的成果....)


除非你的圖片是矢量圖,或者完全可以用演算法得出精確位置的圖像,否則並不存在一種廣義的不失真的圖像演算法。因為對於任意隨機的圖案來說,只要超過原始圖像本身的大小,就可能會失真


對於正常、普通並帶有紋理色彩的圖片,徹底不失真的「放大」演算法是不存在的。

你可以試著去了解一下Super Resolution演算法,工業界常用的是bicubic(雙三次插值法)。

最近幾年比較新且效果好方法:

  • 多幀

On Bayesian Adaptive Video Super Resolution (TPAMI) A Bayesian approach to adaptive video super resolution(CVPR).

  • 單幀

Modeling Deformable Gradient Compositions for Single-Image Super-Resolution (CVPR).

此方向命不久矣,等待下一個春天吧。


終於看到能答的題了。。。若不想全看可以只看下劃線部分

————————正文分割線——————————————————

圖片能否完美放大取決於圖片源、圖片放大的演算法。演算法可以做到無窮接近圖片源本身質量,但是無法超過圖片源本身畫質。

圖片源的類型,按大類分為純用電腦製作的數碼圖片使用相機拍攝的感光圖片

  1. 數碼圖片
  • 矢量圖 圖片源質量:正無窮

基於數學公式完整的的保存了圖片相對位置、顏色的圖片。因此可以不失真放大

矢量模式是以數學的矢量方式來記錄圖形的內容,它的內容以線條和色塊為主。矢量模式由一些基本的線條和線條所封閉的填充區域組成。矢量圖形的存儲只需記錄線條的兩個小端點的坐標、線條的粗細和顏色及填充區域的顏色等,所以矢量圖形文件所佔的空間較小。矢量模式的圖形沒有點陣圖模式下的圖像逼真,但矢量圖形的體積小、靈活性高,適於製作網頁動畫。

編輯矢量圖形時,修改的是描述其形狀的線條和曲線的屬性。矢量圖形與解析度無關,這意味著除了可以在解析度不同的輸出設備顯示它以外,還可以對其執行移動、調整大小、更改形狀或更改顏色等操作,而不會改變其外觀品質。

  • 點陣圖 圖片質量:點陣圖自身解析度

以像素的方式記錄圖片每一個點的顏色,通常有固定的大小和解析度。若放大點陣圖則相當於使用2*2的像素表現了1*1的像素的內容(基於不同演算法,周圍的位置像素的模擬程度可能不同),因此周圍會呈現鋸齒狀,會有一定程度失真。(縮小同理)

通常將以點陣圖模式顯示圖形的方法稱為點陣法。點陣法通過枚舉出圖形中的所有點來表示圖形,它強調圖形由一些點及這些點所具有的顏色組成。最常見的點陣圖模式是BMP模式,它在存儲圖形時由二維矩陣來表示,矩陣中排一個點就稱為一個像素,因此點陣圖看起來更逼真。因為點陣圖是由像素構成的,所以點陣圖模式的圖形文件一般都比較大。

編輯點陣圖圖像時,修改的是像素,而不是線條和曲線。點陣圖圖像與解析度有關,這意味著描述圖像的數據被固定到一個特定大小的網格中。放大點陣圖圖像將使這些像素在網格中重新進行分布,這通常會使圖像的邊緣呈鋸齒狀。在一個解析度比圖像本身低的輸出設備L顯示點陣圖圖像也會降低圖像品質。

2. 感光相片

因光線具有有限大小波長,所以圖片會受到鏡頭孔徑的影響。另外和接受屏(底片)的信息保存能力有關。

由於光的衍射的影響,物點在底片上的像不是幾何點像而是一個模糊的光斑。光斑角半徑B=1.22k/R , B為衍射斑對相機鏡頭中心張角的一半,k為入射光波長,R為相機透鏡半徑。因此

相機鏡頭半徑越大,給予接受屏的信息越多。

  • 膠片做底片的圖片

因為是化學感光,所以理論上接受能力在分子級別。

  • 以感光板做底片的圖片

接受能力與感光單元密度(注市場上手機解析度通常指這個,然並卵)成正比,可以通過拉遠鏡頭,提升細節放大能力,但不會超過光學分辨能力極限。

部分定義粘貼自百度百科

—————————————————回答完畢分割線————————————————

不知道算不算乾貨啊、、、、打了半天手都凍紅了、、、、、以上


如果存在的話就不需要顯微鏡了


不能叫放大吧...

針對像素圖,已經有許多成熟的超分辨重建演算法了,現有的許多基於Sparse Coding的演算法都可以取得state-of-art的效果:

推薦這一篇

Image deblurring and super-resolution by adaptive sparse domain selection and adaptive regularization

另外在CVPR 2015出了一篇用隨機森林做的超分辨重建:

Fast and Accurate Image Upscaling with Super-Resolution Forests

效果貌似更好了~


矢量圖可以

點陣圖由於需要進行插值計算

如果計算的值和真實的值存在差異就會失真


換個大顯示器


對於數字圖像來說,沒有!!!

因為像素都是已經量化的點陣圖-bitmap,一個一個填充起來構成了一幅完整的圖像,不管是CCD or CMOS感測器,sample後就已經將場景進行網格化(和matlab將二維坐標網格化一個道理),或者你將一幅圖像一直進行放大直至看到馬賽克,就是一個一個黑灰白(以灰度圖為例)分明的格點。有很多圖像放大的演算法,但目前沒有哪種可以做到不失真放大。

換個思路理解,你把一幅圓形圖像一直進行放大,到某個程度你就會發現弧形失真了,即有角度出現,不過如果這個圓形是用矢量(函數表達式)表示信息的,可以保證你眼睛觀察不到弧形失真。BUT,一般情況下,一幅圖像不會用矢量表示圖像的每個邊緣信息,那信息量無法承受,即使假設可以的話,數字計算機的存儲位數是固定的,矢量函數表達式的係數存在取捨,放大到一定程度也會失真。只要圖像通過數字計算機這個信道,就game over了。那是否就真的不行了,圖像不失真放大?

非也,不清楚現在攝影愛好者還有人用膠捲拍攝嗎,如果將拍攝好的膠捲直接用幻燈片進行放大,應該是可以不失真放大的。

不久前我也有在想這個問題,因為直覺上就不行,就像是拿有限的信息,去無錯誤的預測未知信息一樣!


矢量圖可以無損放大。


對於正常的,帶有紋理的圖片,這種演算法不存在。

我來說服你:

現給你一張 1x1 像素的圖片,像素顏色為 #cccccc。請推算出這張照片的內容。

你推算不出,是因為你的信息量不夠。像素就這麼多,信息量就這麼多。

你說你推算出來了?不,那叫猜。


確定的一張圖片所含的信息量是確定的,在沒有其他數據輸入的情況下無法獲得更多信息。

用手機800萬像素拍了天上一顆星星,然後你告訴我通過演算法可以還原這個星球的全貌?顯然不可能。

當然通過大量數據輸入訓練得到的機器學習模型,可以一定程度上對圖片進行經驗上的放大。


路過試答。

如其他答主所說,只給單張圖像,沒有額外的信息,是沒有辦法做「不失真圖像放大」的。在這樣情況下的圖像放大,多是為了適合人類視覺效果做的一些處理,比如邊緣銳化之類,這種類型的方法在圖像處理裡面一般稱為圖像增強(image enhancement)

如果有額外的信息輸入,是有可能在圖像放大後恢復出一些細節的,這一類的方法稱為「超解析度」(super-resolution),這裡面我了解的主要有兩種方式。

第一種,像一個答主說的,比如你想放大窗戶,我有一個各種各樣窗戶的圖像庫,通過機器學習方法提取窗戶的特徵對圖像進行恢復。這裡面核心問題是這個圖像庫信息量夠不夠大,與輸入圖像是否匹配,另外就是採用什麼樣的機器學習方法。

第二種,是輸入不是單一的圖像,而是一段視頻,也就是拍攝多幀同一場景但角度稍微有所區別的圖像,這樣的多幀圖像可以提供額外的信息用於圖像放大,恢復單幀圖像所沒有包含的信息細節,這裡面也要用到機器學習的演算法,通常還會涉及到一些視覺相關的技術,比如運動估計,匹配,跟蹤等等。

但這些方法都是有局限的,能放大圖像的程度取決於輸入數據的具體情況,一般相關的論文里會以放大2x2倍,3x3倍來對比實驗結果,個人感覺一般情況下做的好的也大約就是這個量級了吧,再大的放大倍數不太現實。


推薦閱讀:

如何提升自己的編程能力(特指演算法等方面)?
現今人工智慧,機器學習領域研究的困難主要有哪些?
怎樣求出K個斐波那契數的最小公倍數?
如何判斷一條線段和一個矩形或者圓相交?

TAG:演算法 | 計算機 | 計算機圖形學 |