Python ValueError:卷积2D输入必须是两个2D数组
我正在制作一个程序,它接收视频,将视频分割成一系列图像,对图像应用一个清洁过滤器(去噪/去模糊/等等),然后将其重新组合成视频 我想在图像上使用Scikit Image的“无监督的维纳”(Unsupervised_wiener)恢复来消除模糊,但我没能得到它,我也不明白其中的原因 这是我从文档中复制的: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
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
)提示您可能未正确执行此步骤。运行过滤器时是否可以维护彩色图像?对于这个项目,保持输出的颜色是很重要的。(感谢您的帮助,非常感谢。)这是正确的,但即使使用您建议的行,它仍然会抛出一个错误。再次感谢你的帮助,你是冠军。