在opencv中使用4D内核进行图像卷积

时间:2018-09-21 17:50:21

标签: python image opencv filter convolution

给出图像,我正在尝试对(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。 width,ksize.height))在函数normalizeAnchor中

实际上在文档中说:

  

内核 –卷积内核(或更确切地说,是一个相关内核),一个单通道浮点矩阵;如果要将不同的内核应用于不同的通道,请使用split()将图像拆分为单独的色彩平面,然后分别进行处理。

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

2 个答案:

答案 0 :(得分:2)

OpenCV中没有这样的功能-在任何接口或核心C ++库本身中都没有。如果要进行4D卷积,则必须使用linkToDeath()循环遍历4D内核的2D子矩阵,自己手动编写,或使用其他支持它的东西,例如深度学习包或SciPy

我建议您最简单的解决方案,而无需您自己写一个或一个一个地对自己进行攻击,是使用SciPy的cv2.filter2D来执行N维卷积:https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve.html。请记住,图像和内核都必须具有相同数量的尺寸,因此,您的图像也应该是4D。

答案 1 :(得分:0)

顾名思义,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()

上的文档
相关问题