我一直在使用skimage软件包中提供的Richardson-Lucy反卷积功能。有一个示例代码使我能够对图像进行噪点和去噪。
我想对模糊图像进行反卷积,知道内核(psf)。为了构造模糊的图像,我将原始图像与psf进行了卷积,然后在图像强度上添加了小高斯噪声。
这里的问题是,尽管我能够获得图像(deconvolved_RL),但无法正确规范像素强度。使用plt.imshow,我可以设置vmin和vmax,但是我无法模拟这种行为。我一直在获得较浅的图像。 (如示例图片所示)
我无法破译imshow文档中用于vmin / vmax的公式。在这里,我对强度进行了线性归一化处理,首先是将解卷积数组归一化为[0,1],然后将其缩放为[min(blurred_array),max(blurred_array)],这导致了问题。
奇怪的是,如果我将restore.richardson_lucy上的clip标记设置为False(默认值为True),则自缩放图像与imshow缩放的图像相同。
-
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import convolve2d as conv2
from skimage import color, data, restoration
astro = color.rgb2gray(data.astronaut())
psf = np.ones((5, 5)) / 25
astro = conv2(astro, psf, 'same')
# Add Noise to Image
astro_noisy = astro.copy()
astro_noisy += np.abs(((1/(0.1*np.sqrt(2 * np.pi))) * np.random.normal(0,0.1)))
# Restore Image using Richardson-Lucy algorithm
deconvolved_RL = restoration.richardson_lucy(astro_noisy, psf, iterations=100,clip=True)
deconvolved_RL_1 = np.copy(deconvolved_RL)
#deconvolved_RL_1 = np.clip(deconvolved_RL_1, astro_noisy.min(), astro_noisy.max())
deconvolved_RL_1 = ((deconvolved_RL_1 - deconvolved_RL_1.min())/(deconvolved_RL_1.max() - deconvolved_RL_1.min()) * (astro_noisy.max() - astro_noisy.min())) + astro_noisy.min()
fig, ax = plt.subplots(nrows=1, ncols=4, figsize=(8, 5))
plt.gray()
for a in (ax[0], ax[1], ax[2], ax[3]):
a.axis('off')
ax[0].imshow(color.rgb2gray(data.astronaut()))
ax[0].set_title('Original Data')
ax[1].imshow(astro_noisy)
ax[1].set_title('Blurred data')
ax[2].imshow(deconvolved_RL, vmin=astro_noisy.min(), vmax=astro_noisy.max())
ax[2].set_title('Restoration using\nRichardson-Lucy')
ax[3].imshow(deconvolved_RL_1)
ax[3].set_title('Restoration using\nRichardson-Lucy self')
fig.subplots_adjust(wspace=0.02, hspace=0.2,
top=0.9, bottom=0.05, left=0, right=1)
plt.show()
(相比于plt.imshow上使用vmin / vmax缩放的图像,最右边的图像是通过自我缩放的图像更亮)