我正在开发一个程序,它接收视频,将视频分割为一系列图像,对图像应用清洁滤镜(降噪/去模糊等),然后将其放回视频中。
我想在图像上使用Scikit Image的“ Unsupervised_wiener”还原来对图像进行模糊处理,但是我无法获得它,并且我不了解documentation。
这就是我从文档中复制的内容:
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)
其中“框架”是输入中的框架,我是用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),框架形状为(1080,1920,3)
答案 0 :(得分:0)
您的输入帧是RGB,但是convolve2d
和unsupervised_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
中,并且假定输入和输出是numpy浮点数组,其值在[0,1]范围内。