ImageMath 模組

ImageMath 模組可用於評估「影像表達式」,該表達式可以接受多個影像並產生結果。

ImageMath 僅支援單層影像。若要處理多頻段影像,請使用 split() 方法或 merge() 函數。

範例:使用 ImageMath 模組

from PIL import Image, ImageMath

with Image.open("image1.jpg") as im1:
    with Image.open("image2.jpg") as im2:
        out = ImageMath.lambda_eval(
          lambda args: args["convert"](args["min"](args["a"], args["b"]), 'L'),
          a=im1,
          b=im2
        )
        out = ImageMath.unsafe_eval(
          "convert(min(a, b), 'L')",
          a=im1,
          b=im2
        )
PIL.ImageMath.lambda_eval(expression, options, **kw)[原始碼]

傳回影像函數的結果。

參數:
  • expression – 接收字典的函數。

  • options – 要新增至函數字典的值。請注意,名稱必須是有效的 Python 識別碼。已棄用。您可以使用一個或多個關鍵字引數,如上述範例所示。

  • **kw – 要新增至函數字典的值,將影像名稱對應至 Image 實例。

傳回:

影像、整數值、浮點值或像素元組,取決於表達式。

PIL.ImageMath.unsafe_eval(expression, options, **kw)[原始碼]

評估影像表達式。

危險

這會使用 Python 的 eval() 函數來處理表達式字串,並帶有這樣做的安全風險。不建議在不考慮這一點的情況下處理表達式。lambda_eval() 是一個更安全的替代方案。

ImageMath 僅支援單層影像。若要處理多頻段影像,請使用 split() 方法或 merge() 函數。

參數:
  • expression – 使用標準 Python 表達式語法的字串。除了標準運算子之外,您還可以使下述函數。

  • options – 要新增至評估內容的值。請注意,名稱必須是有效的 Python 識別碼。已棄用。您可以使用一個或多個關鍵字引數,如上述範例所示。

  • **kw – 要新增至評估內容的值,將影像名稱對應至 Image 實例。

傳回:

影像、整數值、浮點值或像素元組,取決於表達式。

表達式語法

  • lambda_eval() 表達式是接收包含影像和運算子的字典的函數。

  • unsafe_eval() 表達式是標準 Python 表達式,但它們是在非標準環境中評估的。

危險

unsafe_eval() 使用 Python 的 eval() 函數來處理表達式字串,並帶有這樣做的安全風險。不建議在不考慮這一點的情況下處理表達式。lambda_eval() 是一個更安全的替代方案。

標準運算子

您可以使用標準算術運算子進行加法 (+)、減法 (-)、乘法 (*) 和除法 (/)。

模組也支援一元減號 (-)、模數 (%) 和乘冪 (**) 運算子。

請注意,所有運算都是根據需要使用 32 位元整數或 32 位元浮點數值完成的。例如,如果您新增兩個 8 位元影像,結果將是 32 位元整數影像。如果您將浮點常數新增至 8 位元影像,結果將是 32 位元浮點影像。

您可以使用下面所述的 convert()float()int() 函數強制轉換。

位元運算子

模組還提供在個別位元上運算的運算。這包括和 (&)、或 (|) 和互斥或 (^)。您也可以反轉 (~) 所有像素位元。

請注意,在套用位元運算之前,運算元會轉換為 32 位元帶正負號的整數。這表示如果您反轉一般的灰階影像,將會得到負值。您可以使用和 (&) 運算子遮罩掉不想要的位元。

位元運算子不適用於浮點影像。

邏輯運算子

類似 andornot 的邏輯運算子會作用於整個影像,而不是個別像素。

一個空的影像(所有像素值為零)會被視為假 (false)。所有其他影像則會被視為真 (true)。

請注意,andor 會返回最後被評估的運算元,而 not 並不總是返回布林值。

內建函式

這些函式會應用於每個個別的像素。

abs(image)

絕對值。

convert(image, mode)

將影像轉換為指定的模式。 模式必須以字串常數的形式給定。

float(image)

將影像轉換為 32 位元浮點數。 這等同於 convert(image, “F”)。

int(image)

將影像轉換為 32 位元整數。 這等同於 convert(image, “I”)。

請注意,如果需要獲得正確的結果,1 位元和 8 位元的影像會自動轉換為 32 位元整數。

max(image1, image2)

最大值。

min(image1, image2)

最小值。