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 位元帶正負號的整數。這表示如果您反轉一般的灰階影像,將會得到負值。您可以使用和 (&) 運算子遮罩掉不想要的位元。
位元運算子不適用於浮點影像。
邏輯運算子¶
類似 and
、or
和 not
的邏輯運算子會作用於整個影像,而不是個別像素。
一個空的影像(所有像素值為零)會被視為假 (false)。所有其他影像則會被視為真 (true)。
請注意,and
和 or
會返回最後被評估的運算元,而 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)
最小值。