當前位置:
首頁 > 知識 > Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

Snowy

Snowy是一個能夠處理和生成圖像的小模塊。它具有以下特徵:

  • 淺顯易懂的API介面(只有開源函數組成)。

  • 純Python3 語言編寫。

  • 使用numba進行加速優化。

  • 可配置的邊界條件(參見校正模式)。

Snowy 並不把圖片定義為一個類對象,而是定義為一個三維numpy數組,該三維數組以行為主序。舉個例子,RGB圖像具有形狀[高度,寬度,3 ],灰度圖像具有形狀[高度,寬度,1 ]。Snowy提供了一些實用功能,使其易於與其他模塊一起工作(參見互用性)。

安裝

安裝和更新Snowy,請執行如下命令:

pip3 install -U snowy

使用舉例尺寸調整和模糊處理

以下部分代碼首先對圖片進行尺寸調整,然後進行模糊化處理,最後把處理後的圖片和原始圖片水平連接在一起。

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

以下部分代碼首先使用最近鄰濾波器對對圖片進行放大,再使用默認的米切爾濾波器進行放大。

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

旋轉和翻轉

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

裁剪

如果您需要對圖片進行裁剪,只需使用numpy的切片功能即可。

例如,如下代碼將載入一張OpenEXR格式的圖片,並截取圖片的上半部分。

Snowy: Numpy加速的圖像處理庫

順便說一句,如果您對色調映射以及其他的HDR操作感興趣的話,務必看一下hydra模塊。如果您只是想簡單載入或者存儲原始雙精度數據的話,可以考慮使用npy文件,而不是用圖像文件。相對應的函數是numpy.load(filename) 和 numpy.save(filename, array)。

Snowy: Numpy加速的圖像處理庫

Alpha合成

如果您要將某張圖片的一部分複製到另外一張圖上,只需使用numpy的切片功能即可。

但是您想將兩部分圖片實現source-over(在目標圖像上顯示源圖像)風格的疊加,使用numpy的函數是比較麻煩的。Snowy提供的組合功能使這樣的操作變得更容易:

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

陰影

把模糊處理和合成兩個功能聯合起來使用,可以生成帶陰影效果的圖片,如下

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

梯度雜訊

Snowy的generate_noise函數可以生成一個值在[-1,+1 ]之間的單通道圖像。下面的代碼生成了一個可以平鋪的平方雜訊圖像:

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

如果您對其他類型的雜訊感興趣的話,或者您需要一個超級快的雜訊生成器,你可以試試pyfastnoisesimd.模塊

距離場

下面這個例子使用generate_sdf函數從一副黑白圖像產生了有向距離場,圖像由被正方形包圍的兩個圓構成。注意使用歸一化函數(unitize)將圖像值調整到[0,1]之間。

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

生成圖像

結合Snowy獨特的功能特性和numpy可以生成一些有序的程序化圖像。下面的例子對一個虛構海島生成了對應的海拔圖像。

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

形變模式

Snowy的blur, resize, generate_noise, and generate_sdf的函數都有一個wrapx和wrapy參數,默認值是False。這些參數告訴Snowy如何從源圖像邊界外或雜訊函數取樣。

為了幫助大家理解參數的含義,看下面這幅平鋪圖片及其2*2的擴展圖像:

Snowy: Numpy加速的圖像處理庫

Snowy: Numpy加速的圖像處理庫

接下來,我們對擴展圖像進行模糊處理:

Snowy: Numpy加速的圖像處理庫

看到圖片之間的接縫了么?現在我們重新對圖片進行模糊處理,但是在調用blur函數時,將wrapx和wrapy參數設置為True。

Snowy: Numpy加速的圖像處理庫

可形變梯度雜訊

形變參數對於2D的雜訊處理也是很有幫助的。一種生成可平鋪梯度雜訊的方法是在圓柱體,圓環面或立方體的表面上對3D雜訊進行採樣。然而,Snowy可以通過arithmetic函數生成2D雜訊,這種方式更加有效。

下面的圖片,我們使用generate_noise函數創建了一個128x256雜訊圖像,沒有使用wrapx參數,然後將其水平擴展兩次:

Snowy: Numpy加速的圖像處理庫

下面是另一幅梯度雜訊的圖像,但是這次使用了wrapx參數:

Snowy: Numpy加速的圖像處理庫

可行變距離場

Snowy的generate_sdf函數同樣有warp參數,下面是一個4*2擴展的距離場圖像:

Snowy: Numpy加速的圖像處理庫

下面是同樣的圖像,但是在調用generate_sdf函數時,wrapx和wrapy參數設置為True:

Snowy: Numpy加速的圖像處理庫

互操作性

Snowy的演算法要求可處理的圖像是以行為主序的三維float64精度numpy數組,並且顏色通道位於尾部維度中。如果您使用的其他模塊沒有遵循此約定,可以考慮使用以下互操作函數進行格式轉換。

    • 若要從灰度圖像尾部添加或移除1單位,請使用reshape 和unshape函數。

    • 若要在主維度中交換顏色通道,請使用to_planar 和 from_planar。

    • 若要在float64和其他類型之間進行轉換,只需使用numpy。 例如,np.uint8(myimg * 255)或np.float64(myimg)/255。

    • 若要交換行列,請使用numpy的swapaxes函數。

英文原文:https://github.prideout.net/snowy/
譯者:少年

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

Github皮膚:XP風格皮膚

TAG:Python部落 |