寫在最前:用最簡單的方式,講述最深刻的知識。
%%%%%%% %%%%%%% %%%%%%% %%%%%%% %%%%%%% %%%%%%%
圖像的縮放,對於大家來說一定是個非常熟悉的過程了:最簡單直接的,就是雙手按住觸屏手機,手指外滑/內滑,就可以實現了。對於設計方向的小夥伴,通過PS,繪圖,或者任何一中程式語言,都有非常方便的方法可以實現。
那現在不妨想一想,這簡單效果背後,是怎樣的算法思想呢?今天,將以一種非常簡單、直接的方式,為大家描述圖像縮放算法的基本思想。
我們首先需要大概理解一下圖像的概念:有一種圖形格式(位圖),是利用像素點的方式,表述該點的顏色,看下面的圖。4行,七列(阿拉伯數字表示行,漢語數字表示列),一共28位小朋友排成的隊伍,每個小朋友有不同的顏色。這樣的一個簡單的排列,就是我們常見的4px*7px的圖片啦,一共是28個像素點,如果小朋友個數,即像素點個數,足夠多的話,就可以形成各種有意思的圖片了。

理解了位圖圖片的基本概念之後,現在開始討論縮放的問題。為了使問題簡化,我們考慮更簡單的情況:只有1行小朋友的時候,如下圖所示:

我們知道,每個小朋友都是有「寬度」的,即其所佔空間的大小,記為d1(可記為d1=1),則七位小朋友佔總的空間大小:D1=7*d1=7。
圖像縮放,即在佔據相同空間(D1=D2=7)的情況下,用5個(隨便舉的例子)小朋友實現排列,那麼每個小朋友所佔的空間大小就發生了變化:d2=D2/5=1.4。這樣看來,每個小朋友都應該變胖了一些才對,請看下圖:

這樣的效果,即把圖像縮小成原來圖像的5/7,只用5個像素點來表示之前7個點需要表示的數據。
理解這些之後,需要面臨一個非常關鍵的問題了:下面的五位小朋友,應該怎樣對它們進行顏色的選取呢?從上圖我們可以發現,上下兩列隊伍已經對齊,下面這一列的每個小朋友,在橫向上,都處在上面這一列兩個小朋友之間,為了更加明確地表述,見下圖:

則,下面的小朋友的顏色,應該是上面左右兩個小朋友之間進行選擇!
算法一:最鄰近插值!
顧名思義,和哪個小朋友更接近,就選擇哪一個!即上圖所示內容。可以看到,我們丟失了部分信息,但是整體的顏色,和原圖像是基本相同的!
算法二:雙線性內插值!
這個名稱有點不好理解。我們暫且忽略其稱呼,簡單理解起來,即綜合考慮左右兩邊的情況,按距離的遠近進行綜合取捨。具體情況見下圖所示:

這樣看來,所得到的新圖形的顏色,和之前的圖形之間,是不是還原度更高呢?並且連算法一中丟失掉的綠色,也部分地保留了下來。
這樣得到的圖形,也會更加地平滑。
這樣,大家應該都明白算法的核心內容了吧?至於怎樣用代碼實現,以及選擇什麼語言更加方便,就見仁見智了!
至於最初28個小朋友,如果行數變成3行,經過變換之後的圖形是怎樣的呢?
用最簡單的方式,講述最深刻的知識結構!
歡迎關注!