Python ValueError:卷积2D输入必须是两个2D数组

Python ValueError:卷积2D输入必须是两个2D数组,python,scikit-image,Python,Scikit Image,我正在制作一个程序,它接收视频,将视频分割成一系列图像,对图像应用一个清洁过滤器(去噪/去模糊/等等),然后将其重新组合成视频 我想在图像上使用Scikit Image的“无监督的维纳”(Unsupervised_wiener)恢复来消除模糊,但我没能得到它,我也不明白其中的原因 这是我从文档中复制的: frame = color.rgb2gray frame = convolve2d(frame, psf, 'same') frame += 0.1 * frame.std() * np.ran

我正在制作一个程序,它接收视频,将视频分割成一系列图像,对图像应用一个清洁过滤器(去噪/去模糊/等等),然后将其重新组合成视频

我想在图像上使用Scikit Image的“无监督的维纳”(Unsupervised_wiener)恢复来消除模糊,但我没能得到它,我也不明白其中的原因

这是我从文档中复制的:

frame = color.rgb2gray
frame = convolve2d(frame, psf, 'same')
frame += 0.1 * frame.std() * np.random.standard_normal(frame.shape)
fixed = skimage.restoration.unsupervised_wiener(frame, psf)
其中“frame”是来自输入的帧,我用OpenCV2捕捉到:

ret, frame = vid.read()
但我得到了以下错误:

Traceback (most recent call last):
line 1025, in convolve2d
ValueError: convolve2d inputs must both be 2D arrays
如何将输入帧转换为2D数组,以便Scikit Image可以处理它们

任何帮助都会很好,或者如果有更好的方法我可以使用,我也愿意接受。谢谢


编辑:pst形状是:(5,5),帧形状是:(10801920,3)

您的输入帧是RGB,但是
卷积2D
无监督的_wiener
期望2D(灰度)数组

您可以通过将运算符分别应用于每个通道来解决此问题

以下是执行每个通道操作的原始代码的固定版本:

# convolve each channel with the kernel
for i in range(frame.shape[-1]):
    frame[:,:,i] = convolve2d(frame[:,:,i], psf, mode="same")

# add gaussian noise
frame += 0.1 * frame.std() * np.random.standard_normal(frame.shape)

# wiener deconvolution
fixed = np.zeros(frame.shape)
for i in range(frame.shape[-1]):
    fixed[:,:,i], _ = restoration.unsupervised_wiener(frame[:,:,i], psf)

结果存储在
fixed
中,输入和输出被假定为数值在[0,1]范围内的numpy浮点数组。

什么是
frame.shape
psf.shape
?psf是(5,5),frame是(108011920,3)。源视频是1920x1080视频。明白了。这意味着您的帧仍然是RGB,而不是灰度(对于灰度1080p图像,形状应该是(108011920))。你能在卷积之前试试
frame=skimage.color.rgb2gray(frame)
?OP(
frame=color.rgb2gray
)提示您可能未正确执行此步骤。运行过滤器时是否可以维护彩色图像?对于这个项目,保持输出的颜色是很重要的。(感谢您的帮助,非常感谢。)这是正确的,但即使使用您建议的行,它仍然会抛出一个错误。再次感谢你的帮助,你是冠军。