【问题标题】:signal.medfilt2d is getting ValueError: object too deep for desired arraysignal.medfilt2d 得到 ValueError: object too deep for required array
【发布时间】:2020-07-19 08:40:20
【问题描述】:

我正在尝试根据此代码获取嘈杂图像的背景https://www.kaggle.com/rdokov/background-removal

但是,我得到了 ValueError。如何解决?

import glob
import cv2
from scipy import signal
import numpy as np
a = cv2.imread(glob.glob('lp_train/*.jpg')[0])
import matplotlib.pyplot as plt
a2 = np.asarray(a)/255.
aa = signal.medfilt2d(a2, 11)
plt.imshow(aa)
plt.show()

错误:ValueError:对象对于所需数组而言太深

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    .jpg 有 3 个通道,因此您发送的是 3 维数组,但 medfilt2d 接受 2 维数组。

    有两种方法可以解决这个问题。

    1. 只读取灰度图像
    import glob
    import cv2
    from scipy import signal
    import numpy as np
    a = cv2.imread(glob.glob('lp_train/*.jpg')[0], 0)  # grayscale, single channel
    import matplotlib.pyplot as plt
    a2 = np.asarray(a)/255.
    aa = signal.medfilt2d(a2, 11)
    plt.imshow(aa)
    plt.show()
    
    1. 采用特定通道 (R/G/B)
    import glob
    import cv2
    from scipy import signal
    import numpy as np
    a = cv2.imread(glob.glob('lp_train/*.jpg')[0])
    import matplotlib.pyplot as plt
    a2 = np.asarray(a)/255.
    aa = signal.medfilt2d(a2[:,:,0], 11) # a specific channel
    plt.imshow(aa)
    plt.show()
    

    两者都应该工作。

    【讨论】:

    • 是的,它现在可以工作了吗?但是,我怎样才能获得所有频道?
    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2022-01-18
    • 2014-09-21
    • 2017-08-06
    相关资源
    最近更新 更多