skimage.restoration
#
復原演算法,例如,解捲積演算法、去噪等。
為 restoration.rolling_ball 建立球形核心。 |
|
校準去噪函數並返回最佳的 J 不變版本。 |
|
循環旋轉(重複將 func 應用於 x 的移位版本)。 |
|
使用雙邊濾波器對影像進行去噪。 |
|
應用去噪函數的 J 不變版本。 |
|
對 2D-4D 灰階或 RGB 影像執行非局部均值去噪。 |
|
使用 split-Bregman 優化執行總變異去噪。 |
|
以 nD 執行總變異去噪。 |
|
對影像執行小波去噪。 |
|
為 restoration.rolling_ball 建立橢圓形核心。 |
|
(高斯)雜訊標準差的穩健小波式估計器。 |
|
使用雙調和方程式修補影像中遮罩的點。 |
|
Richardson-Lucy 反摺積。 |
|
透過滾動/平移核心來估計背景強度。 |
|
無監督的維納-杭特反摺積。 |
|
從包裹的相位影像中恢復原始影像。 |
|
維納-杭特反摺積 |
- skimage.restoration.ball_kernel(radius, ndim)[原始碼]#
為 restoration.rolling_ball 建立球形核心。
- 參數:
- radiusint
球體的半徑。
- ndimint
球體的維度數量。
ndim
應符合將套用核心的影像維度。
- 返回:
- kernelndarray
包含橢圓體上半部分表面強度的核心。
另請參閱
- skimage.restoration.calibrate_denoiser(image, denoise_function, denoise_parameters, *, stride=4, approximate_loss=True, extra_output=False)[原始碼]#
校準去噪函數並返回最佳的 J 不變版本。
返回的函數會以針對輸入影像去噪設定的最佳參數值進行部分評估。
- 參數:
- imagendarray
要進行去噪的輸入資料(使用
img_as_float
轉換)。- denoise_functionfunction
要校準的去噪函數。
- denoise_parametersdict of list
要針對
denoise_function
校準的參數範圍。- strideint,可選
將
denoise_function
轉換為 J 不變性時所使用的遮罩程序中的步幅。- approximate_lossbool,可選
是否透過僅在影像的一個遮罩版本上計算來近似用於評估去噪器的自我監督損失。如果為 False,則執行時間將會延長
stride**image.ndim
倍。- extra_outputbool,可選
如果為 True,則除了校準的去噪函數外,還會返回參數和損失
- 返回:
- best_denoise_functionfunction
denoise_function
的最佳 J 不變版本。- 如果
extra_output
為 True,則也會返回以下元組 - (parameters_tested, losses)元組 (list of dict, list of int)
針對
denoise_function
測試的參數清單,以 kwargs 字典表示。parameters_tested
中每個參數集的自我監督損失。
注意事項
校準程序使用自我監督的均方誤差損失來評估
denoise_function
的 J 不變版本的效能。自我監督損失的最小化器也是真實損失(即,真正的 MSE 誤差)的最小化器 [1]。返回的函數可用於原始雜訊影像或其他具有相似特徵的影像。- 增加步幅會提高
best_denoise_function
的效能 但會增加其執行時間。它對校準的執行時間沒有影響。
參考文獻
[1]J. Batson & L. Royer. Noise2Self: Blind Denoising by Self-Supervision, International Conference on Machine Learning, p. 524-533 (2019).
範例
>>> from skimage import color, data >>> from skimage.restoration import denoise_tv_chambolle >>> import numpy as np >>> img = color.rgb2gray(data.astronaut()[:50, :50]) >>> rng = np.random.default_rng() >>> noisy = img + 0.5 * img.std() * rng.standard_normal(img.shape) >>> parameters = {'weight': np.arange(0.01, 0.3, 0.02)} >>> denoising_function = calibrate_denoiser(noisy, denoise_tv_chambolle, ... denoise_parameters=parameters) >>> denoised_img = denoising_function(img)
- skimage.restoration.cycle_spin(x, func, max_shifts, shift_steps=1, num_workers=None, func_kw=None, *, channel_axis=None)[原始碼]#
循環旋轉(重複將 func 應用於 x 的移位版本)。
- 參數:
- x類陣列
輸入到
func
的資料。- func函數
要套用至
x
的循環移位版本的函數。應將x
作為其第一個引數。任何額外的引數都可以透過func_kw
提供。- max_shiftsint 或 tuple
如果為整數,則將沿
x
的每個軸使用range(0, max_shifts+1)
中的移位。如果為元組,則range(0, max_shifts[i]+1)
將沿軸 i。- shift_stepsint 或 tuple,可選
沿軸 i 套用的移位步幅大小為::
range((0, max_shifts[i]+1, shift_steps[i]))
。如果提供整數,則所有軸都使用相同的步幅大小。- num_workersint 或 None,可選
在循環旋轉期間要使用的並行執行緒數量。如果設定為
None
,則會使用所有可用的核心。- func_kwdict,可選
要提供給
func
的額外關鍵字引數。- channel_axisint 或 None,可選
如果為 None,則假設影像為灰階(單通道)影像。否則,此參數會指出陣列的哪個軸對應於通道。
0.19 版本新增:
channel_axis
已在 0.19 中新增。
- 返回:
- avg_ynp.ndarray
在指定軸移位的所有組合上平均的
func(x, **func_kw)
輸出。
注意事項
循環旋轉被提出作為透過對移變轉換執行多次循環移位來接近移位不變性的一種方式 [1]。
對於 n 層離散小波轉換,使用者可能希望執行所有移位,直到
max_shifts = 2**n - 1
。實際上,通常只需對每個軸進行少量移位即可實現大部分優勢。對於諸如分塊離散餘弦轉換之類的轉換,使用者可能希望評估轉換所使用的分塊大小的移位。
參考文獻
[1]R.R. Coifman and D.L. Donoho. “Translation-Invariant De-Noising”. Wavelets and Statistics, Lecture Notes in Statistics, vol.103. Springer, New York, 1995, pp.125-150. DOI:10.1007/978-1-4612-2544-7_9
範例
>>> import skimage.data >>> from skimage import img_as_float >>> from skimage.restoration import denoise_tv_chambolle, cycle_spin >>> img = img_as_float(skimage.data.camera()) >>> sigma = 0.1 >>> img = img + sigma * np.random.standard_normal(img.shape) >>> denoised = cycle_spin(img, func=denoise_tv_chambolle, ... max_shifts=3)
- skimage.restoration.denoise_bilateral(image, win_size=None, sigma_color=None, sigma_spatial=1, bins=10000, mode='constant', cval=0, *, channel_axis=None)[原始碼]#
使用雙邊濾波器對影像進行去噪。
- 參數:
- imagendarray,形狀 (M, N[, 3])
輸入影像,2D 灰階或 RGB。
- win_size整數
用於濾波的視窗大小。如果未指定 win_size,則會計算為
max(5, 2 * ceil(3 * sigma_spatial) + 1)
。- sigma_color浮點數
灰階值/顏色距離(輻射相似性)的標準差。較大的值會導致對具有較大輻射差異的像素進行平均。如果為
None
,將會使用image
的標準差。- sigma_spatial浮點數
範圍距離的標準差。較大的值會導致對具有較大空間差異的像素進行平均。
- bins整數
用於顏色濾波的高斯權重的離散值數量。較大的值會提高準確性。
- mode{‘constant’, ‘edge’, ‘symmetric’, ‘reflect’, ‘wrap’}
如何處理影像邊界外的值。請參閱
numpy.pad
以獲取詳細資訊。- cval整數或浮點數
與模式 ‘constant’ 結合使用,表示影像邊界外的值。
- channel_axisint 或 None,可選
如果為
None
,則假設影像為灰階(單通道)。否則,此參數指示陣列的哪個軸對應於通道。0.19 版本新增:
channel_axis
已在 0.19 中新增。
- 返回:
- denoisedndarray
已降噪的影像。
注意事項
這是一個保留邊緣的降噪濾波器。它會根據像素的空間接近度和輻射相似性進行平均 [1]。
空間接近度通過兩個像素之間的歐幾里得距離的高斯函數和某個標準差(
sigma_spatial
)來衡量。輻射相似性通過兩個顏色值之間的歐幾里得距離的高斯函數和某個標準差(
sigma_color
)來衡量。請注意,如果影像為任何
int
dtype,image
將使用img_as_float
函數進行轉換,因此標準差(sigma_color
)將在[0, 1]
範圍內。有關 scikit-image 的資料類型轉換以及影像在這些轉換中如何重新縮放的更多資訊,請參閱:https://scikit-image.dev.org.tw/docs/stable/user_guide/data_types.html。
參考文獻
[1]C. Tomasi 和 R. Manduchi。「用於灰階和彩色影像的雙邊濾波。」 IEEE 國際電腦視覺會議 (1998) 839-846。 DOI:10.1109/ICCV.1998.710815
範例
>>> from skimage import data, img_as_float >>> astro = img_as_float(data.astronaut()) >>> astro = astro[220:300, 220:320] >>> rng = np.random.default_rng() >>> noisy = astro + 0.6 * astro.std() * rng.random(astro.shape) >>> noisy = np.clip(noisy, 0, 1) >>> denoised = denoise_bilateral(noisy, sigma_color=0.05, sigma_spatial=15, ... channel_axis=-1)
- skimage.restoration.denoise_invariant(image, denoise_function, *, stride=4, masks=None, denoiser_kwargs=None)[原始碼]#
應用去噪函數的 J 不變版本。
- 參數:
- imagendarray (M[, N[, …]][, C]),整數、無號整數或浮點數
要降噪的輸入資料。
image
可以是任何數值類型,但為了計算降噪影像,它會被轉換為浮點數的 ndarray(使用img_as_float
)。- denoise_functionfunction
原始降噪函數。
- strideint,可選
將
denoise_function
轉換為 J 不變性時所使用的遮罩程序中的步幅。- masksndarray 的列表,可選
用於計算 J 不變輸出的遮罩集。如果為
None
,將會使用覆蓋影像的完整遮罩集。- denoiser_kwargs
傳遞給
denoise_function
的關鍵字引數。
- 返回:
- outputndarray
已降噪的影像,與
image
具有相同的形狀。
注意事項
如果降噪函數對每個像素所做的預測不依賴於原始影像中該像素的值,則該函數是 J 不變的。每個像素的預測可能改為使用影像其餘部分包含的所有相關資訊,這通常非常重要。可以使用 [1] 中描述的簡單遮罩程序將任何函數轉換為 J 不變函數。
只要每個像素中的雜訊是獨立的,J 不變降噪器的像素錯誤就與雜訊無關。因此,降噪影像和雜訊影像之間的平均差異,即「自我監督損失」,與降噪影像和原始乾淨影像之間的差異(即「地面實況損失」)相同(最多相差一個常數)。
這表示可以使用雜訊資料單獨找到給定影像的最佳 J 不變降噪器,方法是選擇最小化自我監督損失的降噪器。
參考文獻
[1]J. Batson & L. Royer. Noise2Self: Blind Denoising by Self-Supervision, International Conference on Machine Learning, p. 524-533 (2019).
範例
>>> import skimage >>> from skimage.restoration import denoise_invariant, denoise_tv_chambolle >>> image = skimage.util.img_as_float(skimage.data.chelsea()) >>> noisy = skimage.util.random_noise(image, var=0.2 ** 2) >>> denoised = denoise_invariant(noisy, denoise_function=denoise_tv_chambolle)
- skimage.restoration.denoise_nl_means(image, patch_size=7, patch_distance=11, h=0.1, fast_mode=True, sigma=0.0, *, preserve_range=False, channel_axis=None)[原始碼]#
對 2D-4D 灰階或 RGB 影像執行非局部均值去噪。
- 參數:
- image2D 或 3D ndarray
要降噪的輸入影像,可以是 2D 或 3D,灰階或 RGB(僅適用於 2D 影像,請參閱
channel_axis
參數)。可以有任意數量的通道(不一定必須是 RGB)。- patch_size整數,可選
用於降噪的區塊大小。
- patch_distance整數,可選
用於降噪的區塊搜尋最大像素距離。
- h浮點數,可選
截止距離(以灰階表示)。h 越高,接受區塊的容許度就越高。較高的 h 會產生較平滑的影像,但會犧牲模糊功能。對於標準差為 sigma 的高斯雜訊,經驗法則是選擇略低於 sigma 的 h 值。
- fast_mode布林值,可選
如果為 True(預設值),則會使用非局部均值演算法的快速版本。如果為 False,則會使用非局部均值的原始版本。有關演算法的更多詳細資訊,請參閱「說明」部分。
- sigma浮點數,可選
(高斯)雜訊的標準差。如果提供,則會計算更穩健的區塊權重,其中會考慮預期的雜訊變異數(請參閱下面的「說明」)。
- preserve_range布林值,可選
是否保留原始值範圍。否則,將根據
img_as_float
的慣例轉換輸入影像。另請參閱 https://scikit-image.dev.org.tw/docs/dev/user_guide/data_types.html- channel_axisint 或 None,可選
如果為 None,則假設影像為灰階(單通道)影像。否則,此參數會指出陣列的哪個軸對應於通道。
0.19 版本新增:
channel_axis
已在 0.19 中新增。
- 返回:
- resultndarray
已降噪的影像,與
image
具有相同的形狀。
注意事項
非局部均值演算法非常適合用於對具有特定紋理的影像進行降噪。該演算法的原理是將給定像素的值與有限鄰域中其他像素的值平均,前提是中心位於其他像素上的區塊與中心位於感興趣像素上的區塊足夠相似。
在演算法的原始版本中 [1],對應於
fast=False
,其計算複雜度為image.size * patch_size ** image.ndim * patch_distance ** image.ndim
因此,更改圖塊的大小或它們的最大距離對於計算時間有很大的影響,尤其是對於 3D 影像。
然而,預設行為對應於
fast_mode=True
,它會使用另一個版本的非局部均值演算法 [2],其複雜度為image.size * patch_distance ** image.ndim
由於計算給定位移的圖塊距離積分,減少了運算次數 [1],計算時間僅稍微取決於圖塊大小。因此,此演算法的執行速度比傳統演算法(
fast_mode=False
)更快,但代價是使用兩倍的記憶體。此實作已被證明比其他替代方案更有效率,例如,請參閱 [3]。與傳統演算法相比,圖塊中的所有像素都以相同的權重影響與另一個圖塊的距離,無論它們與圖塊中心的距離有多遠。這種較粗略的距離計算可能會導致稍微較差的去噪效果。此外,對於小圖像(線性尺寸僅為圖塊大小數倍的圖像),由於邊界效應,傳統演算法可能更快。
在去噪之前,會使用
skimage.util.pad
的reflect
模式來填充圖像。如果提供雜訊標準差
sigma
,則會使用更穩健的圖塊權重計算方式。從計算出的圖塊距離中減去已知的雜訊變異數可改善圖塊相似性的估計值,從而適度提升去噪效能 [4]。在 [3] 中,它也被提及為該演算法快速變體的選項。當提供
sigma
時,通常應使用較小的h
來避免過度平滑。h
的最佳值取決於圖像內容和雜訊程度,但當fast_mode
為True
時,一個合理的起點是h = 0.8 * sigma
;當fast_mode
為False
時,則為h = 0.6 * sigma
。參考文獻
[1] (1,2)A. Buades, B. Coll, & J-M. Morel. 一種用於影像去噪的非局部演算法。在 CVPR 2005,第 2 卷,第 60-65 頁,IEEE。DOI:10.1109/CVPR.2005.38
[2]J. Darbon, A. Cunha, T.F. Chan, S. Osher 和 G.J. Jensen,快速非局部濾波應用於電子低溫顯微鏡,在第五屆 IEEE 生物醫學成像國際研討會:從奈米到巨觀,2008 年,第 1331-1334 頁。DOI:10.1109/ISBI.2008.4541250
[3] (1,2)Jacques Froment。免參數的快速逐像素非局部均值去噪。線上影像處理,2014 年,第 4 卷,第 300-326 頁。DOI:10.5201/ipol.2014.120
[4]A. Buades, B. Coll, & J-M. Morel. 非局部均值去噪。線上影像處理,2011 年,第 1 卷,第 208-212 頁。DOI:10.5201/ipol.2011.bcm_nlm
範例
>>> a = np.zeros((40, 40)) >>> a[10:-10, 10:-10] = 1. >>> rng = np.random.default_rng() >>> a += 0.3 * rng.standard_normal(a.shape) >>> denoised_a = denoise_nl_means(a, 7, 5, 0.1)
- skimage.restoration.denoise_tv_bregman(image, weight=5.0, max_num_iter=100, eps=0.001, isotropic=True, *, channel_axis=None)[原始碼]#
使用 split-Bregman 優化執行總變異去噪。
給定 \(f\),一個有雜訊的影像(輸入資料),全變分去噪(也稱為全變分正規化)旨在找到一個總變異小於 \(f\) 的影像 \(u\),前提是 \(u\) 仍然與 \(f\) 相似。這可以用 Rudin–Osher–Fatemi (ROF) 最小化問題表示
\[\min_{u} \sum_{i=0}^{N-1} \left( \left| \nabla{u_i} \right| + \frac{\lambda}{2}(f_i - u_i)^2 \right)\]其中 \(\lambda\) 是一個正參數。此成本函數的第一項是全變分;第二項表示資料保真度。當 \(\lambda \to 0\) 時,全變分項佔主導地位,迫使解具有較小的全變分,但代價是看起來不太像輸入資料。
此程式碼是 Goldstein 和 Osher 的 split Bregman 演算法的實作,用於解決 ROF 問題 ([1], [2], [3])。
- 參數:
- imagendarray
要進行去噪的輸入影像(使用
img_as_float()
轉換)。- weight浮點數,可選
去噪權重。它等於 \(\frac{\lambda}{2}\)。因此,
weight
越小,去噪效果越強(但代價是與image
的相似度越低)。- eps浮點數,可選
停止條件的容差 \(\varepsilon > 0\):當 \(\|u_n - u_{n-1}\|_2 < \varepsilon\) 時,演算法停止。
- max_num_iter整數,可選
用於最佳化的最大迭代次數。
- isotropic布林值,可選
在等向和異向 TV 去噪之間切換。
- channel_axisint 或 None,可選
如果為
None
,則假設影像為灰階(單通道)。否則,此參數指示陣列的哪個軸對應於通道。0.19 版本新增:
channel_axis
已在 0.19 中新增。
- 返回:
- undarray
已降噪的影像。
另請參閱
denoise_tv_chambolle
以 nD 執行總變異去噪。
注意事項
確保為彩色影像適當設定
channel_axis
參數。全變分去噪的原理在 [4] 中說明。它主要是最小化影像的全變分,這可以粗略地描述為影像梯度的範數的積分。全變分去噪往往會產生卡通般的影像,也就是說,分段恆定的影像。
參考文獻
[1]Tom Goldstein 和 Stanley Osher,「用於 L1 正規化問題的 Split Bregman 方法」,https://ww3.math.ucla.edu/camreport/cam08-29.pdf
[2]Pascal Getreuer,「使用 Split Bregman 的 Rudin–Osher–Fatemi 全變分去噪」,2012 年 5 月 19 日於線上影像處理發表,https://www.ipol.im/pub/art/2012/g-tvd/article_lr.pdf
- skimage.restoration.denoise_tv_chambolle(image, weight=0.1, eps=0.0002, max_num_iter=200, *, channel_axis=None)[原始碼]#
以 nD 執行總變異去噪。
給定 \(f\),一個有雜訊的影像(輸入資料),全變分去噪(也稱為全變分正規化)旨在找到一個總變異小於 \(f\) 的影像 \(u\),前提是 \(u\) 仍然與 \(f\) 相似。這可以用 Rudin–Osher–Fatemi (ROF) 最小化問題表示
\[\min_{u} \sum_{i=0}^{N-1} \left( \left| \nabla{u_i} \right| + \frac{\lambda}{2}(f_i - u_i)^2 \right)\]其中 \(\lambda\) 是一個正參數。此成本函數的第一項是全變分;第二項表示資料保真度。當 \(\lambda \to 0\) 時,全變分項佔主導地位,迫使解具有較小的全變分,但代價是看起來不太像輸入資料。
此程式碼是 Chambolle 在 [1] 中提出的演算法的實作,用於解決 ROF 問題。
- 參數:
- imagendarray
要進行去噪的輸入影像。如果其 dtype 不是浮點數,則會使用
img_as_float()
轉換。- weight浮點數,可選
去噪權重。它等於 \(\frac{1}{\lambda}\)。因此,
weight
越大,去噪效果越強(但代價是與image
的保真度越低)。- eps浮點數,可選
停止條件的容差 \(\varepsilon > 0\)(與成本函數 \(E\) 相對差異的絕對值進行比較):當 \(|E_{n-1} - E_n| < \varepsilon * E_0\) 時,演算法停止。
- max_num_iter整數,可選
用於最佳化的最大迭代次數。
- channel_axisint 或 None,可選
如果為
None
,則假設影像為灰階(單通道)。否則,此參數指示陣列的哪個軸對應於通道。0.19 版本新增:
channel_axis
已在 0.19 中新增。
- 返回:
- undarray
已降噪的影像。
另請參閱
denoise_tv_bregman
使用 split-Bregman 優化執行總變異去噪。
注意事項
請確保為彩色影像適當設定
channel_axis
參數。全變分去噪的原理在 [2] 中說明。它主要是最小化影像的全變分,這可以粗略地描述為影像梯度的範數的積分。全變分去噪往往會產生卡通般的影像,也就是說,分段恆定的影像。
參考文獻
[1]A. Chambolle, 一種總變異最小化及其應用的演算法, Journal of Mathematical Imaging and Vision, Springer, 2004, 20, 89-97。
範例
太空人影像的 2D 範例
>>> from skimage import color, data >>> img = color.rgb2gray(data.astronaut())[:50, :50] >>> rng = np.random.default_rng() >>> img += 0.5 * img.std() * rng.standard_normal(img.shape) >>> denoised_img = denoise_tv_chambolle(img, weight=60)
合成資料的 3D 範例
>>> x, y, z = np.ogrid[0:20, 0:20, 0:20] >>> mask = (x - 22)**2 + (y - 20)**2 + (z - 17)**2 < 8**2 >>> mask = mask.astype(float) >>> rng = np.random.default_rng() >>> mask += 0.2 * rng.standard_normal(mask.shape) >>> res = denoise_tv_chambolle(mask, weight=100)
- skimage.restoration.denoise_wavelet(image, sigma=None, wavelet='db1', mode='soft', wavelet_levels=None, convert2ycbcr=False, method='BayesShrink', rescale_sigma=True, *, channel_axis=None)[原始碼]#
對影像執行小波去噪。
- 參數:
- imagendarray (M[, N[, …P]][, C]),整數、無號整數或浮點數
要進行去噪的輸入資料。
image
可以是任何數值類型,但為了計算去噪後的影像,它會被轉換為浮點數的 ndarray。- sigma浮點數或列表,可選
計算小波細節係數閾值時使用的雜訊標準差。當為 None (預設) 時,雜訊標準差會透過 [2] 中的方法估計。
- wavelet字串,可選
要執行的小波類型,可以是
pywt.wavelist
輸出的任何選項。預設值為'db1'
。例如,wavelet
可以是{'db2', 'haar', 'sym9'}
和更多其他選項。- mode{‘soft’, ‘hard’},可選
選擇執行去噪類型的可選參數。值得注意的是,選擇軟閾值處理給定加性雜訊時,可以找到原始影像的最佳近似值。
- wavelet_levels整數或 None,可選
要使用的小波分解級別數。預設值比最大可能分解級別數少三個。
- convert2ycbcr布林值,可選
如果為 True 且已設定 channel_axis,則在 YCbCr 色彩空間而非 RGB 色彩空間中執行小波去噪。這通常會為 RGB 影像帶來更好的效能。
- method{‘BayesShrink’, ‘VisuShrink’},可選
要使用的閾值處理方法。目前支援的方法有 “BayesShrink” [1] 和 “VisuShrink” [2]。預設值為 “BayesShrink”。
- rescale_sigma布林值,可選
如果為 False,則不會執行使用者提供的
sigma
的重新縮放。預設值為True
,如果影像在內部重新縮放,則會適當地重新縮放 sigma。在版本 0.16 中新增:
rescale_sigma
在 0.16 中引入- channel_axisint 或 None,可選
如果為
None
,則假設影像為灰階(單通道)。否則,此參數指示陣列的哪個軸對應於通道。0.19 版本新增:
channel_axis
已在 0.19 中新增。
- 返回:
- outndarray
已降噪的影像。
注意事項
小波域是影像的稀疏表示,可以認為類似於傅立葉轉換的頻域。稀疏表示的大部分值為零或接近零,而真正的隨機雜訊(通常)以小波域中的許多小值表示。將低於某個閾值的所有值設定為 0 可減少影像中的雜訊,但較大的閾值也會減少影像中存在的細節。
如果輸入為 3D,此函數會分別在每個色彩平面上執行小波去噪。
在版本 0.16 中變更:對於浮點數輸入,會保留原始輸入範圍,並且不會對輸出應用剪裁。其他輸入類型將根據輸入影像範圍轉換為 [-1, 1] 或 [0, 1] 範圍內的浮點數值。除非
rescale_sigma = False
,否則對image
應用的任何內部重新縮放也會應用於sigma
,以維持相同的相對幅度。已提出許多小波係數閾值處理方法。預設情況下,
denoise_wavelet
會應用 BayesShrink,這是一種自適應閾值處理方法,它會為每個小波子頻帶計算單獨的閾值,如 [1] 中所述。如果
method == "VisuShrink"
,則會對所有小波細節係數應用單一的「通用閾值」,如 [2] 中所述。此閾值旨在以高機率消除給定sigma
的所有高斯雜訊,但往往會產生看起來過於平滑的影像。雖然可以從
PyWavelets
中選擇任何小波,但閾值處理方法假設正交小波轉換,並且可能不會為雙正交小波選擇適當的閾值。正交小波是理想的,因為輸入中的白雜訊在子頻帶中保持為白雜訊。雙正交小波會導致子頻帶中出現彩色雜訊。此外,PyWavelets 中的正交小波是正交正規的,因此子頻帶中的雜訊變異數與輸入的雜訊變異數相同。正交小波的範例包括 Daubechies(例如 'db2')或 symmlet(例如 'sym2')系列。參考文獻
[1] (1,2)Chang, S. Grace、Bin Yu 和 Martin Vetterli。“用於影像去噪和壓縮的自適應小波閾值處理。” Image Processing, IEEE Transactions of 9.9 (2000): 1532-1546. DOI:10.1109/83.862633
[2] (1,2,3)D. L. Donoho 和 I. M. Johnstone。“小波收縮的理想空間自適應。” Biometrika 81.3 (1994): 425-455. DOI:10.1093/biomet/81.3.425
範例
>>> from skimage import color, data >>> img = img_as_float(data.astronaut()) >>> img = color.rgb2gray(img) >>> rng = np.random.default_rng() >>> img += 0.1 * rng.standard_normal(img.shape) >>> img = np.clip(img, 0, 1) >>> denoised_img = denoise_wavelet(img, sigma=0.1, rescale_sigma=True)
- skimage.restoration.ellipsoid_kernel(shape, intensity)[原始碼]#
為 restoration.rolling_ball 建立橢圓形核心。
- 參數:
- shape類陣列
橢圓主軸的長度(不包括強度軸)。核心需要與將應用於它的影像具有相同的維度。
- intensity整數
橢圓強度軸的長度。
- 返回:
- kernelndarray
包含橢圓體上半部分表面強度的核心。
另請參閱
- skimage.restoration.estimate_sigma(image, average_sigmas=False, *, channel_axis=None)[原始碼]#
(高斯)雜訊標準差的穩健小波式估計器。
- 參數:
- imagendarray
用於估計雜訊標準差的影像。
- average_sigmas布林值,可選
如果為 True,則平均
sigma
的通道估計值。否則,會傳回對應於每個通道的 sigma 列表。- channel_axisint 或 None,可選
如果為
None
,則假設影像為灰階(單通道)。否則,此參數指示陣列的哪個軸對應於通道。0.19 版本新增:
channel_axis
已在 0.19 中新增。
- 返回:
- sigma浮點數或列表
估計的雜訊標準差。如果
multichannel
為 True 且average_sigmas
為 False,則會傳回每個通道的單獨雜訊估計值。否則,會傳回個別通道估計值的平均值。
注意事項
此函數假設雜訊符合高斯分佈。估計演算法基於小波細節係數的中位數絕對偏差,如 [1] 的 4.2 節中所述。
參考文獻
[1]D. L. Donoho 和 I. M. Johnstone。“小波收縮的理想空間自適應。” Biometrika 81.3 (1994): 425-455. DOI:10.1093/biomet/81.3.425
範例
>>> import skimage.data >>> from skimage import img_as_float >>> img = img_as_float(skimage.data.camera()) >>> sigma = 0.1 >>> rng = np.random.default_rng() >>> img = img + sigma * rng.standard_normal(img.shape) >>> sigma_hat = estimate_sigma(img, channel_axis=None)
- skimage.restoration.inpaint_biharmonic(image, mask, *, split_into_regions=False, channel_axis=None)[原始碼]#
使用雙調和方程式修補影像中遮罩的點。
- 參數:
- image(M[, N[, …, P]][, C]) ndarray
輸入影像。
- mask(M[, N[, …, P]]) ndarray
要修復的像素陣列。必須與其中一個「影像」通道具有相同的形狀。未知像素必須以 1 表示,已知像素以 0 表示。
- split_into_regions布林值,可選
如果為 True,則會逐區域執行修復。這可能會比較慢,但會減少記憶體需求。
- channel_axisint 或 None,可選
如果為 None,則假設影像為灰階(單通道)影像。否則,此參數會指出陣列的哪個軸對應於通道。
0.19 版本新增:
channel_axis
已在 0.19 中新增。
- 返回:
- out(M[, N[, …, P]][, C]) ndarray
已修復遮罩像素的輸入影像。
參考文獻
[1]S.B.Damelin 和 N.S.Hoang。“關於雙調和函數的表面完成和影像修復:數值方面”,International Journal of Mathematics and Mathematical Sciences, Vol. 2018, Article ID 3950312 DOI:10.1155/2018/3950312
[2]C. K. Chui 和 H. N. Mhaskar,流形上平滑函數的 MRA 環境復原擴展,Appl. and Comp. Harmonic Anal., 28 (2010), 104-113, DOI:10.1016/j.acha.2009.04.004
範例
>>> img = np.tile(np.square(np.linspace(0, 1, 5)), (5, 1)) >>> mask = np.zeros_like(img) >>> mask[2, 2:] = 1 >>> mask[1, 3:] = 1 >>> mask[0, 4:] = 1 >>> out = inpaint_biharmonic(img, mask)
- skimage.restoration.richardson_lucy(image, psf, num_iter=50, clip=True, filter_epsilon=None)[原始碼]#
Richardson-Lucy 反摺積。
- 參數:
- image([P, ]M, N) ndarray
輸入退化的影像(可以是 n 維的)。如果您保持預設的
clip=True
參數,您可能會想要將影像正規化,使其值落在 [-1, 1] 區間,以避免資訊遺失。- psfndarray
點擴散函數。
- num_iterint,可選
迭代次數。此參數扮演正規化的角色。
- clipboolean,可選
預設為 True。如果為 true,則結果中高於 1 或低於 -1 的像素值會被閾值化,以符合 skimage 管道的相容性。
- filter_epsilon:float,可選
中間結果低於此值會變為 0,以避免除以小數字。
- 返回:
- im_deconvndarray
反褶積後的影像。
參考文獻
範例
>>> from skimage import img_as_float, data, restoration >>> camera = img_as_float(data.camera()) >>> from scipy.signal import convolve2d >>> psf = np.ones((5, 5)) / 25 >>> camera = convolve2d(camera, psf, 'same') >>> rng = np.random.default_rng() >>> camera += 0.1 * camera.std() * rng.standard_normal(camera.shape) >>> deconvolved = restoration.richardson_lucy(camera, psf, 5)
- skimage.restoration.rolling_ball(image, *, radius=100, kernel=None, nansafe=False, num_threads=None)[原始碼]#
透過滾動/平移核心來估計背景強度。
此滾球演算法估計在曝光不均勻的情況下 ndimage 的背景強度。它是經常使用的滾球演算法的概括 [1]。
- 參數:
- imagendarray
要過濾的影像。
- radiusint,可選
在影像中滾動/平移的球形核心的半徑。如果
kernel = None
則使用此值。- kernelndarray,可選
在影像中滾動/平移的核心。它必須具有與
image
相同的維度數。核心會填入該位置的核心強度。- nansafe:bool,可選
如果
False
(預設),則假設image
中的值都不是np.nan
,並使用更快的實作。- num_threads:int,可選
要使用的最大執行緒數。如果
None
,則使用 OpenMP 預設值;通常等於虛擬核心的最大數量。注意:這是執行緒數量的上限。確切的數量由系統的 OpenMP 函式庫決定。
- 返回:
- backgroundndarray
影像的估計背景。
注意事項
對於估計其背景強度的像素(不失一般性,在
center
),滾球方法將kernel
定位於其下方,並升高核心,直到表面在某個pos=(y,x)
處接觸影像本影。然後使用該位置的影像強度 (image[pos]
) 加上kernel[center] - kernel[pos]
的差異來估計背景強度。此演算法假設深色像素對應於背景。如果您有明亮的背景,請在將影像傳遞給函式之前反轉影像,例如,使用
utils.invert
。有關詳細資訊,請參閱圖庫範例。此演算法對雜訊敏感(尤其是椒鹽雜訊)。如果這在您的影像中是一個問題,您可以在將影像傳遞給此函式之前應用輕微的高斯平滑。
此演算法的複雜度是半徑的多項式,其次數等於影像維度(2D 影像為 N^2,3D 影像為 N^3 等),因此當半徑超過 30 左右時,可能需要很長時間 ([2], [3])。它是一個精確的 N 維計算;如果您只需要近似值,則可以考慮更快的方法,例如頂帽過濾 [4] 或縮小再放大,以減少處理的輸入大小。
參考文獻
[1]Sternberg, Stanley R. “Biomedical image processing.” Computer 1 (1983): 22-34. DOI:10.1109/MC.1983.1654163
範例
>>> import numpy as np >>> from skimage import data >>> from skimage.restoration import rolling_ball >>> image = data.coins() >>> background = rolling_ball(data.coins()) >>> filtered_image = image - background
>>> import numpy as np >>> from skimage import data >>> from skimage.restoration import rolling_ball, ellipsoid_kernel >>> image = data.coins() >>> kernel = ellipsoid_kernel((101, 101), 75) >>> background = rolling_ball(data.coins(), kernel=kernel) >>> filtered_image = image - background
- skimage.restoration.unsupervised_wiener(image, psf, reg=None, user_params=None, is_real=True, clip=True, *, rng=None)[原始碼]#
無監督的維納-杭特反摺積。
使用 Wiener-Hunt 方法返回反褶積,其中超參數會自動估計。該演算法是以下參考文獻中描述的隨機迭代過程(Gibbs 取樣器)。另請參閱
wiener
函式。- 參數:
- image(M, N) ndarray
輸入的退化影像。
- psfndarray
脈衝響應(輸入影像的空間)或傳遞函數(傅立葉空間)。兩者都接受。傳遞函數會自動識別為複數 (
np.iscomplexobj(psf)
)。- regndarray,可選
正規化運算子。預設為拉普拉斯算子。它可以是脈衝響應或傳遞函數,如 psf。
- user_paramsdict,可選
Gibbs 取樣器的參數字典。請參閱下文。
- clipboolean,可選
預設為 True。如果為 true,則結果中高於 1 或低於 -1 的像素值會被閾值化,以符合 skimage 管道的相容性。
- rng{
numpy.random.Generator
, int}, 可選 偽隨機數產生器。預設情況下,會使用 PCG64 產生器(請參閱
numpy.random.default_rng()
)。如果rng
是 int,則會用它來設定產生器的種子。在 0.19 版本中新增。
- 返回:
- x_postmean(M, N) ndarray
反褶積後的影像(後驗平均值)。
- chainsdict
鍵
noise
和prior
分別包含雜訊和先驗精度的鏈表。
- 其他參數:
- ``user_params`` 的鍵是
- thresholdfloat
停止條件:兩個連續近似解(物件樣本的經驗平均值,請參閱註釋部分)之間差異的範數。預設為 1e-4。
- burninint
要忽略的樣本數量,以開始計算平均值。預設為 15。
- min_num_iterint
最小迭代次數。預設為 30。
- max_num_iterint
如果
threshold
不滿足,則最大迭代次數。預設為 200。- callback可呼叫物件(預設為 None)
使用者提供的可呼叫物件,如果函式存在,則會將目前影像樣本傳遞給該物件,以供任何用途。使用者可以儲存樣本,或計算平均值以外的其他時刻。它對演算法執行沒有影響,僅用於檢查。
注意事項
估計的影像設計為機率定律的後驗平均值(來自貝葉斯分析)。平均值定義為所有可能影像的總和,並根據其各自的機率加權。考慮到問題的大小,精確的總和是難以處理的。此演算法使用 MCMC 在後驗定律下繪製影像。實際的想法是僅繪製高度可能的影像,因為它們對平均值的貢獻最大。相反地,不太可能的影像會較少繪製,因為它們的貢獻很小。最後,這些樣本的經驗平均值給我們提供了平均值的估計,以及具有無限樣本集的精確計算。
參考文獻
[1]François Orieux, Jean-François Giovannelli, and Thomas Rodet, “Bayesian estimation of regularization and point spread function parameters for Wiener-Hunt deconvolution”, J. Opt. Soc. Am. A 27, 1593-1607 (2010)
https://www.osapublishing.org/josaa/abstract.cfm?URI=josaa-27-7-1593
範例
>>> from skimage import color, data, restoration >>> img = color.rgb2gray(data.astronaut()) >>> from scipy.signal import convolve2d >>> psf = np.ones((5, 5)) / 25 >>> img = convolve2d(img, psf, 'same') >>> rng = np.random.default_rng() >>> img += 0.1 * img.std() * rng.standard_normal(img.shape) >>> deconvolved_img = restoration.unsupervised_wiener(img, psf)
- skimage.restoration.unwrap_phase(image, wrap_around=False, rng=None)[原始碼]#
從包裹的相位影像中恢復原始影像。
從包裝在 [-pi, pi) 區間內的影像中,恢復原始的、未包裝的影像。
- 參數:
- image(M[, N[, P]]) ndarray 或浮點數的遮罩陣列
數值應在 [-pi, pi) 的範圍內。如果提供遮罩陣列,則會保持遮罩項目的值不變,且其數值不會用於引導相鄰未遮罩數值的展開。不允許使用遮罩的一維陣列,否則會引發
ValueError
。- wrap_around布林值或布林值序列,選用
當序列中的元素為
True
時,展開過程會將影像對應軸的邊緣視為相連,並使用此連通性來引導相位展開過程。如果僅給定單一布林值,則會應用於所有軸。一維陣列不支援環繞。- rng{
numpy.random.Generator
, int}, 可選 偽隨機數產生器。預設情況下,會使用 PCG64 產生器(請參閱
numpy.random.default_rng()
)。如果rng
是 int,則會用它來設定產生器的種子。展開依賴於隨機初始化。這會設定 PRNG 以實現確定性的行為。
- 返回:
- image_unwrapped類陣列,雙精度
與輸入形狀相同的展開影像。如果輸入
image
是遮罩陣列,則會保留遮罩。
- 引發:
- ValueError
如果使用遮罩的一維陣列呼叫,或使用一維陣列且
wrap_around=True
呼叫。
參考文獻
[1]Miguel Arevallilo Herraez, David R. Burton, Michael J. Lalor, and Munther A. Gdeisat, “Fast two-dimensional phase-unwrapping algorithm based on sorting by reliability following a noncontinuous path”, Journal Applied Optics, Vol. 41, No. 35 (2002) 7437,
[2]Abdul-Rahman, H., Gdeisat, M., Burton, D., & Lalor, M., “Fast three-dimensional phase-unwrapping algorithm based on sorting by reliability following a non-continuous path. In W. Osten, C. Gorecki, & E. L. Novak (Eds.), Optical Metrology (2005) 32–40, International Society for Optics and Photonics.
範例
>>> c0, c1 = np.ogrid[-1:1:128j, -1:1:128j] >>> image = 12 * np.pi * np.exp(-(c0**2 + c1**2)) >>> image_wrapped = np.angle(np.exp(1j * image)) >>> image_unwrapped = unwrap_phase(image_wrapped) >>> np.std(image_unwrapped - image) < 1e-6 # A constant offset is normal True
- skimage.restoration.wiener(image, psf, balance, reg=None, is_real=True, clip=True)[原始碼]#
維納-杭特反摺積
使用維納-杭特方法(即使用傅立葉對角化)返回反卷積。
- 參數:
- imagendarray
輸入降級影像(可以是 n 維)。
- psfndarray
點擴散函數。如果資料類型是實數,則假設這是脈衝響應(輸入影像空間);如果資料類型是複數,則假設這是傳遞函數(傅立葉空間)。脈衝響應的形狀沒有限制。如果
is_real 為 True
,則傳遞函數的形狀必須為(N1, N2, ..., ND)
,否則必須為(N1, N2, ..., ND // 2 + 1)
(請參閱np.fft.rfftn
)。- balance浮點數
正規化參數值,用於調整提高頻率恢復的資料充分性與降低頻率恢復(以避免雜訊假影)的先驗充分性之間的平衡。
- regndarray,可選
正規化運算子。預設為拉普拉斯運算子。它可以是脈衝響應或傳遞函數,與 psf 相同。形狀限制與
psf
參數相同。- is_real布林值,選用
預設為 True。指定是否以 Hermitian 假設提供
psf
和reg
,也就是說,由於實數訊號的傅立葉轉換的冗餘,僅提供頻率平面的一半。僅當以傳遞函數的形式提供psf
和/或reg
時才適用。有關 Hermitian 屬性,請參閱uft
模組或np.fft.rfftn
。- clipboolean,可選
預設為 True。如果為 True,則會將高於 1 或低於 -1 的結果像素值進行閾值處理,以確保與 skimage 管道相容。
- 返回:
- im_deconv(M, N) ndarray
反褶積後的影像。
注意事項
此函數將維納濾波器應用於受脈衝響應(或 PSF)降級的雜訊影像。如果資料模型為
\[y = Hx + n\]其中 \(n\) 是雜訊,\(H\) 是 PSF,而 \(x\) 是未知的原始影像,則維納濾波器為
\[\hat x = F^\dagger \left( |\Lambda_H|^2 + \lambda |\Lambda_D|^2 \right)^{-1} \Lambda_H^\dagger F y\]其中 \(F\) 和 \(F^\dagger\) 分別是傅立葉變換和反傅立葉變換,\(\Lambda_H\) 是傳遞函數(或 PSF 的傅立葉變換,請參閱下面的 [Hunt]),而 \(\Lambda_D\) 是用於懲罰還原影像頻率的濾波器(預設為拉普拉斯算子,即懲罰高頻)。參數 \(\lambda\) 調整資料(傾向於增加高頻,即使是來自雜訊的頻率)和正規化之間的平衡。
這些方法然後特定於先驗模型。因此,應用或真實影像性質必須與先驗模型對應。預設情況下,先驗模型(拉普拉斯算子)引入影像平滑或像素相關性。它也可以解釋為高頻懲罰,以補償解決方案相對於資料的不穩定性(有時稱為雜訊放大或「爆炸性」解決方案)。
最後,傅立葉空間的使用意味著 \(H\) 的循環屬性,請參閱 [2]。
參考文獻
[1]François Orieux, Jean-François Giovannelli, and Thomas Rodet, “Bayesian estimation of regularization and point spread function parameters for Wiener-Hunt deconvolution”, J. Opt. Soc. Am. A 27, 1593-1607 (2010)
https://www.osapublishing.org/josaa/abstract.cfm?URI=josaa-27-7-1593
[2]B. R. Hunt “A matrix theory proof of the discrete convolution theorem”, IEEE Trans. on Audio and Electroacoustics, vol. au-19, no. 4, pp. 285-288, dec. 1971
範例
>>> from skimage import color, data, restoration >>> img = color.rgb2gray(data.astronaut()) >>> from scipy.signal import convolve2d >>> psf = np.ones((5, 5)) / 25 >>> img = convolve2d(img, psf, 'same') >>> rng = np.random.default_rng() >>> img += 0.1 * img.std() * rng.standard_normal(img.shape) >>> deconvolved_img = restoration.wiener(img, psf, 0.1)