skimage.exposure
#
影像強度調整,例如直方圖均衡化等。
對輸入影像執行 Gamma 校正。 |
|
對輸入影像執行對數校正。 |
|
對輸入影像執行 Sigmoid 校正。 |
|
傳回給定影像的累積分布函數 (cdf)。 |
|
對比限制自適應直方圖均衡化 (CLAHE)。 |
|
傳回直方圖均衡化後的影像。 |
|
傳回影像的直方圖。 |
|
判斷影像是否為低對比。 |
|
調整影像,使其累積直方圖與另一影像的直方圖相符。 |
|
傳回伸展或縮減其強度級別後的影像。 |
- skimage.exposure.adjust_gamma(image, gamma=1, gain=1)[原始碼]#
對輸入影像執行 Gamma 校正。
也稱為冪律轉換。此函數根據公式
O = I**gamma
,在將每個像素縮放到 0 到 1 的範圍後,逐像素轉換輸入影像。- 參數:
- imagendarray
輸入影像。
- gammafloat,選填
非負實數。預設值為 1。
- gainfloat,選填
常數乘數。預設值為 1。
- 傳回:
- outndarray
經過 Gamma 校正的輸出影像。
另請參閱
注意事項
對於大於 1 的 gamma 值,直方圖將向左移動,且輸出影像會比輸入影像更暗。
對於小於 1 的 gamma 值,直方圖將向右移動,且輸出影像會比輸入影像更亮。
參考資料
範例
>>> from skimage import data, exposure, img_as_float >>> image = img_as_float(data.moon()) >>> gamma_corrected = exposure.adjust_gamma(image, 2) >>> # Output is darker for gamma > 1 >>> image.mean() > gamma_corrected.mean() True
- skimage.exposure.adjust_log(image, gain=1, inv=False)[原始碼]#
對輸入影像執行對數校正。
此函數根據公式
O = gain*log(1 + I)
,在將每個像素縮放到 0 到 1 的範圍後,逐像素轉換輸入影像。對於反對數校正,公式為O = gain*(2**I - 1)
。- 參數:
- imagendarray
輸入影像。
- gainfloat,選填
常數乘數。預設值為 1。
- invfloat,選填
若為 True,則執行反對數校正,否則校正將為對數。預設值為 False。
- 傳回:
- outndarray
經過對數校正的輸出影像。
另請參閱
參考資料
- skimage.exposure.adjust_sigmoid(image, cutoff=0.5, gain=10, inv=False)[原始碼]#
對輸入影像執行 Sigmoid 校正。
也稱為對比調整。此函數根據公式
O = 1/(1 + exp*(gain*(cutoff - I)))
,在將每個像素縮放到 0 到 1 的範圍後,逐像素轉換輸入影像。- 參數:
- imagendarray
輸入影像。
- cutofffloat,選填
Sigmoid 函數的截止值,會將特性曲線沿水平方向移動。預設值為 0.5。
- gainfloat,選填
Sigmoid 函數指數冪中的常數乘數。預設值為 10。
- invbool,選填
若為 True,則傳回負 Sigmoid 校正。預設值為 False。
- 傳回:
- outndarray
經過 Sigmoid 校正的輸出影像。
另請參閱
參考資料
[1]Gustav J. Braun, “Image Lightness Rescaling Using Sigmoidal Contrast Enhancement Functions”, http://markfairchild.org/PDFs/PAP07.pdf
- skimage.exposure.cumulative_distribution(image, nbins=256)[原始碼]#
傳回給定影像的累積分布函數 (cdf)。
- 參數:
- image陣列
影像陣列。
- nbinsint,選填
影像直方圖的 bin 數量。
- 傳回:
- img_cdf陣列
累積分布函數的值。
- bin_centers陣列
bin 的中心。
另請參閱
參考資料
範例
>>> from skimage import data, exposure, img_as_float >>> image = img_as_float(data.camera()) >>> hi = exposure.histogram(image) >>> cdf = exposure.cumulative_distribution(image) >>> all(cdf[0] == np.cumsum(hi[0])/float(image.size)) True
- skimage.exposure.equalize_adapthist(image, kernel_size=None, clip_limit=0.01, nbins=256)[原始碼]#
對比限制自適應直方圖均衡化 (CLAHE)。
一種用於局部對比增強的演算法,它使用在影像的不同圖塊區域上計算的直方圖。因此,即使在比影像大部分區域更暗或更亮的區域中,也可以增強局部細節。
- 參數:
- image(M[, …][, C]) ndarray
輸入影像。
- kernel_sizeint 或 array_like,選填
定義演算法中使用的上下文區域形狀。如果傳遞可迭代物件,則其元素數量必須與
image.ndim
(不含色彩通道) 相同。如果為整數,則會廣播到每個image
維度。預設情況下,kernel_size
為image
高度的 1/8 乘上寬度的 1/8。- clip_limitfloat,選填
裁剪限制,標準化介於 0 和 1 之間(值越高,對比度越高)。
- nbinsint,選填
直方圖(「資料範圍」)的灰階 bin 數量。
- 傳回:
- out(M[, …][, C]) ndarray
經過均衡化的影像,具有 float64 dtype。
注意事項
- 對於彩色影像,會執行下列步驟
影像會轉換為 HSV 色彩空間
CLAHE 演算法會在 V (值) 通道上執行
影像會轉換回 RGB 空間並傳回
對於 RGBA 影像,原始 alpha 通道會被移除。
版本 0.17 中的變更:此函數傳回的值會稍微向上移動,因為捨入行為的內部變更。
參考資料
- skimage.exposure.equalize_hist(image, nbins=256, mask=None)[原始碼]#
傳回直方圖均衡化後的影像。
- 參數:
- image陣列
影像陣列。
- nbinsint,選填
影像直方圖的 bin 數量。注意:此引數會針對整數影像忽略,因為每個整數都是自己的 bin。
- maskndarray (布林值或 0 和 1),選填
與
image
具有相同形狀的陣列。只有 mask == True 的點會用於均衡化,而均衡化會套用至整個影像。
- 傳回:
- outfloat 陣列
直方圖均衡化後的影像陣列。
注意事項
此函數改編自 [1],並經作者許可。
參考資料
- skimage.exposure.histogram(image, nbins=256, source_range='image', normalize=False, *, channel_axis=None)[原始碼]#
傳回影像的直方圖。
與
numpy.histogram
不同,此函數會返回 bin 的中心點,並且不會重新分組整數陣列。對於整數陣列,每個整數值都有自己的 bin,這可以提高速度和強度解析度。如果沒有設定
channel_axis
,則會在扁平化的影像上計算直方圖。對於彩色或多通道影像,請設定channel_axis
以便為所有通道使用相同的 binning。或者,可以針對每個通道單獨應用此函數,以獲得每個顏色通道的直方圖,並使用單獨的 binning。- 參數:
- image陣列
輸入影像。
- nbinsint,選填
用於計算直方圖的 bin 數量。對於整數陣列,此值會被忽略。
- source_range字串,選用
‘image’ (預設) 從輸入影像決定範圍。 ‘dtype’ 從該資料類型的影像預期範圍決定範圍。
- normalize布林值,選用
如果為 True,則將直方圖除以其值的總和進行正規化。
- channel_axis整數或 None,選用
如果為 None,則假設影像為灰階 (單通道) 影像。否則,此參數指示陣列的哪個軸對應於通道。
- 傳回:
- hist陣列
直方圖的值。當
channel_axis
不是 None 時,hist 將會是一個二維陣列,其中第一個軸對應於通道。- bin_centers陣列
bin 中心點的值。
範例
>>> from skimage import data, exposure, img_as_float >>> image = img_as_float(data.camera()) >>> np.histogram(image, bins=2) (array([ 93585, 168559]), array([0. , 0.5, 1. ])) >>> exposure.histogram(image, nbins=2) (array([ 93585, 168559]), array([0.25, 0.75]))
- skimage.exposure.is_low_contrast(image, fraction_threshold=0.05, lower_percentile=1, upper_percentile=99, method='linear')[原始碼]#
判斷影像是否為低對比。
- 參數:
- image類陣列
測試中的影像。
- fraction_threshold浮點數,選用
低對比度分位數門檻。當影像的亮度範圍小於其資料類型完整範圍的此分位數時,則認為影像為低對比度。[1]
- lower_percentile浮點數,選用
在計算影像對比度時,忽略低於此分位數的值。
- upper_percentile浮點數,選用
在計算影像對比度時,忽略高於此分位數的值。
- method字串,選用
對比度決定方法。目前唯一可用的選項是“linear”。
- 傳回:
- out布林值
當影像被判斷為低對比度時為 True。
注意事項
對於布林值影像,只有當所有值都相同時,此函數才會返回 False(方法、門檻值和分位數參數會被忽略)。
參考資料
範例
>>> image = np.linspace(0, 0.04, 100) >>> is_low_contrast(image) True >>> image[-1] = 1 >>> is_low_contrast(image) True >>> is_low_contrast(image, upper_percentile=100) False
- skimage.exposure.match_histograms(image, reference, *, channel_axis=None)[原始碼]#
調整影像,使其累積直方圖與另一影像的直方圖相符。
此調整會單獨應用於每個通道。
- 參數:
- imagendarray
輸入影像。可以是灰階或彩色。
- referencendarray
用於比對直方圖的影像。必須與影像具有相同數量的通道。
- channel_axis整數或 None,選用
如果為 None,則假設影像為灰階 (單通道) 影像。否則,此參數指示陣列的哪個軸對應於通道。
- 傳回:
- matchedndarray
已轉換的輸入影像。
- 引發:
- ValueError
當輸入影像和參考影像中的通道數不同時拋出。
參考資料
- skimage.exposure.rescale_intensity(image, in_range='image', out_range='dtype')[原始碼]#
傳回伸展或縮減其強度級別後的影像。
輸入和輸出的目標強度範圍,分別為
in_range
和out_range
,用於延展或縮小輸入影像的強度範圍。請參閱以下範例。- 參數:
- image陣列
影像陣列。
- in_range, out_range字串或 2 元組,選用
輸入和輸出影像的最小和最大強度值。以下列舉此參數的可能值。
- ‘image’
使用影像最小/最大值作為強度範圍。
- ‘dtype’
使用影像的 dtype 的最小/最大值作為強度範圍。
- dtype-name
使用基於所需
dtype
的強度範圍。必須是DTYPE_RANGE
中的有效鍵值。- 2 元組
使用
range_values
作為明確的最小/最大強度值。
- 傳回:
- out陣列
在重新調整強度後的影像陣列。此影像的 dtype 與輸入影像相同。
另請參閱
注意事項
在版本 0.17 中變更:輸出陣列的 dtype 已變更為與輸入 dtype 相符,如果輸出範圍是由一對值指定,則為浮點數。
範例
預設情況下,輸入影像的最小/最大強度會延展至影像的 dtype 所允許的極限,因為
in_range
預設為 ‘image’,而out_range
預設為 ‘dtype’。>>> image = np.array([51, 102, 153], dtype=np.uint8) >>> rescale_intensity(image) array([ 0, 127, 255], dtype=uint8)
很容易不小心將影像 dtype 從 uint8 轉換為浮點數
>>> 1.0 * image array([ 51., 102., 153.])
使用
rescale_intensity
重新調整為浮點數 dtype 的正確範圍>>> image_float = 1.0 * image >>> rescale_intensity(image_float) array([0. , 0.5, 1. ])
若要保持原始的低對比度,請使用
in_range
參數>>> rescale_intensity(image_float, in_range=(0, 255)) array([0.2, 0.4, 0.6])
如果
in_range
的最小/最大值大於/小於最小/最大影像強度,則會裁剪強度等級>>> rescale_intensity(image_float, in_range=(0, 102)) array([0.5, 1. , 1. ])
如果您的影像是帶正負號的整數,但只想將影像重新調整到正值範圍,請使用
out_range
參數。在這種情況下,輸出 dtype 將為浮點數>>> image = np.array([-10, 0, 10], dtype=np.int8) >>> rescale_intensity(image, out_range=(0, 127)) array([ 0. , 63.5, 127. ])
若要取得具有特定 dtype 的目標範圍,請使用
.astype()
>>> rescale_intensity(image, out_range=(0, 127)).astype(np.int8) array([ 0, 63, 127], dtype=int8)
如果輸入影像是恆定的,則輸出會直接裁剪到輸出範圍: >>> image = np.array([130, 130, 130], dtype=np.int32) >>> rescale_intensity(image, out_range=(0, 127)).astype(np.int32) array([127, 127, 127], dtype=int32)