【问题标题】:Image convolution with a 4D Kernel in opencv在 opencv 中使用 4D 内核进行图像卷积
【发布时间】:2019-02-26 03:55:08
【问题描述】:

给定一张图片,我正在尝试使用 (3 x 3 x 3 x 64) 内核进行卷积:

cv2.filter2D(img, -1, np.random.rand(3,3,3,64))

给予:

错误:/Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/filterengine.hpp:363:错误:(-215) anchor.inside(Rect(0, 0, ksize.函数 normalizeAnchor 中的宽度,ksize.height))

实际上在文档中它说:

kernel – 卷积核(或者更确切地说是相关核),一个单通道浮点矩阵;如果您想将不同的内核应用于不同的通道,请使用 split() 将图像拆分为单独的颜色平面并单独处理。

还有其他可以卷积 > 2D 内核的 opencv 函数吗?还是我必须做两个应用 filter2d 的 for 循环?

【问题讨论】:

    标签: python image opencv filter convolution


    【解决方案1】:

    OpenCV 函数 cv2.filter2D(),顾名思义,假设一个 2D img 和一个 2D 内核。除此之外,您还必须使用循环。例如,以下运行没有错误,

    import cv2
    import numpy as np
    
    # read an rgb image
    img = cv2.imread('fig1.png')
    
    # filter the first channel (blue)
    out0 = cv2.filter2D( img[:,:,0], -1, np.random.rand(3,3))
    

    请参阅cv2.filter2D() 的文档

    【讨论】:

    • 是的,我现在就是这样做的,想知道是否还有其他功能可以进行 4D,但猜测没有。
    • 在传统 CPU 上,它不会提供任何真正的优势。循环迭代每个通道发生一次,因此相对便宜。并且,无论是发生在函数内部还是函数外部,都会产生相同的成本。但是,在大型并行处理器上,c.f. GPU,在便利性和速度方面可能有一些显着的优势。我怀疑您需要展开外部循环才能做到这一点,因此可能会付出一些努力来为任意数量的维度制作干净的 API。也许该 API 已经存在于某个 GPU 库中。
    • 知道了。这将在传统的 CPU 上运行,所以我想我会没事的。感谢@DrM 的帮助
    • 好的,如果它看起来正确,请不要忘记接受和/或投票。
    【解决方案2】:

    OpenCV 中没有这样的功能——在任何接口和核心 C++ 库本身中都没有。如果你想做 4D 卷积,你要么必须使用 cv2.filter2D 循环 4D 内核的 2D 子矩阵,自己手动编写,或者使用其他支持它的东西,比如深度学习包或 SciPy。

    我可以建议的最简单的解决方案是使用 SciPy 的 scipy.signal.convolve 执行 N 维卷积:https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve.html,而无需您自己编写或破解。请记住,图像和内核都需要具有相同的维数,因此您的图像也应该是 4D。

    【讨论】:

    • 非常感谢您提供的信息!使用scipy.signal.convolvenp.expand_dims 可能是可行的方法,感谢它。
    • @Kiran 不用担心。很高兴我能帮助你。如果您提供有关您的实际图像的更多信息,我可以为您编写一些代码来演示如何做到这一点......但是当然,如​​果您想自己发现这一点,绝对欢迎您这样做所以。祝你好运!
    • 我成功了!我必须弄清楚 filter2D 做了“相同”的卷积,但有底部/右侧填充。此外,它们以“反射”模式填充,而不是恒定的 0,这对我的用例来说不是很好,但现在有一些 numpy 逻辑都很好。感谢@rayryeng 的帮助!
    • 啊!我知道了。是的,不幸的是您无法指定填充类型。无论哪种方式,很高兴你让它工作!
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多